@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
package/dist/route.js CHANGED
@@ -12,13 +12,78 @@ import { pathToFileURL } from "node:url";
12
12
  import { MextBuildError } from "./errors.js";
13
13
  import { isSegment } from "./ids.js";
14
14
  import { assertResourceUri } from "./invoke.js";
15
- import { MCP_PATH } from "./mcp/constants.js";
15
+ import { MAX_BODY_BYTES, MCP_PATH } from "./mcp/constants.js";
16
16
  /**
17
17
  * Routes (§12.4): MCP 엔드포인트 밖 HTTP 경로. routes/**\/*.ts 파일 경로 = URL 경로.
18
- * HTTP (dev · start · server.js · handler.js) 전용. stdio · CLI 없음. Origin 검사 · auth 대상 아님.
18
+ * HTTP (dev · start · server.js · handler.js) 전용. stdio · CLI 없음.
19
+ * Origin 검사 · auth = 기본 없음. 모듈의 export origin · auth 로 route 마다 켠다 (설정 routes = 모든 route 의 기본값, export 가 덮어씀).
19
20
  * Registry 와 별개 집합 (D1): 명령어 계약 (help · tools · manifestHash) 과 공유하는 것이 없다
20
21
  */
21
22
  export const ROUTE_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
23
+ /** export auth · origin · maxBodyBytes 의 형식 문제. 없으면 undefined */
24
+ export function routeOptionsProblem(mod) {
25
+ if (mod.auth !== undefined && typeof mod.auth !== "boolean" && mod.auth !== "optional") {
26
+ return 'export auth must be true, false or "optional"';
27
+ }
28
+ if (mod.origin !== undefined && typeof mod.origin !== "boolean")
29
+ return "export origin must be a boolean";
30
+ const max = mod.maxBodyBytes;
31
+ if (max !== undefined && typeof max !== "boolean" && !(typeof max === "number" && Number.isSafeInteger(max) && max > 0)) {
32
+ return "export maxBodyBytes must be a positive integer (bytes) or a boolean";
33
+ }
34
+ return undefined;
35
+ }
36
+ /** 적용 값: export (undefined 가 아니면, false 포함) > 설정 기본값 (routes) > 없음. 키별 독립 */
37
+ export function resolveRouteOptions(mod, defaults) {
38
+ const out = {};
39
+ const auth = mod.auth ?? defaults?.auth;
40
+ const origin = mod.origin ?? defaults?.origin;
41
+ const maxBodyBytes = mod.maxBodyBytes ?? defaults?.maxBodyBytes;
42
+ if (auth !== undefined)
43
+ out.auth = auth;
44
+ if (origin !== undefined)
45
+ out.origin = origin;
46
+ if (maxBodyBytes !== undefined)
47
+ out.maxBodyBytes = maxBodyBytes;
48
+ return out;
49
+ }
50
+ /** route 본문 상한 초과 응답 (specs/http.md REQUEST_REJECTED too_large 와 같은 모양) */
51
+ function tooLarge(limit) {
52
+ const error = { code: "REQUEST_REJECTED", message: "Request body too large.", reason: "too_large", limit };
53
+ return new Response(JSON.stringify({ error }), { status: 413, headers: { "Content-Type": "application/json" } });
54
+ }
55
+ /**
56
+ * 본문을 limit 바이트로 제한한 Request. Content-Length 초과 = "too-large" (본문을 읽지 않는다).
57
+ * 스트림이 넘으면 본문 읽기가 실패하고 exceeded() = true
58
+ */
59
+ function limitBody(request, limit) {
60
+ const declared = Number(request.headers.get("content-length") ?? "");
61
+ if (Number.isFinite(declared) && declared > limit)
62
+ return "too-large";
63
+ if (request.body === null)
64
+ return { request, exceeded: () => false };
65
+ let size = 0;
66
+ let over = false;
67
+ const counted = request.body.pipeThrough(new TransformStream({
68
+ transform(chunk, controller) {
69
+ size += chunk.byteLength;
70
+ if (size > limit) {
71
+ over = true;
72
+ controller.error(new RangeError(`request body exceeds ${limit} bytes`));
73
+ return;
74
+ }
75
+ controller.enqueue(chunk);
76
+ },
77
+ }));
78
+ const limited = new Request(request.url, {
79
+ method: request.method,
80
+ headers: request.headers,
81
+ body: counted,
82
+ signal: request.signal,
83
+ duplex: "half",
84
+ });
85
+ return { request: limited, exceeded: () => over };
86
+ }
22
87
  /** RFC 9728 well-known 경로 (mcp/http.ts PROTECTED_RESOURCE_METADATA_PATH 와 같음) */
23
88
  const PROTECTED_RESOURCE_PREFIX = "/.well-known/oauth-protected-resource";
24
89
  const EXCLUDED_SUFFIXES = [".test.ts", ".spec.ts", ".d.ts"];
@@ -121,6 +186,11 @@ export async function collectRoutes(dir) {
121
186
  issues.push({ code: "INVALID_ROUTE", message: `no handler export (${ROUTE_METHODS.join(" · ")})`, ...where });
122
187
  continue;
123
188
  }
189
+ const problem = routeOptionsProblem(mod);
190
+ if (problem !== undefined) {
191
+ issues.push({ code: "INVALID_ROUTE", message: problem, ...where });
192
+ continue;
193
+ }
124
194
  routes.push({ ...route, methods, module: mod });
125
195
  }
126
196
  return { dir: root, routes, issues };
@@ -216,21 +286,66 @@ export function createRouteDispatcher(options) {
216
286
  headers: { Allow: allow.join(", "), "Content-Type": "text/plain; charset=utf-8" },
217
287
  });
218
288
  }
289
+ // export maxBodyBytes 의 스트림 초과 = 핸들러 결과 · 예외와 무관하게 413
290
+ let limited;
219
291
  try {
220
292
  const mod = await loadModule(route);
221
293
  const handler = mod[method];
222
294
  if (typeof handler !== "function")
223
295
  throw new TypeError(`${route.file ?? route.path}: export ${method} is not a function`);
224
- const ctx = { params: Object.freeze(params), app: await options.app(), signal: request.signal, resourceUpdated };
225
- const response = await handler(request, ctx);
296
+ // export origin · maxBodyBytes · auth (§12.4). 순서 = Origin → 본문 상한 → auth → 핸들러
297
+ const problem = routeOptionsProblem(mod);
298
+ if (problem !== undefined)
299
+ throw new TypeError(`${route.file ?? route.path}: ${problem}`);
300
+ const applied = resolveRouteOptions(mod, options.defaults);
301
+ const guard = options.guard;
302
+ if (applied.origin === true) {
303
+ if (!guard)
304
+ throw new TypeError(`${route.file ?? route.path}: export origin needs the HTTP adapter`);
305
+ const rejected = guard.origin(request);
306
+ if (rejected)
307
+ return head ? await withoutBody(rejected) : rejected;
308
+ }
309
+ let input = request;
310
+ if (applied.maxBodyBytes !== undefined && applied.maxBodyBytes !== false) {
311
+ const limit = applied.maxBodyBytes === true ? (options.maxBodyBytes ?? MAX_BODY_BYTES) : applied.maxBodyBytes;
312
+ const body = limitBody(request, limit);
313
+ if (body === "too-large") {
314
+ await request.body?.cancel().catch(() => { });
315
+ return tooLarge(limit);
316
+ }
317
+ input = body.request;
318
+ limited = { exceeded: body.exceeded, limit };
319
+ }
320
+ let principal;
321
+ if (applied.auth === true || applied.auth === "optional") {
322
+ if (!guard)
323
+ throw new TypeError(`${route.file ?? route.path}: export auth needs the HTTP adapter`);
324
+ const result = await guard.authenticate(request, applied.auth, { method, path: route.path });
325
+ if (result instanceof Response)
326
+ return head ? await withoutBody(result) : result;
327
+ principal = result;
328
+ }
329
+ const ctx = {
330
+ params: Object.freeze(params),
331
+ app: await options.app(),
332
+ signal: request.signal,
333
+ resourceUpdated,
334
+ ...(principal !== undefined ? { principal } : {}),
335
+ };
336
+ const response = await handler(input, ctx);
337
+ if (limited?.exceeded()) {
338
+ if (response instanceof Response)
339
+ await response.body?.cancel().catch(() => { });
340
+ return tooLarge(limited.limit);
341
+ }
226
342
  if (!(response instanceof Response))
227
343
  throw new TypeError(`route ${method} ${route.path} did not return a Response`);
228
- if (!head)
229
- return response;
230
- await response.body?.cancel().catch(() => { });
231
- return new Response(null, { status: response.status, statusText: response.statusText, headers: response.headers });
344
+ return head ? await withoutBody(response) : response;
232
345
  }
233
346
  catch (error) {
347
+ if (limited?.exceeded())
348
+ return tooLarge(limited.limit);
234
349
  try {
235
350
  log(`route ${request.method} ${route.path}: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
236
351
  }
@@ -241,6 +356,11 @@ export function createRouteDispatcher(options) {
241
356
  }
242
357
  };
243
358
  }
359
+ /** HEAD 응답: 본문 제거 · 상태 · 헤더 유지 */
360
+ async function withoutBody(response) {
361
+ await response.body?.cancel().catch(() => { });
362
+ return new Response(null, { status: response.status, statusText: response.statusText, headers: response.headers });
363
+ }
244
364
  /** 앞 세그먼트부터 고정 < 동적 */
245
365
  function compareSpecificity(a, b) {
246
366
  for (let i = 0; i < Math.min(a.length, b.length); i++) {
package/dist/route.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdirSync, statSync, type Dirent } from \"node:fs\"\nimport { join, resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type { MextApp } from \"./command.ts\"\nimport { MextBuildError, type BuildIssue } from \"./errors.ts\"\nimport { isSegment } from \"./ids.ts\"\nimport { assertResourceUri } from \"./invoke.ts\"\nimport { MCP_PATH } from \"./mcp/constants.ts\"\n\n/**\n * Routes (§12.4): MCP 엔드포인트 밖 HTTP 경로. routes/**\\/*.ts 파일 경로 = URL 경로.\n * HTTP (dev · start · server.js · handler.js) 전용. stdio · CLI 없음. Origin 검사 · auth 대상 아님.\n * Registry 와 별개 집합 (D1): 명령어 계약 (help · tools · manifestHash) 과 공유하는 것이 없다\n */\n\nexport const ROUTE_METHODS = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] as const\nexport type RouteMethod = (typeof ROUTE_METHODS)[number]\n\nexport interface RouteContext {\n /** [name] 세그먼트 값 (디코딩) */\n params: Readonly<Record<string, string>>\n app: MextApp\n /** 요청 취소 (클라이언트 연결 종료) */\n signal: AbortSignal\n /** 자원 갱신 알림 (§12.5). 명령어 ctx.resourceUpdated 와 같음 (state 없음 = no-op) */\n resourceUpdated(uri: string): Promise<void>\n}\n\n/** routes/ 모듈의 GET · POST · PUT · PATCH · DELETE export */\nexport type RouteHandler = (request: Request, ctx: RouteContext) => Response | Promise<Response>\n\nexport type RouteModule = Partial<Record<RouteMethod, RouteHandler>>\n\nexport interface ScannedRoute {\n /** URL 경로 패턴. routes/items/[id].ts → \"/items/[id]\", routes/index.ts → \"/\" */\n path: string\n /** routes/ 기준 상대 경로 (posix) */\n file: string\n}\n\n/** 실행 가능한 route. eager (loadRoutes) = 모듈 그대로, lazy (manifest) = 처음 요청에서 import */\nexport interface RouteEntry {\n path: string\n file?: string\n /** export 한 메서드 (ROUTE_METHODS 순) */\n methods: readonly RouteMethod[]\n load: () => Promise<RouteModule>\n}\n\n/** RFC 9728 well-known 경로 (mcp/http.ts PROTECTED_RESOURCE_METADATA_PATH 와 같음) */\nconst PROTECTED_RESOURCE_PREFIX = \"/.well-known/oauth-protected-resource\"\nconst EXCLUDED_SUFFIXES = [\".test.ts\", \".spec.ts\", \".d.ts\"]\n/** [name]: ctx.params 의 키 = JS 식별자 */\nconst DYNAMIC_SEGMENT = /^\\[([A-Za-z_][A-Za-z0-9_]*)\\]$/\n\n/**\n * routes/ 파일 트리 해석 (import 없음). 폴더 없음 = route 없음.\n * index.ts = 폴더 경로 · [name] = 동적 · `_` `.` 접두 = private · *.test.ts *.spec.ts *.d.ts 제외 · 그 외 kebab-case.\n * 충돌 (MCP 엔드포인트 · /.well-known/oauth-protected-resource* · 같은 경로) = issue\n */\nexport function walkRoutes(dir: string): { routes: ScannedRoute[]; issues: BuildIssue[] } {\n const root = resolve(dir)\n const routes: ScannedRoute[] = []\n const issues: BuildIssue[] = []\n if (!isDirectory(root)) return { routes, issues }\n\n const visit = (abs: string, segments: string[]): void => {\n const entries = readdirSync(abs, { withFileTypes: true }).sort((a, b) => (a.name < b.name ? -1 : 1))\n for (const entry of entries) {\n const name = entry.name\n if (name.startsWith(\"_\") || name.startsWith(\".\")) continue\n const rel = [...segments, name].join(\"/\")\n if (isDirEntry(abs, entry)) {\n if (!isRouteSegment(name)) {\n issues.push({ code: \"INVALID_SEGMENT\", message: `directory \"${name}\" is not kebab-case or [name]`, file: rel })\n continue\n }\n visit(join(abs, name), [...segments, name])\n continue\n }\n if (!name.endsWith(\".ts\") || EXCLUDED_SUFFIXES.some((s) => name.endsWith(s))) continue\n if (!isFileEntry(abs, entry)) continue\n const base = name.slice(0, -\".ts\".length)\n if (base !== \"index\" && !isRouteSegment(base)) {\n issues.push({ code: \"INVALID_SEGMENT\", message: `file \"${name}\" is not kebab-case or [name]`, file: rel })\n continue\n }\n const pathSegments = base === \"index\" ? segments : [...segments, base]\n const path = `/${pathSegments.join(\"/\")}`\n const params = pathSegments.map((s) => DYNAMIC_SEGMENT.exec(s)?.[1]).filter((p): p is string => p !== undefined)\n const repeated = params.find((p, i) => params.indexOf(p) !== i)\n if (repeated !== undefined) {\n issues.push({ code: \"INVALID_SEGMENT\", message: `route ${path}: parameter [${repeated}] appears twice`, file: rel, id: path })\n continue\n }\n routes.push({ path, file: rel })\n }\n }\n visit(root, [])\n\n const accepted: ScannedRoute[] = []\n const seen = new Map<string, ScannedRoute>()\n for (const route of routes) {\n const where = { file: route.file, id: route.path }\n if (route.path === MCP_PATH) {\n issues.push({ code: \"ROUTE_CONFLICT\", message: `route ${route.path} conflicts with the MCP endpoint`, ...where })\n continue\n }\n if (route.path.startsWith(PROTECTED_RESOURCE_PREFIX)) {\n issues.push({ code: \"ROUTE_CONFLICT\", message: `route ${route.path} conflicts with ${PROTECTED_RESOURCE_PREFIX}*`, ...where })\n continue\n }\n // 동적 세그먼트 이름만 다른 경로 (/items/[id] · /items/[slug]) = 같은 경로\n const shape = route.path.replace(/\\[[^\\]/]*\\]/g, \"[]\")\n const prev = seen.get(shape)\n if (prev) {\n issues.push({ code: \"DUPLICATE_ROUTE\", message: `route ${route.path} duplicates ${prev.path} (${prev.file})`, ...where })\n continue\n }\n seen.set(shape, route)\n accepted.push(route)\n }\n return { routes: accepted, issues }\n}\n\n/** walkRoutes + 모듈 import · export 검사의 수집형 (mext build 일괄 검증용). 던지지 않는다 */\nexport async function collectRoutes(\n dir: string,\n): Promise<{ dir: string; routes: (ScannedRoute & { methods: RouteMethod[]; module: RouteModule })[]; issues: BuildIssue[] }> {\n const root = resolve(dir)\n const walked = walkRoutes(root)\n const issues = [...walked.issues]\n const routes: (ScannedRoute & { methods: RouteMethod[]; module: RouteModule })[] = []\n for (const route of walked.routes) {\n const where = { file: route.file, id: route.path }\n let mod: Record<string, unknown>\n try {\n mod = (await import(pathToFileURL(join(root, route.file)).href)) as Record<string, unknown>\n } catch (error) {\n issues.push({ code: \"LOAD_FAILED\", message: error instanceof Error ? error.message : String(error), ...where })\n continue\n }\n const bad = ROUTE_METHODS.filter((m) => mod[m] !== undefined && typeof mod[m] !== \"function\")\n if (bad.length > 0) {\n issues.push({ code: \"INVALID_ROUTE\", message: `export ${bad.join(\", \")} must be a function (request, ctx) => Response`, ...where })\n continue\n }\n const methods = ROUTE_METHODS.filter((m) => typeof mod[m] === \"function\")\n if (methods.length === 0) {\n issues.push({ code: \"INVALID_ROUTE\", message: `no handler export (${ROUTE_METHODS.join(\" · \")})`, ...where })\n continue\n }\n routes.push({ ...route, methods, module: mod as RouteModule })\n }\n return { dir: root, routes, issues }\n}\n\n/** 개발 모드 런타임 스캔: routes/ → RouteEntry[] (eager). 규칙 위반 = MextBuildError */\nexport async function loadRoutes(dir: string): Promise<RouteEntry[]> {\n const { routes, issues } = await collectRoutes(dir)\n if (issues.length > 0) throw new MextBuildError(issues)\n return routes.map((r) => ({ path: r.path, file: r.file, methods: r.methods, load: () => Promise.resolve(r.module) }))\n}\n\n/** 처음 호출에서 1회 (실패는 다음 호출에서 재시도) */\nexport function onceApp(factory: (() => MextApp | Promise<MextApp>) | undefined): () => 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}\n\nexport interface RouteDispatchOptions {\n routes: readonly RouteEntry[]\n app: () => Promise<MextApp>\n /** 예외 보고. 기본 console.error (stderr) */\n log?: (line: string) => void\n /** ctx.resourceUpdated. 기본 = no-op (uri 형식만 검사) */\n resourceUpdated?: (uri: string) => Promise<void>\n}\n\n/**\n * route 처리기. 맞는 route 없음 = undefined (호출자가 404).\n * 매칭 = 세그먼트 수가 같고 앞 세그먼트부터 고정이 동적보다 우선. 끝 \"/\" 1개 무시. MCP 엔드포인트 · well-known 은 대상 아님.\n * export 없는 메서드 = 405 (Allow). HEAD = GET 의 본문 제거. 예외 · Response 아닌 반환 = 500 + log (onCommandError 미보고)\n */\nexport function createRouteDispatcher(options: RouteDispatchOptions): (request: Request, url: URL) => Promise<Response | undefined> {\n const log = options.log ?? ((line: string) => console.error(line))\n const resourceUpdated = options.resourceUpdated ?? (async (uri: string) => assertResourceUri(uri))\n const compiled = options.routes\n .map((route) => ({ route, segments: route.path === \"/\" ? [] : route.path.slice(1).split(\"/\") }))\n .map(({ route, segments }) => ({\n route,\n segments: segments.map((s) => ({ literal: DYNAMIC_SEGMENT.exec(s) ? undefined : s, param: DYNAMIC_SEGMENT.exec(s)?.[1] })),\n }))\n .sort((a, b) => compareSpecificity(a.segments, b.segments) || (a.route.path < b.route.path ? -1 : 1))\n // 모듈 로드 1회 캐시 (lazy 실패는 다음 요청에서 재시도)\n const modules = new Map<RouteEntry, Promise<RouteModule>>()\n const loadModule = (route: RouteEntry): Promise<RouteModule> => {\n let pending = modules.get(route)\n if (!pending) {\n pending = route.load().catch((error: unknown) => {\n modules.delete(route)\n throw error\n })\n modules.set(route, pending)\n }\n return pending\n }\n\n const match = (pathname: string): { route: RouteEntry; params: Record<string, string> } | undefined => {\n if (pathname === MCP_PATH || pathname.startsWith(PROTECTED_RESOURCE_PREFIX)) return undefined\n const trimmed = pathname.length > 1 && pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname\n const parts = trimmed === \"/\" ? [] : trimmed.slice(1).split(\"/\")\n candidates: for (const { route, segments } of compiled) {\n if (segments.length !== parts.length) continue\n const params: Record<string, string> = {}\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!\n const seg = segments[i]!\n if (seg.literal !== undefined) {\n if (part !== seg.literal) continue candidates\n continue\n }\n if (part === \"\") continue candidates\n try {\n params[seg.param!] = decodeURIComponent(part)\n } catch {\n continue candidates\n }\n }\n return { route, params }\n }\n return undefined\n }\n\n return async (request, url) => {\n const found = match(url.pathname)\n if (!found) return undefined\n const { route, params } = found\n const head = request.method === \"HEAD\"\n const method = (head ? \"GET\" : request.method) as RouteMethod\n if (!route.methods.includes(method)) {\n const allow = route.methods.includes(\"GET\") ? [...route.methods, \"HEAD\"] : [...route.methods]\n return new Response(\"Method Not Allowed\\n\", {\n status: 405,\n headers: { Allow: allow.join(\", \"), \"Content-Type\": \"text/plain; charset=utf-8\" },\n })\n }\n try {\n const mod = await loadModule(route)\n const handler = mod[method]\n if (typeof handler !== \"function\") throw new TypeError(`${route.file ?? route.path}: export ${method} is not a function`)\n const ctx: RouteContext = { params: Object.freeze(params), app: await options.app(), signal: request.signal, resourceUpdated }\n const response: unknown = await handler(request, ctx)\n if (!(response instanceof Response)) throw new TypeError(`route ${method} ${route.path} did not return a Response`)\n if (!head) return response\n await response.body?.cancel().catch(() => {})\n return new Response(null, { status: response.status, statusText: response.statusText, headers: response.headers })\n } catch (error) {\n try {\n log(`route ${request.method} ${route.path}: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`)\n } catch {\n // 보고는 응답을 바꾸지 않는다\n }\n return new Response(\"Internal Server Error\\n\", { status: 500, headers: { \"Content-Type\": \"text/plain; charset=utf-8\" } })\n }\n }\n}\n\n/** 앞 세그먼트부터 고정 < 동적 */\nfunction compareSpecificity(a: readonly { literal?: string }[], b: readonly { literal?: string }[]): number {\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const x = a[i]!.literal === undefined ? 1 : 0\n const y = b[i]!.literal === undefined ? 1 : 0\n if (x !== y) return x - y\n }\n return a.length - b.length\n}\n\nfunction isRouteSegment(name: string): boolean {\n return isSegment(name) || DYNAMIC_SEGMENT.test(name)\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n\nfunction isDirEntry(parent: string, entry: Dirent): boolean {\n return entry.isDirectory() || (entry.isSymbolicLink() && isDirectory(join(parent, entry.name)))\n}\n\nfunction isFileEntry(parent: string, entry: Dirent): boolean {\n if (entry.isFile()) return true\n if (!entry.isSymbolicLink()) return false\n try {\n return statSync(join(parent, entry.name)).isFile()\n } catch {\n return false\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdirSync, statSync, type Dirent } from \"node:fs\"\nimport { join, resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type { MextApp } from \"./command.ts\"\nimport { MextBuildError, type BuildIssue } from \"./errors.ts\"\nimport { isSegment } from \"./ids.ts\"\nimport { assertResourceUri } from \"./invoke.ts\"\nimport { MAX_BODY_BYTES, MCP_PATH } from \"./mcp/constants.ts\"\nimport type { Principal } from \"./principal.ts\"\n\n/**\n * Routes (§12.4): MCP 엔드포인트 밖 HTTP 경로. routes/**\\/*.ts 파일 경로 = URL 경로.\n * HTTP (dev · start · server.js · handler.js) 전용. stdio · CLI 없음.\n * Origin 검사 · auth = 기본 없음. 모듈의 export origin · auth 로 route 마다 켠다 (설정 routes = 모든 route 의 기본값, export 가 덮어씀).\n * Registry 와 별개 집합 (D1): 명령어 계약 (help · tools · manifestHash) 과 공유하는 것이 없다\n */\n\nexport const ROUTE_METHODS = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] as const\nexport type RouteMethod = (typeof ROUTE_METHODS)[number]\n\nexport interface RouteContext {\n /** [name] 세그먼트 값 (디코딩) */\n params: Readonly<Record<string, string>>\n app: MextApp\n /** 요청 취소 (클라이언트 연결 종료) */\n signal: AbortSignal\n /** 자원 갱신 알림 (§12.5). 명령어 ctx.resourceUpdated 와 같음 (state 없음 = no-op) */\n resourceUpdated(uri: string): Promise<void>\n /** 설정 auth 가 만든 주체. 모듈이 export auth (true · \"optional\") 를 둔 route 만, 그 외 undefined */\n principal?: Principal\n}\n\n/** routes/ 모듈의 GET · POST · PUT · PATCH · DELETE export */\nexport type RouteHandler = (request: Request, ctx: RouteContext) => Response | Promise<Response>\n\n/**\n * route 모듈의 선택 export.\n * auth true = 설정 auth 필수 (anonymous · UNAUTHENTICATED = 401), \"optional\" = anonymous 허용 (UNAUTHENTICATED = 401). 없음 · false = auth 없음\n * origin true = /mcp 와 같은 Origin 규칙 (server.allowedOrigins). 없음 · false = 검사 없음\n * maxBodyBytes 양의 정수 = 본문 상한 (바이트), true = server.maxBodyBytes (기본 4 MiB). 없음 · false = 상한 없음. 넘으면 413\n */\nexport interface RouteOptions {\n auth?: RouteAuth\n origin?: boolean\n maxBodyBytes?: number | boolean\n}\n\nexport type RouteAuth = boolean | \"optional\"\n\nexport type RouteModule = Partial<Record<RouteMethod, RouteHandler>> & RouteOptions\n\n/**\n * route 경계 판정 (mcp/http.ts 가 구현). Response = 그 응답으로 끝 (403 · 401 · 500), 그 외 = 통과\n */\nexport interface RouteGuard {\n /** export origin = true. Origin 헤더가 있고 허용 밖 = 403 */\n origin(request: Request): Response | undefined\n /** export auth. 반환 Principal = ctx.principal */\n authenticate(request: Request, auth: true | \"optional\", route: { method: RouteMethod; path: string }): Promise<Principal | Response>\n}\n\n/** export auth · origin · maxBodyBytes 의 형식 문제. 없으면 undefined */\nexport function routeOptionsProblem(mod: Record<string, unknown>): string | undefined {\n if (mod.auth !== undefined && typeof mod.auth !== \"boolean\" && mod.auth !== \"optional\") {\n return 'export auth must be true, false or \"optional\"'\n }\n if (mod.origin !== undefined && typeof mod.origin !== \"boolean\") return \"export origin must be a boolean\"\n const max = mod.maxBodyBytes\n if (max !== undefined && typeof max !== \"boolean\" && !(typeof max === \"number\" && Number.isSafeInteger(max) && max > 0)) {\n return \"export maxBodyBytes must be a positive integer (bytes) or a boolean\"\n }\n return undefined\n}\n\n/** 적용 값: export (undefined 가 아니면, false 포함) > 설정 기본값 (routes) > 없음. 키별 독립 */\nexport function resolveRouteOptions(mod: RouteOptions, defaults: RouteOptions | undefined): RouteOptions {\n const out: RouteOptions = {}\n const auth = mod.auth ?? defaults?.auth\n const origin = mod.origin ?? defaults?.origin\n const maxBodyBytes = mod.maxBodyBytes ?? defaults?.maxBodyBytes\n if (auth !== undefined) out.auth = auth\n if (origin !== undefined) out.origin = origin\n if (maxBodyBytes !== undefined) out.maxBodyBytes = maxBodyBytes\n return out\n}\n\n/** route 본문 상한 초과 응답 (specs/http.md REQUEST_REJECTED too_large 와 같은 모양) */\nfunction tooLarge(limit: number): Response {\n const error = { code: \"REQUEST_REJECTED\", message: \"Request body too large.\", reason: \"too_large\", limit }\n return new Response(JSON.stringify({ error }), { status: 413, headers: { \"Content-Type\": \"application/json\" } })\n}\n\n/**\n * 본문을 limit 바이트로 제한한 Request. Content-Length 초과 = \"too-large\" (본문을 읽지 않는다).\n * 스트림이 넘으면 본문 읽기가 실패하고 exceeded() = true\n */\nfunction limitBody(request: Request, limit: number): { request: Request; exceeded: () => boolean } | \"too-large\" {\n const declared = Number(request.headers.get(\"content-length\") ?? \"\")\n if (Number.isFinite(declared) && declared > limit) return \"too-large\"\n if (request.body === null) return { request, exceeded: () => false }\n let size = 0\n let over = false\n const counted = request.body.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n size += chunk.byteLength\n if (size > limit) {\n over = true\n controller.error(new RangeError(`request body exceeds ${limit} bytes`))\n return\n }\n controller.enqueue(chunk)\n },\n }),\n )\n const limited = new Request(request.url, {\n method: request.method,\n headers: request.headers,\n body: counted,\n signal: request.signal,\n duplex: \"half\",\n } as RequestInit)\n return { request: limited, exceeded: () => over }\n}\n\nexport interface ScannedRoute {\n /** URL 경로 패턴. routes/items/[id].ts → \"/items/[id]\", routes/index.ts → \"/\" */\n path: string\n /** routes/ 기준 상대 경로 (posix) */\n file: string\n}\n\n/** 실행 가능한 route. eager (loadRoutes) = 모듈 그대로, lazy (manifest) = 처음 요청에서 import */\nexport interface RouteEntry {\n path: string\n file?: string\n /** export 한 메서드 (ROUTE_METHODS 순) */\n methods: readonly RouteMethod[]\n load: () => Promise<RouteModule>\n}\n\n/** RFC 9728 well-known 경로 (mcp/http.ts PROTECTED_RESOURCE_METADATA_PATH 와 같음) */\nconst PROTECTED_RESOURCE_PREFIX = \"/.well-known/oauth-protected-resource\"\nconst EXCLUDED_SUFFIXES = [\".test.ts\", \".spec.ts\", \".d.ts\"]\n/** [name]: ctx.params 의 키 = JS 식별자 */\nconst DYNAMIC_SEGMENT = /^\\[([A-Za-z_][A-Za-z0-9_]*)\\]$/\n\n/**\n * routes/ 파일 트리 해석 (import 없음). 폴더 없음 = route 없음.\n * index.ts = 폴더 경로 · [name] = 동적 · `_` `.` 접두 = private · *.test.ts *.spec.ts *.d.ts 제외 · 그 외 kebab-case.\n * 충돌 (MCP 엔드포인트 · /.well-known/oauth-protected-resource* · 같은 경로) = issue\n */\nexport function walkRoutes(dir: string): { routes: ScannedRoute[]; issues: BuildIssue[] } {\n const root = resolve(dir)\n const routes: ScannedRoute[] = []\n const issues: BuildIssue[] = []\n if (!isDirectory(root)) return { routes, issues }\n\n const visit = (abs: string, segments: string[]): void => {\n const entries = readdirSync(abs, { withFileTypes: true }).sort((a, b) => (a.name < b.name ? -1 : 1))\n for (const entry of entries) {\n const name = entry.name\n if (name.startsWith(\"_\") || name.startsWith(\".\")) continue\n const rel = [...segments, name].join(\"/\")\n if (isDirEntry(abs, entry)) {\n if (!isRouteSegment(name)) {\n issues.push({ code: \"INVALID_SEGMENT\", message: `directory \"${name}\" is not kebab-case or [name]`, file: rel })\n continue\n }\n visit(join(abs, name), [...segments, name])\n continue\n }\n if (!name.endsWith(\".ts\") || EXCLUDED_SUFFIXES.some((s) => name.endsWith(s))) continue\n if (!isFileEntry(abs, entry)) continue\n const base = name.slice(0, -\".ts\".length)\n if (base !== \"index\" && !isRouteSegment(base)) {\n issues.push({ code: \"INVALID_SEGMENT\", message: `file \"${name}\" is not kebab-case or [name]`, file: rel })\n continue\n }\n const pathSegments = base === \"index\" ? segments : [...segments, base]\n const path = `/${pathSegments.join(\"/\")}`\n const params = pathSegments.map((s) => DYNAMIC_SEGMENT.exec(s)?.[1]).filter((p): p is string => p !== undefined)\n const repeated = params.find((p, i) => params.indexOf(p) !== i)\n if (repeated !== undefined) {\n issues.push({ code: \"INVALID_SEGMENT\", message: `route ${path}: parameter [${repeated}] appears twice`, file: rel, id: path })\n continue\n }\n routes.push({ path, file: rel })\n }\n }\n visit(root, [])\n\n const accepted: ScannedRoute[] = []\n const seen = new Map<string, ScannedRoute>()\n for (const route of routes) {\n const where = { file: route.file, id: route.path }\n if (route.path === MCP_PATH) {\n issues.push({ code: \"ROUTE_CONFLICT\", message: `route ${route.path} conflicts with the MCP endpoint`, ...where })\n continue\n }\n if (route.path.startsWith(PROTECTED_RESOURCE_PREFIX)) {\n issues.push({ code: \"ROUTE_CONFLICT\", message: `route ${route.path} conflicts with ${PROTECTED_RESOURCE_PREFIX}*`, ...where })\n continue\n }\n // 동적 세그먼트 이름만 다른 경로 (/items/[id] · /items/[slug]) = 같은 경로\n const shape = route.path.replace(/\\[[^\\]/]*\\]/g, \"[]\")\n const prev = seen.get(shape)\n if (prev) {\n issues.push({ code: \"DUPLICATE_ROUTE\", message: `route ${route.path} duplicates ${prev.path} (${prev.file})`, ...where })\n continue\n }\n seen.set(shape, route)\n accepted.push(route)\n }\n return { routes: accepted, issues }\n}\n\n/** walkRoutes + 모듈 import · export 검사의 수집형 (mext build 일괄 검증용). 던지지 않는다 */\nexport async function collectRoutes(\n dir: string,\n): Promise<{ dir: string; routes: (ScannedRoute & { methods: RouteMethod[]; module: RouteModule })[]; issues: BuildIssue[] }> {\n const root = resolve(dir)\n const walked = walkRoutes(root)\n const issues = [...walked.issues]\n const routes: (ScannedRoute & { methods: RouteMethod[]; module: RouteModule })[] = []\n for (const route of walked.routes) {\n const where = { file: route.file, id: route.path }\n let mod: Record<string, unknown>\n try {\n mod = (await import(pathToFileURL(join(root, route.file)).href)) as Record<string, unknown>\n } catch (error) {\n issues.push({ code: \"LOAD_FAILED\", message: error instanceof Error ? error.message : String(error), ...where })\n continue\n }\n const bad = ROUTE_METHODS.filter((m) => mod[m] !== undefined && typeof mod[m] !== \"function\")\n if (bad.length > 0) {\n issues.push({ code: \"INVALID_ROUTE\", message: `export ${bad.join(\", \")} must be a function (request, ctx) => Response`, ...where })\n continue\n }\n const methods = ROUTE_METHODS.filter((m) => typeof mod[m] === \"function\")\n if (methods.length === 0) {\n issues.push({ code: \"INVALID_ROUTE\", message: `no handler export (${ROUTE_METHODS.join(\" · \")})`, ...where })\n continue\n }\n const problem = routeOptionsProblem(mod)\n if (problem !== undefined) {\n issues.push({ code: \"INVALID_ROUTE\", message: problem, ...where })\n continue\n }\n routes.push({ ...route, methods, module: mod as RouteModule })\n }\n return { dir: root, routes, issues }\n}\n\n/** 개발 모드 런타임 스캔: routes/ → RouteEntry[] (eager). 규칙 위반 = MextBuildError */\nexport async function loadRoutes(dir: string): Promise<RouteEntry[]> {\n const { routes, issues } = await collectRoutes(dir)\n if (issues.length > 0) throw new MextBuildError(issues)\n return routes.map((r) => ({ path: r.path, file: r.file, methods: r.methods, load: () => Promise.resolve(r.module) }))\n}\n\n/** 처음 호출에서 1회 (실패는 다음 호출에서 재시도) */\nexport function onceApp(factory: (() => MextApp | Promise<MextApp>) | undefined): () => 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}\n\nexport interface RouteDispatchOptions {\n routes: readonly RouteEntry[]\n app: () => Promise<MextApp>\n /** 예외 보고. 기본 console.error (stderr) */\n log?: (line: string) => void\n /** ctx.resourceUpdated. 기본 = no-op (uri 형식만 검사) */\n resourceUpdated?: (uri: string) => Promise<void>\n /** export origin · auth 판정 (HTTP 어댑터). 없으면 그 export 를 둔 route = 500 (구성 오류) */\n guard?: RouteGuard\n /** export maxBodyBytes = true 의 상한 (server.maxBodyBytes). 기본 MAX_BODY_BYTES */\n maxBodyBytes?: number\n /** 설정 routes: export 가 없는 키의 기본값 */\n defaults?: RouteOptions\n}\n\n/**\n * route 처리기. 맞는 route 없음 = undefined (호출자가 404).\n * 매칭 = 세그먼트 수가 같고 앞 세그먼트부터 고정이 동적보다 우선. 끝 \"/\" 1개 무시. MCP 엔드포인트 · well-known 은 대상 아님.\n * export 없는 메서드 = 405 (Allow). HEAD = GET 의 본문 제거. 예외 · Response 아닌 반환 = 500 + log (onCommandError 미보고)\n */\nexport function createRouteDispatcher(options: RouteDispatchOptions): (request: Request, url: URL) => Promise<Response | undefined> {\n const log = options.log ?? ((line: string) => console.error(line))\n const resourceUpdated = options.resourceUpdated ?? (async (uri: string) => assertResourceUri(uri))\n const compiled = options.routes\n .map((route) => ({ route, segments: route.path === \"/\" ? [] : route.path.slice(1).split(\"/\") }))\n .map(({ route, segments }) => ({\n route,\n segments: segments.map((s) => ({ literal: DYNAMIC_SEGMENT.exec(s) ? undefined : s, param: DYNAMIC_SEGMENT.exec(s)?.[1] })),\n }))\n .sort((a, b) => compareSpecificity(a.segments, b.segments) || (a.route.path < b.route.path ? -1 : 1))\n // 모듈 로드 1회 캐시 (lazy 실패는 다음 요청에서 재시도)\n const modules = new Map<RouteEntry, Promise<RouteModule>>()\n const loadModule = (route: RouteEntry): Promise<RouteModule> => {\n let pending = modules.get(route)\n if (!pending) {\n pending = route.load().catch((error: unknown) => {\n modules.delete(route)\n throw error\n })\n modules.set(route, pending)\n }\n return pending\n }\n\n const match = (pathname: string): { route: RouteEntry; params: Record<string, string> } | undefined => {\n if (pathname === MCP_PATH || pathname.startsWith(PROTECTED_RESOURCE_PREFIX)) return undefined\n const trimmed = pathname.length > 1 && pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname\n const parts = trimmed === \"/\" ? [] : trimmed.slice(1).split(\"/\")\n candidates: for (const { route, segments } of compiled) {\n if (segments.length !== parts.length) continue\n const params: Record<string, string> = {}\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!\n const seg = segments[i]!\n if (seg.literal !== undefined) {\n if (part !== seg.literal) continue candidates\n continue\n }\n if (part === \"\") continue candidates\n try {\n params[seg.param!] = decodeURIComponent(part)\n } catch {\n continue candidates\n }\n }\n return { route, params }\n }\n return undefined\n }\n\n return async (request, url) => {\n const found = match(url.pathname)\n if (!found) return undefined\n const { route, params } = found\n const head = request.method === \"HEAD\"\n const method = (head ? \"GET\" : request.method) as RouteMethod\n if (!route.methods.includes(method)) {\n const allow = route.methods.includes(\"GET\") ? [...route.methods, \"HEAD\"] : [...route.methods]\n return new Response(\"Method Not Allowed\\n\", {\n status: 405,\n headers: { Allow: allow.join(\", \"), \"Content-Type\": \"text/plain; charset=utf-8\" },\n })\n }\n // export maxBodyBytes 의 스트림 초과 = 핸들러 결과 · 예외와 무관하게 413\n let limited: { exceeded: () => boolean; limit: number } | undefined\n try {\n const mod = await loadModule(route)\n const handler = mod[method]\n if (typeof handler !== \"function\") throw new TypeError(`${route.file ?? route.path}: export ${method} is not a function`)\n // export origin · maxBodyBytes · auth (§12.4). 순서 = Origin → 본문 상한 → auth → 핸들러\n const problem = routeOptionsProblem(mod as Record<string, unknown>)\n if (problem !== undefined) throw new TypeError(`${route.file ?? route.path}: ${problem}`)\n const applied = resolveRouteOptions(mod, options.defaults)\n const guard = options.guard\n if (applied.origin === true) {\n if (!guard) throw new TypeError(`${route.file ?? route.path}: export origin needs the HTTP adapter`)\n const rejected = guard.origin(request)\n if (rejected) return head ? await withoutBody(rejected) : rejected\n }\n let input = request\n if (applied.maxBodyBytes !== undefined && applied.maxBodyBytes !== false) {\n const limit = applied.maxBodyBytes === true ? (options.maxBodyBytes ?? MAX_BODY_BYTES) : applied.maxBodyBytes\n const body = limitBody(request, limit)\n if (body === \"too-large\") {\n await request.body?.cancel().catch(() => {})\n return tooLarge(limit)\n }\n input = body.request\n limited = { exceeded: body.exceeded, limit }\n }\n let principal: Principal | undefined\n if (applied.auth === true || applied.auth === \"optional\") {\n if (!guard) throw new TypeError(`${route.file ?? route.path}: export auth needs the HTTP adapter`)\n const result = await guard.authenticate(request, applied.auth, { method, path: route.path })\n if (result instanceof Response) return head ? await withoutBody(result) : result\n principal = result\n }\n const ctx: RouteContext = {\n params: Object.freeze(params),\n app: await options.app(),\n signal: request.signal,\n resourceUpdated,\n ...(principal !== undefined ? { principal } : {}),\n }\n const response: unknown = await handler(input, ctx)\n if (limited?.exceeded()) {\n if (response instanceof Response) await response.body?.cancel().catch(() => {})\n return tooLarge(limited.limit)\n }\n if (!(response instanceof Response)) throw new TypeError(`route ${method} ${route.path} did not return a Response`)\n return head ? await withoutBody(response) : response\n } catch (error) {\n if (limited?.exceeded()) return tooLarge(limited.limit)\n try {\n log(`route ${request.method} ${route.path}: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`)\n } catch {\n // 보고는 응답을 바꾸지 않는다\n }\n return new Response(\"Internal Server Error\\n\", { status: 500, headers: { \"Content-Type\": \"text/plain; charset=utf-8\" } })\n }\n }\n}\n\n/** HEAD 응답: 본문 제거 · 상태 · 헤더 유지 */\nasync function withoutBody(response: Response): Promise<Response> {\n await response.body?.cancel().catch(() => {})\n return new Response(null, { status: response.status, statusText: response.statusText, headers: response.headers })\n}\n\n/** 앞 세그먼트부터 고정 < 동적 */\nfunction compareSpecificity(a: readonly { literal?: string }[], b: readonly { literal?: string }[]): number {\n for (let i = 0; i < Math.min(a.length, b.length); i++) {\n const x = a[i]!.literal === undefined ? 1 : 0\n const y = b[i]!.literal === undefined ? 1 : 0\n if (x !== y) return x - y\n }\n return a.length - b.length\n}\n\nfunction isRouteSegment(name: string): boolean {\n return isSegment(name) || DYNAMIC_SEGMENT.test(name)\n}\n\nfunction isDirectory(path: string): boolean {\n try {\n return statSync(path).isDirectory()\n } catch {\n return false\n }\n}\n\nfunction isDirEntry(parent: string, entry: Dirent): boolean {\n return entry.isDirectory() || (entry.isSymbolicLink() && isDirectory(join(parent, entry.name)))\n}\n\nfunction isFileEntry(parent: string, entry: Dirent): boolean {\n if (entry.isFile()) return true\n if (!entry.isSymbolicLink()) return false\n try {\n return statSync(join(parent, entry.name)).isFile()\n } catch {\n return false\n }\n}\n"]}
package/dist/start.js CHANGED
@@ -10,7 +10,7 @@ import { readFileSync } from "node:fs";
10
10
  import { resolve, sep } from "node:path";
11
11
  import { fileURLToPath, pathToFileURL } from "node:url";
12
12
  import { COMMAND, isCommand } from "./command.js";
13
- import { mcpDeclarations, mcpStdioDeclarations, resolveLocalPrincipal, resolveSecret, SECRET_ENV } from "./config.js";
13
+ import { httpServerOptions, mcpDeclarations, mcpStdioDeclarations, resolveLocalPrincipal, resolveSecret, SECRET_ENV } from "./config.js";
14
14
  import { loadInstrumentation } from "./instrumentation.js";
15
15
  import { MANIFEST_SCHEMA_VERSION } from "./manifest.js";
16
16
  import { DEFAULT_HOST, DEFAULT_PORT } from "./mcp/constants.js";
@@ -51,7 +51,7 @@ export async function startFromBuild(dir, options = {}) {
51
51
  registry: build.registry,
52
52
  instrumentation: build.instrumentation,
53
53
  manifestHash: build.manifest.manifestHash,
54
- principal: await resolveLocalPrincipal(build.config),
54
+ principal: await resolveLocalPrincipal(build.config, "stdio"),
55
55
  ...(build.config.app ? { app: build.config.app } : {}),
56
56
  ...(build.config.tools ? { tools: build.config.tools } : {}),
57
57
  ...mcpStdioDeclarations(build.config, env),
@@ -147,7 +147,7 @@ export function readBuildManifest(dir) {
147
147
  }
148
148
  const manifest = JSON.parse(text);
149
149
  if (manifest.schemaVersion !== MANIFEST_SCHEMA_VERSION) {
150
- throw new Error(`${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${MANIFEST_SCHEMA_VERSION}). Run "mext build" again`);
150
+ throw new Error(`${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${String(MANIFEST_SCHEMA_VERSION)}). Run "mext build" again`);
151
151
  }
152
152
  if (manifest.mextVersion !== mextVersion()) {
153
153
  throw new Error(`${fileURLToPath(base)} was built with @obov/mext ${manifest.mextVersion}, but ${mextVersion()} is installed. Run "mext build" again`);
@@ -256,11 +256,15 @@ function metadataCommand(c) {
256
256
  readOnly: c.readOnly,
257
257
  destructive: c.destructive,
258
258
  requiresConfirmation: c.requiresConfirmation,
259
+ // 조건식 = 메타데이터 표시만 (describeCommand 가 "conditional" 로 싣는다). 판정은 로드한 모듈의 함수로
260
+ ...(c.needsApproval === "conditional" ? { needsApproval: notLoaded } : {}),
259
261
  scopes: Object.freeze([...c.scopes]),
260
262
  examples: Object.freeze([...c.examples]),
261
263
  positional: Object.freeze([...c.positional]),
262
264
  aliases: Object.freeze(c.aliases.map((a) => (a.startsWith(parent) ? a.slice(parent.length) : a))),
263
265
  ...(c.task !== undefined ? { task: Object.freeze({ ttlMs: c.task.ttlMs }) } : {}),
266
+ // expose 판정 = 모듈 import 전 (목록 · UNKNOWN_COMMAND 는 manifest 만으로)
267
+ ...(c.expose !== undefined ? { expose: Object.freeze({ ...c.expose }) } : {}),
264
268
  execute: notLoaded,
265
269
  });
266
270
  }
@@ -274,9 +278,10 @@ function httpOptions(build, onerror, env = process.env) {
274
278
  ...(config.auth ? { auth: config.auth } : {}),
275
279
  ...(config.tools ? { tools: config.tools } : {}),
276
280
  ...(config.oauth ? { oauth: config.oauth } : {}),
281
+ ...(config.routes ? { routeDefaults: config.routes } : {}),
277
282
  ...(build.routes.length > 0 ? { routes: build.routes } : {}),
278
283
  ...mcpDeclarations(config, env),
279
- server: config.server?.allowedOrigins ? { allowedOrigins: config.server.allowedOrigins } : {},
284
+ server: httpServerOptions(config),
280
285
  onerror,
281
286
  };
282
287
  }
package/dist/start.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { resolve, sep } from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { COMMAND, isCommand, type Command } from \"./command.ts\"\nimport { mcpDeclarations, mcpStdioDeclarations, resolveLocalPrincipal, resolveSecret, SECRET_ENV, type MextConfig } from \"./config.ts\"\nimport { loadInstrumentation, type Instrumentation } from \"./instrumentation.ts\"\nimport { MANIFEST_SCHEMA_VERSION, type BuildManifest, type BuildManifestCommand } from \"./manifest.ts\"\nimport { DEFAULT_HOST, DEFAULT_PORT } from \"./mcp/constants.ts\"\nimport { createMcpFetchHandler, startMcpHttpServer, type McpFetchHandler, type McpHttpOptions } from \"./mcp/http.ts\"\nimport { redirectStdout, serveMcpStdio } from \"./mcp/stdio.ts\"\nimport { createLazyRegistry, type Registry } from \"./registry.ts\"\nimport { createLazyPromptSet, isPrompt, type PromptSet } from \"./prompt.ts\"\nimport { createLazyResourceSet, isResource, type ResourceSet } from \"./resource.ts\"\nimport type { RouteEntry, RouteModule } from \"./route.ts\"\nimport { mextVersion } from \"./version.ts\"\n\n/**\n * @obov/mext/start: .mext/ (mext build 산출) 실행 런타임. 소스 스캔 · TypeScript 없음.\n * 생성 파일 계약 (mext build 가 쓰는 server.js · handler.js, 바꾸면 기존 빌드가 깨진다):\n * server.js process.exitCode = await startFromBuild(new URL(\".\", import.meta.url), { argv: process.argv.slice(2), env: process.env })\n * handler.js export default createFetchHandler(new URL(\".\", import.meta.url))\n *\n * 로드 순서 = manifest.json (검증) → instrumentation.js (register) → config.js → manifest 기반 lazy Registry.\n * 명령어 모듈은 그 명령어를 실행할 때 import (help · tools/list · UNKNOWN_COMMAND · 권한 거부는 import 없음)\n */\n\nexport { mainLocalBin, runLocalBin } from \"./local-bin.ts\"\nexport type { LocalBinOptions } from \"./local-bin.ts\"\n\nexport interface StartOptions {\n /** server.js · mext start 뒤 인자. --stdio · --port <n> · --host <h> */\n argv?: readonly string[]\n /** PORT · HOST. 기본 process.env */\n env?: Record<string, string | undefined>\n /** abort = 종료. 기본 SIGINT · SIGTERM */\n signal?: AbortSignal\n /** 기본 process.stderr */\n stderr?: { write(chunk: string): unknown }\n}\n\nexport interface FetchHandler {\n /**\n * 거부하지 않는다. 초기화 실패 · 내부 오류 = 500 JSON-RPC 오류.\n * rest 중 waitUntil 함수를 가진 객체 (Cloudflare ctx · Vercel 등) = 응답 후 task 실행 유지. 없으면 tasks 확장 미선언 (§10 · §12.6)\n */\n fetch(request: Request, ...rest: unknown[]): Promise<Response>\n}\n\n/** .mext/ 로드 결과 */\nexport interface LoadedBuild {\n manifest: BuildManifest\n config: MextConfig\n registry: Registry\n instrumentation: Instrumentation\n /** manifest.routes → lazy RouteEntry (모듈은 처음 요청에서 import) */\n routes: RouteEntry[]\n}\n\nexport interface LoadBuildOptions {\n /** 명령어 모듈 import (테스트 계측). 기본 = 동적 import */\n importModule?: (href: string) => Promise<unknown>\n}\n\nconst USAGE = \"Usage: mext start [--stdio] [--port <n>] [--host <h>] (node .mext/server.js, PORT · HOST environment variables)\"\n\n/** .mext/ 실행 (mext start · node .mext/server.js). 반환 = exit code */\nexport async function startFromBuild(dir: string | URL, options: StartOptions = {}): Promise<number> {\n const stderr = options.stderr ?? process.stderr\n const env = options.env ?? process.env\n const args = parseStartArgs(options.argv ?? [])\n if (typeof args === \"string\") {\n stderr.write(`error: ${args}\\n${USAGE}\\n`)\n return 2\n }\n // stdio: 사용자 코드 import 전부터 그 외 stdout 쓰기를 stderr 로 (mext dev --stdio 와 같음)\n const redirect = args.stdio ? redirectStdout() : undefined\n const { signal, dispose } = options.signal ? { signal: options.signal, dispose: () => {} } : processSignal()\n try {\n const build = await loadBuild(dir)\n const onerror = (error: Error): void => void stderr.write(`mcp: ${error.message}\\n`)\n if (args.stdio) {\n const server = serveMcpStdio({\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n principal: await resolveLocalPrincipal(build.config),\n ...(build.config.app ? { app: build.config.app } : {}),\n ...(build.config.tools ? { tools: build.config.tools } : {}),\n ...mcpStdioDeclarations(build.config, env),\n stdout: redirect!.wire,\n onerror,\n })\n const onAbort = (): void => void server.close()\n if (signal.aborted) onAbort()\n signal.addEventListener(\"abort\", onAbort, { once: true })\n await server.closed\n return 0\n }\n const port = args.port ?? envPort(env.PORT) ?? build.config.server?.port ?? DEFAULT_PORT\n const host = args.host ?? (env.HOST === undefined || env.HOST === \"\" ? undefined : env.HOST) ?? build.config.server?.host ?? DEFAULT_HOST\n const http = httpOptions(build, onerror, env)\n if (resolveSecret(build.config, env) === undefined) {\n stderr.write(\n `warning: no secret (mext.config.ts secret or ${SECRET_ENV}). ctx.ask retries after the first answer fail across instances and restarts\\n`,\n )\n }\n const server = await startMcpHttpServer({ ...http, server: { ...http.server, host, port } })\n stderr.write(`MCP server (Streamable HTTP) listening on ${server.url} (buildId ${build.manifest.buildId})\\n`)\n await new Promise<void>((done) => {\n if (signal.aborted) return done()\n signal.addEventListener(\"abort\", () => done(), { once: true })\n })\n await server.close()\n return 0\n } catch (error) {\n // 시작 실패 = stdout 원복 (stdio 서버를 띄우기 전)\n redirect?.restore()\n stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`)\n return 1\n } finally {\n dispose()\n }\n}\n\n/**\n * handler.js 의 Web fetch handler ({ fetch(request) → Response }). 동기 반환.\n * D7: 초기화 (manifest 검증 · instrumentation register · config · Registry) = 첫 요청에서 1회 (memoized promise).\n * 초기화 실패 = 그 요청 500 + JSON-RPC 오류 (data.loadError), 다음 요청에서 재시도.\n * MCP 처리 (Origin · auth · 헤더 검증 · SSE progress · MRTR) = node 서버와 같은 createMcpFetchHandler\n */\nexport function createFetchHandler(dir: string | URL, options: LoadBuildOptions = {}): FetchHandler {\n const base = dirUrl(dir)\n const onerror = (error: Error): void => console.error(`mcp: ${error.message}`)\n let pending: Promise<McpFetchHandler> | undefined\n const init = (): Promise<McpFetchHandler> =>\n (pending ??= loadBuild(base, options)\n .then((build) => createMcpFetchHandler({ ...httpOptions(build, onerror), taskExecution: \"waitUntil\" }))\n .catch((error: unknown) => {\n pending = undefined\n throw error\n }))\n return {\n async fetch(request, ...rest) {\n let handler: McpFetchHandler\n try {\n handler = await init()\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n onerror(error instanceof Error ? error : new Error(message))\n const body = { jsonrpc: \"2.0\", id: null, error: { code: -32_603, message: \"Server failed to start\", data: { loadError: message } } }\n return new Response(JSON.stringify(body), { status: 500, headers: { \"Content-Type\": \"application/json\" } })\n }\n const waitUntil = findWaitUntil(rest)\n return handler.fetch(request, waitUntil ? { waitUntil } : undefined)\n },\n }\n}\n\n/** fetch(request, ...rest) 의 rest 에서 waitUntil 함수를 가진 객체 (this 유지) */\nfunction findWaitUntil(rest: readonly unknown[]): ((promise: Promise<unknown>) => void) | undefined {\n for (const value of rest) {\n const holder = value as { waitUntil?: unknown } | null\n if (typeof holder === \"object\" && holder !== null && typeof holder.waitUntil === \"function\") {\n const fn = holder.waitUntil as (promise: Promise<unknown>) => void\n return (promise) => fn.call(holder, promise)\n }\n }\n return undefined\n}\n\n/** .mext/manifest.json 읽기 + 검증 (없음 · schemaVersion · mextVersion 불일치 = 오류) */\nexport function readBuildManifest(dir: string | URL): BuildManifest {\n const base = dirUrl(dir)\n let text: string\n try {\n text = readFileSync(new URL(\"manifest.json\", base), \"utf8\")\n } catch {\n throw new Error(`no build found in ${fileURLToPath(base)} (manifest.json missing). Run \"mext build\" first`)\n }\n const manifest = JSON.parse(text) as BuildManifest\n if (manifest.schemaVersion !== MANIFEST_SCHEMA_VERSION) {\n throw new Error(\n `${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${MANIFEST_SCHEMA_VERSION}). Run \"mext build\" again`,\n )\n }\n if (manifest.mextVersion !== mextVersion()) {\n throw new Error(\n `${fileURLToPath(base)} was built with @obov/mext ${manifest.mextVersion}, but ${mextVersion()} is installed. Run \"mext build\" again`,\n )\n }\n return manifest\n}\n\n/** manifest 검증 → instrumentation.js (register, 사용자 코드보다 먼저) → config.js → lazy Registry */\nexport async function loadBuild(dir: string | URL, options: LoadBuildOptions = {}): Promise<LoadedBuild> {\n const base = dirUrl(dir)\n const manifest = readBuildManifest(base)\n const instrumentation = await loadInstrumentation(\n manifest.instrumentation === undefined ? undefined : new URL(manifest.instrumentation, base),\n )\n const config =\n manifest.config === undefined\n ? {}\n : ((await import(new URL(manifest.config, base).href)) as { default: MextConfig }).default\n const registry = registryFromManifest(manifest, base, options)\n return { manifest, config, registry, instrumentation, routes: routesFromManifest(manifest, base, options) }\n}\n\n/** manifest.routes → RouteEntry. 405 = manifest 의 methods 만, 모듈 (routes[].module) 은 load() 에서 import */\nexport function routesFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): RouteEntry[] {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n return (manifest.routes ?? []).map((r) => ({\n path: r.path,\n file: r.file,\n methods: r.methods,\n load: async () => (await importModule(new URL(r.module, base).href)) as RouteModule,\n }))\n}\n\n/**\n * manifest → lazy Registry. 명령어 모듈 (manifest.commands[].module) · 자원 모듈 (resources[].module) ·\n * 프롬프트 모듈 (prompts[].module) 은 load() 에서 import\n */\nexport function registryFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): Registry {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n const resources = resourcesFromManifest(manifest, base, importModule)\n const prompts = promptsFromManifest(manifest, base, importModule)\n const registry = createLazyRegistry({\n commands: manifest.commands.map((c) => ({\n id: c.id,\n command: metadataCommand(c),\n aliases: c.aliases,\n ...(c.file !== undefined ? { file: c.file } : {}),\n inputSchema: c.inputSchema,\n ...(c.outputSchema !== undefined ? { outputSchema: c.outputSchema } : {}),\n async load() {\n const href = new URL(c.module, base).href\n const mod = (await importModule(href)) as { default?: unknown } | undefined\n if (!isCommand(mod?.default)) throw new Error(`${c.module}: default export is not a defineCommand result (command ${c.id})`)\n return mod.default\n },\n })),\n namespaces: [\n ...(manifest.description !== undefined ? [{ id: \"\", description: manifest.description }] : []),\n ...manifest.namespaces,\n ],\n })\n return { ...registry, ...(resources ? { resources } : {}), ...(prompts ? { prompts } : {}) }\n}\n\n/** manifest.prompts → lazy PromptSet. 없거나 비면 undefined (프롬프트 기능 없음) */\nfunction promptsFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): PromptSet | undefined {\n if (!manifest.prompts || manifest.prompts.length === 0) return undefined\n return createLazyPromptSet(\n manifest.prompts.map(({ module, ...p }) => ({\n ...p,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isPrompt(mod?.default)) throw new Error(`${module}: default export is not a definePrompt result (prompt ${p.name})`)\n return mod.default\n },\n })),\n )\n}\n\n/** manifest.resources → lazy ResourceSet. 없거나 비면 undefined (자원 기능 없음) */\nfunction resourcesFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): ResourceSet | undefined {\n if (!manifest.resources || manifest.resources.length === 0) return undefined\n return createLazyResourceSet(\n manifest.resources.map(({ module, ...r }) => ({\n ...r,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isResource(mod?.default) || mod.default.uri !== r.uri) {\n throw new Error(`${module}: default export is not the defineResource result for ${r.uri}`)\n }\n return mod.default\n },\n })),\n )\n}\n\n/**\n * manifest 메타데이터만 있는 Command (RegisteredCommand.command). input · execute 는 모듈 로드 전이라 접근 = 오류\n * (invoke 는 loadCommand 결과를 쓴다)\n */\nfunction metadataCommand(c: BuildManifestCommand): Command {\n const parent = c.id.includes(\".\") ? c.id.slice(0, c.id.lastIndexOf(\".\") + 1) : \"\"\n const notLoaded = (): never => {\n throw new Error(`${c.id}: command module is not loaded (use loadCommand)`)\n }\n return Object.freeze({\n [COMMAND]: true as const,\n description: c.description,\n get input(): never {\n return notLoaded()\n },\n output: undefined,\n readOnly: c.readOnly,\n destructive: c.destructive,\n requiresConfirmation: c.requiresConfirmation,\n scopes: Object.freeze([...c.scopes]),\n examples: Object.freeze([...c.examples]) as Command[\"examples\"],\n positional: Object.freeze([...c.positional]),\n aliases: Object.freeze(c.aliases.map((a) => (a.startsWith(parent) ? a.slice(parent.length) : a))),\n ...(c.task !== undefined ? { task: Object.freeze({ ttlMs: c.task.ttlMs }) } : {}),\n execute: notLoaded,\n })\n}\n\nfunction httpOptions(\n build: LoadedBuild,\n onerror: (error: Error) => void,\n env: Record<string, string | undefined> = process.env,\n): McpHttpOptions {\n const { config } = build\n return {\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n ...(config.app ? { app: config.app } : {}),\n ...(config.auth ? { auth: config.auth } : {}),\n ...(config.tools ? { tools: config.tools } : {}),\n ...(config.oauth ? { oauth: config.oauth } : {}),\n ...(build.routes.length > 0 ? { routes: build.routes } : {}),\n ...mcpDeclarations(config, env),\n server: config.server?.allowedOrigins ? { allowedOrigins: config.server.allowedOrigins } : {},\n onerror,\n }\n}\n\ninterface StartArgs {\n stdio: boolean\n port?: number\n host?: string\n}\n\n/** 반환 문자열 = 사용법 오류 */\nexport function parseStartArgs(argv: readonly string[]): StartArgs | string {\n const args: StartArgs = { stdio: false }\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--stdio\") {\n args.stdio = true\n continue\n }\n if (!tok.startsWith(\"--\")) return `unexpected argument \"${tok}\"`\n const eq = tok.indexOf(\"=\")\n const name = eq < 0 ? tok.slice(2) : tok.slice(2, eq)\n if (name !== \"port\" && name !== \"host\") return `unknown flag --${name}`\n const value = eq < 0 ? argv[++i] : tok.slice(eq + 1)\n if (value === undefined || value === \"\") return `--${name} requires a value`\n if (name === \"port\") {\n const port = Number(value)\n if (!isPort(port)) return \"--port must be an integer between 0 and 65535\"\n args.port = port\n } else args.host = value\n }\n if (args.stdio && (args.port !== undefined || args.host !== undefined)) return \"--port and --host do not apply to --stdio\"\n return args\n}\n\nfunction envPort(value: string | undefined): number | undefined {\n if (value === undefined || value === \"\") return undefined\n const port = Number(value)\n if (!isPort(port)) throw new Error(`PORT must be an integer between 0 and 65535 (got \"${value}\")`)\n return port\n}\n\nfunction isPort(n: number): boolean {\n return Number.isInteger(n) && n >= 0 && n <= 65_535\n}\n\nfunction dirUrl(dir: string | URL): URL {\n if (typeof dir !== \"string\") return dir.href.endsWith(\"/\") ? dir : new URL(`${dir.href}/`)\n const abs = resolve(dir)\n return pathToFileURL(abs.endsWith(sep) ? abs : `${abs}${sep}`)\n}\n\nfunction processSignal(): { signal: AbortSignal; dispose(): void } {\n const controller = new AbortController()\n const abort = (): void => controller.abort()\n process.once(\"SIGINT\", abort)\n process.once(\"SIGTERM\", abort)\n return {\n signal: controller.signal,\n dispose() {\n process.off(\"SIGINT\", abort)\n process.off(\"SIGTERM\", abort)\n },\n }\n}\n"]}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AACzJ,OAAO,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,uBAAuB,EAAiD,MAAM,eAAe,CAAA;AACtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAA6C,MAAM,eAAe,CAAA;AACpH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAiB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAA;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAqC1D,MAAM,KAAK,GAAG,kHAAkH,CAAA;AAEhI,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAiB,EAAE,OAAO,GAAiB,EAAE;IAChF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,CAAA;QAC1C,OAAO,CAAC,CAAA;IACV,CAAC;IACD,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAC5G,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;QACpF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,aAAa,CAAC;gBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;gBACzC,SAAS,EAAE,MAAM,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;gBAC7D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;gBAC1C,MAAM,EAAE,QAAS,CAAC,IAAI;gBACtB,OAAO;aACR,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;YAC/C,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACzD,MAAM,MAAM,CAAC,MAAM,CAAA;YACnB,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,YAAY,CAAA;QACxF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,YAAY,CAAA;QACzI,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;QAC7C,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CACV,gDAAgD,UAAU,gFAAgF,CAC3I,CAAA;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,KAAK,CAAC,6CAA6C,MAAM,CAAC,GAAG,aAAa,KAAK,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAA;QAC7G,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,IAAI,EAAE,CAAA;YACjC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QACF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,QAAQ,EAAE,OAAO,EAAE,CAAA;QACnB,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAClF,OAAO,CAAC,CAAA;IACV,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9E,IAAI,OAA6C,CAAA;IACjD,MAAM,IAAI,GAAG,GAA6B,EAAE,CAC1C,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;SAClC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;SACtG,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,OAAO,GAAG,SAAS,CAAA;QACnB,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAC,CAAA;IACP,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI;YAC1B,IAAI,OAAwB,CAAA;YAC5B,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAI,EAAE,CAAA;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACtE,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;gBAC5D,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;gBACpI,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;YAC7G,CAAC;YACD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YACrC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACtE,CAAC;KACF,CAAA;AACH,CAAC;AAED,sEAAsE;AACtE,SAAS,aAAa,CAAC,IAAwB;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,KAAuC,CAAA;QACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC5F,MAAM,EAAE,GAAG,MAAM,CAAC,SAAgD,CAAA;YAClE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qBAAqB,aAAa,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC7G,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;IAClD,IAAI,QAAQ,CAAC,aAAa,KAAK,uBAAuB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,MAAM,CAAC,uBAAuB,CAAC,2BAA2B,CACvK,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,CAAC,IAAI,CAAC,8BAA8B,QAAQ,CAAC,WAAW,SAAS,WAAW,EAAE,uCAAuC,CACtI,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAC/C,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAC7F,CAAA;IACD,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,KAAK,SAAS;QAC3B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAE,CAAC,MAAM,MAAM,kCAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,EAAC,CAA6B,CAAC,OAAO,CAAA;IAC9F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAA;AAC7G,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,kBAAkB,CAAC,QAAuB,EAAE,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAC3G,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,kCAAC,IAAI,EAAC,CAAC,CAAA;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAgB;KACpF,CAAC,CAAC,CAAA;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAuB,EAAE,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAC7G,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,kCAAC,IAAI,EAAC,CAAC,CAAA;IAC7E,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IACjE,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,KAAK,CAAC,IAAI;gBACR,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAA;gBACzC,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAsC,CAAA;gBAC3E,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,2DAA2D,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;gBAC5H,OAAO,GAAG,CAAC,OAAO,CAAA;YACpB,CAAC;SACF,CAAC,CAAC;QACH,UAAU,EAAE;YACV,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,GAAG,QAAQ,CAAC,UAAU;SACvB;KACF,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC9F,CAAC;AAED,uEAAuE;AACvE,SAAS,mBAAmB,CAC1B,QAAuB,EACvB,IAAS,EACT,YAAgD;IAEhD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,mBAAmB,CACxB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC;QACJ,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAsC,CAAA;YACjG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAA;YACzH,OAAO,GAAG,CAAC,OAAO,CAAA;QACpB,CAAC;KACF,CAAC,CAAC,CACJ,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,qBAAqB,CAC5B,QAAuB,EACvB,IAAS,EACT,YAAgD;IAEhD,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5E,OAAO,qBAAqB,CAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC;QACJ,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAsC,CAAA;YACjG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;YAC5F,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,CAAA;QACpB,CAAC;KACF,CAAC,CAAC,CACJ,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,CAAuB;IAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACjF,MAAM,SAAS,GAAG,GAAU,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,kDAAkD,CAAC,CAAA;IAC5E,CAAC,CAAA;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,OAAO,CAAC,EAAE,IAAa;QACxB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,IAAI,KAAK;YACP,OAAO,SAAS,EAAE,CAAA;QACpB,CAAC;QACD,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;QAC5C,2EAA2E;QAC3E,GAAG,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAwB;QAC/D,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,gEAAgE;QAChE,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,EAAE,SAAS;KACnB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAAkB,EAClB,OAA+B,EAC/B,GAAG,GAAuC,OAAO,CAAC,GAAG;IAErD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACxB,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;QACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/B,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC;QACjC,OAAO;KACR,CAAA;AACH,CAAC;AAQD,sBAAsB;AACtB,MAAM,UAAU,cAAc,CAAC,IAAuB;IACpD,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,wBAAwB,GAAG,GAAG,CAAA;QAChE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACrD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,kBAAkB,IAAI,EAAE,CAAA;QACvE,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,KAAK,IAAI,mBAAmB,CAAA;QAC5E,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,OAAO,+CAA+C,CAAA;YACzE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAClB,CAAC;;YAAM,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;IAC1B,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;QAAE,OAAO,2CAA2C,CAAA;IAC1H,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,OAAO,CAAC,KAAyB;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,IAAI,CAAC,CAAA;IAClG,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAA;AACrD,CAAC;AAED,SAAS,MAAM,CAAC,GAAiB;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;IAC1F,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC9B,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,OAAO;YACL,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { resolve, sep } from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { COMMAND, isCommand, type Command } from \"./command.ts\"\nimport { httpServerOptions, mcpDeclarations, mcpStdioDeclarations, resolveLocalPrincipal, resolveSecret, SECRET_ENV, type MextConfig } from \"./config.ts\"\nimport { loadInstrumentation, type Instrumentation } from \"./instrumentation.ts\"\nimport { MANIFEST_SCHEMA_VERSION, type BuildManifest, type BuildManifestCommand } from \"./manifest.ts\"\nimport { DEFAULT_HOST, DEFAULT_PORT } from \"./mcp/constants.ts\"\nimport { createMcpFetchHandler, startMcpHttpServer, type McpFetchHandler, type McpHttpOptions } from \"./mcp/http.ts\"\nimport { redirectStdout, serveMcpStdio } from \"./mcp/stdio.ts\"\nimport { createLazyRegistry, type Registry } from \"./registry.ts\"\nimport { createLazyPromptSet, isPrompt, type PromptSet } from \"./prompt.ts\"\nimport { createLazyResourceSet, isResource, type ResourceSet } from \"./resource.ts\"\nimport type { RouteEntry, RouteModule } from \"./route.ts\"\nimport { mextVersion } from \"./version.ts\"\n\n/**\n * @obov/mext/start: .mext/ (mext build 산출) 실행 런타임. 소스 스캔 · TypeScript 없음.\n * 생성 파일 계약 (mext build 가 쓰는 server.js · handler.js, 바꾸면 기존 빌드가 깨진다):\n * server.js process.exitCode = await startFromBuild(new URL(\".\", import.meta.url), { argv: process.argv.slice(2), env: process.env })\n * handler.js export default createFetchHandler(new URL(\".\", import.meta.url))\n *\n * 로드 순서 = manifest.json (검증) → instrumentation.js (register) → config.js → manifest 기반 lazy Registry.\n * 명령어 모듈은 그 명령어를 실행할 때 import (help · tools/list · UNKNOWN_COMMAND · 권한 거부는 import 없음)\n */\n\nexport { mainLocalBin, runLocalBin } from \"./local-bin.ts\"\nexport type { LocalBinOptions } from \"./local-bin.ts\"\n\nexport interface StartOptions {\n /** server.js · mext start 뒤 인자. --stdio · --port <n> · --host <h> */\n argv?: readonly string[]\n /** PORT · HOST. 기본 process.env */\n env?: Record<string, string | undefined>\n /** abort = 종료. 기본 SIGINT · SIGTERM */\n signal?: AbortSignal\n /** 기본 process.stderr */\n stderr?: { write(chunk: string): unknown }\n}\n\nexport interface FetchHandler {\n /**\n * 거부하지 않는다. 초기화 실패 · 내부 오류 = 500 JSON-RPC 오류.\n * rest 중 waitUntil 함수를 가진 객체 (Cloudflare ctx · Vercel 등) = 응답 후 task 실행 유지. 없으면 tasks 확장 미선언 (§10 · §12.6)\n */\n fetch(request: Request, ...rest: unknown[]): Promise<Response>\n}\n\n/** .mext/ 로드 결과 */\nexport interface LoadedBuild {\n manifest: BuildManifest\n config: MextConfig\n registry: Registry\n instrumentation: Instrumentation\n /** manifest.routes → lazy RouteEntry (모듈은 처음 요청에서 import) */\n routes: RouteEntry[]\n}\n\nexport interface LoadBuildOptions {\n /** 명령어 모듈 import (테스트 계측). 기본 = 동적 import */\n importModule?: (href: string) => Promise<unknown>\n}\n\nconst USAGE = \"Usage: mext start [--stdio] [--port <n>] [--host <h>] (node .mext/server.js, PORT · HOST environment variables)\"\n\n/** .mext/ 실행 (mext start · node .mext/server.js). 반환 = exit code */\nexport async function startFromBuild(dir: string | URL, options: StartOptions = {}): Promise<number> {\n const stderr = options.stderr ?? process.stderr\n const env = options.env ?? process.env\n const args = parseStartArgs(options.argv ?? [])\n if (typeof args === \"string\") {\n stderr.write(`error: ${args}\\n${USAGE}\\n`)\n return 2\n }\n // stdio: 사용자 코드 import 전부터 그 외 stdout 쓰기를 stderr 로 (mext dev --stdio 와 같음)\n const redirect = args.stdio ? redirectStdout() : undefined\n const { signal, dispose } = options.signal ? { signal: options.signal, dispose: () => {} } : processSignal()\n try {\n const build = await loadBuild(dir)\n const onerror = (error: Error): void => void stderr.write(`mcp: ${error.message}\\n`)\n if (args.stdio) {\n const server = serveMcpStdio({\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n principal: await resolveLocalPrincipal(build.config, \"stdio\"),\n ...(build.config.app ? { app: build.config.app } : {}),\n ...(build.config.tools ? { tools: build.config.tools } : {}),\n ...mcpStdioDeclarations(build.config, env),\n stdout: redirect!.wire,\n onerror,\n })\n const onAbort = (): void => void server.close()\n if (signal.aborted) onAbort()\n signal.addEventListener(\"abort\", onAbort, { once: true })\n await server.closed\n return 0\n }\n const port = args.port ?? envPort(env.PORT) ?? build.config.server?.port ?? DEFAULT_PORT\n const host = args.host ?? (env.HOST === undefined || env.HOST === \"\" ? undefined : env.HOST) ?? build.config.server?.host ?? DEFAULT_HOST\n const http = httpOptions(build, onerror, env)\n if (resolveSecret(build.config, env) === undefined) {\n stderr.write(\n `warning: no secret (mext.config.ts secret or ${SECRET_ENV}). ctx.ask retries after the first answer fail across instances and restarts\\n`,\n )\n }\n const server = await startMcpHttpServer({ ...http, server: { ...http.server, host, port } })\n stderr.write(`MCP server (Streamable HTTP) listening on ${server.url} (buildId ${build.manifest.buildId})\\n`)\n await new Promise<void>((done) => {\n if (signal.aborted) return done()\n signal.addEventListener(\"abort\", () => done(), { once: true })\n })\n await server.close()\n return 0\n } catch (error) {\n // 시작 실패 = stdout 원복 (stdio 서버를 띄우기 전)\n redirect?.restore()\n stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`)\n return 1\n } finally {\n dispose()\n }\n}\n\n/**\n * handler.js 의 Web fetch handler ({ fetch(request) → Response }). 동기 반환.\n * D7: 초기화 (manifest 검증 · instrumentation register · config · Registry) = 첫 요청에서 1회 (memoized promise).\n * 초기화 실패 = 그 요청 500 + JSON-RPC 오류 (data.loadError), 다음 요청에서 재시도.\n * MCP 처리 (Origin · auth · 헤더 검증 · SSE progress · MRTR) = node 서버와 같은 createMcpFetchHandler\n */\nexport function createFetchHandler(dir: string | URL, options: LoadBuildOptions = {}): FetchHandler {\n const base = dirUrl(dir)\n const onerror = (error: Error): void => console.error(`mcp: ${error.message}`)\n let pending: Promise<McpFetchHandler> | undefined\n const init = (): Promise<McpFetchHandler> =>\n (pending ??= loadBuild(base, options)\n .then((build) => createMcpFetchHandler({ ...httpOptions(build, onerror), taskExecution: \"waitUntil\" }))\n .catch((error: unknown) => {\n pending = undefined\n throw error\n }))\n return {\n async fetch(request, ...rest) {\n let handler: McpFetchHandler\n try {\n handler = await init()\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n onerror(error instanceof Error ? error : new Error(message))\n const body = { jsonrpc: \"2.0\", id: null, error: { code: -32_603, message: \"Server failed to start\", data: { loadError: message } } }\n return new Response(JSON.stringify(body), { status: 500, headers: { \"Content-Type\": \"application/json\" } })\n }\n const waitUntil = findWaitUntil(rest)\n return handler.fetch(request, waitUntil ? { waitUntil } : undefined)\n },\n }\n}\n\n/** fetch(request, ...rest) 의 rest 에서 waitUntil 함수를 가진 객체 (this 유지) */\nfunction findWaitUntil(rest: readonly unknown[]): ((promise: Promise<unknown>) => void) | undefined {\n for (const value of rest) {\n const holder = value as { waitUntil?: unknown } | null\n if (typeof holder === \"object\" && holder !== null && typeof holder.waitUntil === \"function\") {\n const fn = holder.waitUntil as (promise: Promise<unknown>) => void\n return (promise) => fn.call(holder, promise)\n }\n }\n return undefined\n}\n\n/** .mext/manifest.json 읽기 + 검증 (없음 · schemaVersion · mextVersion 불일치 = 오류) */\nexport function readBuildManifest(dir: string | URL): BuildManifest {\n const base = dirUrl(dir)\n let text: string\n try {\n text = readFileSync(new URL(\"manifest.json\", base), \"utf8\")\n } catch {\n throw new Error(`no build found in ${fileURLToPath(base)} (manifest.json missing). Run \"mext build\" first`)\n }\n const manifest = JSON.parse(text) as BuildManifest\n if (manifest.schemaVersion !== MANIFEST_SCHEMA_VERSION) {\n throw new Error(\n `${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${String(MANIFEST_SCHEMA_VERSION)}). Run \"mext build\" again`,\n )\n }\n if (manifest.mextVersion !== mextVersion()) {\n throw new Error(\n `${fileURLToPath(base)} was built with @obov/mext ${manifest.mextVersion}, but ${mextVersion()} is installed. Run \"mext build\" again`,\n )\n }\n return manifest\n}\n\n/** manifest 검증 → instrumentation.js (register, 사용자 코드보다 먼저) → config.js → lazy Registry */\nexport async function loadBuild(dir: string | URL, options: LoadBuildOptions = {}): Promise<LoadedBuild> {\n const base = dirUrl(dir)\n const manifest = readBuildManifest(base)\n const instrumentation = await loadInstrumentation(\n manifest.instrumentation === undefined ? undefined : new URL(manifest.instrumentation, base),\n )\n const config =\n manifest.config === undefined\n ? {}\n : ((await import(new URL(manifest.config, base).href)) as { default: MextConfig }).default\n const registry = registryFromManifest(manifest, base, options)\n return { manifest, config, registry, instrumentation, routes: routesFromManifest(manifest, base, options) }\n}\n\n/** manifest.routes → RouteEntry. 405 = manifest 의 methods 만, 모듈 (routes[].module) 은 load() 에서 import */\nexport function routesFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): RouteEntry[] {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n return (manifest.routes ?? []).map((r) => ({\n path: r.path,\n file: r.file,\n methods: r.methods,\n load: async () => (await importModule(new URL(r.module, base).href)) as RouteModule,\n }))\n}\n\n/**\n * manifest → lazy Registry. 명령어 모듈 (manifest.commands[].module) · 자원 모듈 (resources[].module) ·\n * 프롬프트 모듈 (prompts[].module) 은 load() 에서 import\n */\nexport function registryFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): Registry {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n const resources = resourcesFromManifest(manifest, base, importModule)\n const prompts = promptsFromManifest(manifest, base, importModule)\n const registry = createLazyRegistry({\n commands: manifest.commands.map((c) => ({\n id: c.id,\n command: metadataCommand(c),\n aliases: c.aliases,\n ...(c.file !== undefined ? { file: c.file } : {}),\n inputSchema: c.inputSchema,\n ...(c.outputSchema !== undefined ? { outputSchema: c.outputSchema } : {}),\n async load() {\n const href = new URL(c.module, base).href\n const mod = (await importModule(href)) as { default?: unknown } | undefined\n if (!isCommand(mod?.default)) throw new Error(`${c.module}: default export is not a defineCommand result (command ${c.id})`)\n return mod.default\n },\n })),\n namespaces: [\n ...(manifest.description !== undefined ? [{ id: \"\", description: manifest.description }] : []),\n ...manifest.namespaces,\n ],\n })\n return { ...registry, ...(resources ? { resources } : {}), ...(prompts ? { prompts } : {}) }\n}\n\n/** manifest.prompts → lazy PromptSet. 없거나 비면 undefined (프롬프트 기능 없음) */\nfunction promptsFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): PromptSet | undefined {\n if (!manifest.prompts || manifest.prompts.length === 0) return undefined\n return createLazyPromptSet(\n manifest.prompts.map(({ module, ...p }) => ({\n ...p,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isPrompt(mod?.default)) throw new Error(`${module}: default export is not a definePrompt result (prompt ${p.name})`)\n return mod.default\n },\n })),\n )\n}\n\n/** manifest.resources → lazy ResourceSet. 없거나 비면 undefined (자원 기능 없음) */\nfunction resourcesFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): ResourceSet | undefined {\n if (!manifest.resources || manifest.resources.length === 0) return undefined\n return createLazyResourceSet(\n manifest.resources.map(({ module, ...r }) => ({\n ...r,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isResource(mod?.default) || mod.default.uri !== r.uri) {\n throw new Error(`${module}: default export is not the defineResource result for ${r.uri}`)\n }\n return mod.default\n },\n })),\n )\n}\n\n/**\n * manifest 메타데이터만 있는 Command (RegisteredCommand.command). input · execute 는 모듈 로드 전이라 접근 = 오류\n * (invoke 는 loadCommand 결과를 쓴다)\n */\nfunction metadataCommand(c: BuildManifestCommand): Command {\n const parent = c.id.includes(\".\") ? c.id.slice(0, c.id.lastIndexOf(\".\") + 1) : \"\"\n const notLoaded = (): never => {\n throw new Error(`${c.id}: command module is not loaded (use loadCommand)`)\n }\n return Object.freeze({\n [COMMAND]: true as const,\n description: c.description,\n get input(): never {\n return notLoaded()\n },\n output: undefined,\n readOnly: c.readOnly,\n destructive: c.destructive,\n requiresConfirmation: c.requiresConfirmation,\n // 조건식 = 메타데이터 표시만 (describeCommand 가 \"conditional\" 로 싣는다). 판정은 로드한 모듈의 함수로\n ...(c.needsApproval === \"conditional\" ? { needsApproval: notLoaded } : {}),\n scopes: Object.freeze([...c.scopes]),\n examples: Object.freeze([...c.examples]) as Command[\"examples\"],\n positional: Object.freeze([...c.positional]),\n aliases: Object.freeze(c.aliases.map((a) => (a.startsWith(parent) ? a.slice(parent.length) : a))),\n ...(c.task !== undefined ? { task: Object.freeze({ ttlMs: c.task.ttlMs }) } : {}),\n // expose 판정 = 모듈 import 전 (목록 · UNKNOWN_COMMAND 는 manifest 만으로)\n ...(c.expose !== undefined ? { expose: Object.freeze({ ...c.expose }) } : {}),\n execute: notLoaded,\n })\n}\n\nfunction httpOptions(\n build: LoadedBuild,\n onerror: (error: Error) => void,\n env: Record<string, string | undefined> = process.env,\n): McpHttpOptions {\n const { config } = build\n return {\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n ...(config.app ? { app: config.app } : {}),\n ...(config.auth ? { auth: config.auth } : {}),\n ...(config.tools ? { tools: config.tools } : {}),\n ...(config.oauth ? { oauth: config.oauth } : {}),\n ...(config.routes ? { routeDefaults: config.routes } : {}),\n ...(build.routes.length > 0 ? { routes: build.routes } : {}),\n ...mcpDeclarations(config, env),\n server: httpServerOptions(config),\n onerror,\n }\n}\n\ninterface StartArgs {\n stdio: boolean\n port?: number\n host?: string\n}\n\n/** 반환 문자열 = 사용법 오류 */\nexport function parseStartArgs(argv: readonly string[]): StartArgs | string {\n const args: StartArgs = { stdio: false }\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--stdio\") {\n args.stdio = true\n continue\n }\n if (!tok.startsWith(\"--\")) return `unexpected argument \"${tok}\"`\n const eq = tok.indexOf(\"=\")\n const name = eq < 0 ? tok.slice(2) : tok.slice(2, eq)\n if (name !== \"port\" && name !== \"host\") return `unknown flag --${name}`\n const value = eq < 0 ? argv[++i] : tok.slice(eq + 1)\n if (value === undefined || value === \"\") return `--${name} requires a value`\n if (name === \"port\") {\n const port = Number(value)\n if (!isPort(port)) return \"--port must be an integer between 0 and 65535\"\n args.port = port\n } else args.host = value\n }\n if (args.stdio && (args.port !== undefined || args.host !== undefined)) return \"--port and --host do not apply to --stdio\"\n return args\n}\n\nfunction envPort(value: string | undefined): number | undefined {\n if (value === undefined || value === \"\") return undefined\n const port = Number(value)\n if (!isPort(port)) throw new Error(`PORT must be an integer between 0 and 65535 (got \"${value}\")`)\n return port\n}\n\nfunction isPort(n: number): boolean {\n return Number.isInteger(n) && n >= 0 && n <= 65_535\n}\n\nfunction dirUrl(dir: string | URL): URL {\n if (typeof dir !== \"string\") return dir.href.endsWith(\"/\") ? dir : new URL(`${dir.href}/`)\n const abs = resolve(dir)\n return pathToFileURL(abs.endsWith(sep) ? abs : `${abs}${sep}`)\n}\n\nfunction processSignal(): { signal: AbortSignal; dispose(): void } {\n const controller = new AbortController()\n const abort = (): void => controller.abort()\n process.once(\"SIGINT\", abort)\n process.once(\"SIGTERM\", abort)\n return {\n signal: controller.signal,\n dispose() {\n process.off(\"SIGINT\", abort)\n process.off(\"SIGTERM\", abort)\n },\n }\n}\n"]}
package/dist/suggest.js CHANGED
@@ -3,7 +3,7 @@ export function editDistance(a, b) {
3
3
  const rows = a.length + 1;
4
4
  const cols = b.length + 1;
5
5
  const d = Array.from({ length: rows }, (_, i) => {
6
- const row = new Array(cols).fill(0);
6
+ const row = Array.from({ length: cols }, () => 0);
7
7
  row[0] = i;
8
8
  return row;
9
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../src/suggest.ts"],"names":[],"mappings":"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","sourcesContent":["/** 최적 문자열 정렬 (제한된 Damerau-Levenshtein) 거리 */\nexport function editDistance(a: string, b: string): number {\n const rows = a.length + 1\n const cols = b.length + 1\n const d: number[][] = Array.from({ length: rows }, (_, i) => {\n const row = new Array<number>(cols).fill(0)\n row[0] = i\n return row\n })\n for (let j = 0; j < cols; j++) d[0]![j] = j\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n let v = Math.min(d[i - 1]![j]! + 1, d[i]![j - 1]! + 1, d[i - 1]![j - 1]! + cost)\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) v = Math.min(v, d[i - 2]![j - 2]! + 1)\n d[i]![j] = v\n }\n }\n return d[a.length]![b.length]!\n}\n\n/**\n * 후보 중 query 와 가까운 것 (가까운 순 · 같은 거리는 이름 순).\n * 후보는 [비교할 이름, 돌려줄 값]. 같은 값은 한 번만.\n */\nexport function closest(query: string, candidates: Iterable<readonly [string, string]>, limit = 3): string[] {\n const q = query.toLowerCase()\n const threshold = Math.max(2, Math.floor(q.length / 3))\n const best = new Map<string, number>()\n for (const [name, value] of candidates) {\n const n = name.toLowerCase()\n const distance = editDistance(q, n)\n if (distance > threshold) continue\n const prev = best.get(value)\n if (prev === undefined || distance < prev) best.set(value, distance)\n }\n return [...best]\n .sort((x, y) => x[1] - y[1] || (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0))\n .slice(0, limit)\n .map(([value]) => value)\n}\n"]}
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../src/suggest.ts"],"names":[],"mappings":"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","sourcesContent":["/** 최적 문자열 정렬 (제한된 Damerau-Levenshtein) 거리 */\nexport function editDistance(a: string, b: string): number {\n const rows = a.length + 1\n const cols = b.length + 1\n const d: number[][] = Array.from({ length: rows }, (_, i) => {\n const row = Array.from({ length: cols }, () => 0)\n row[0] = i\n return row\n })\n for (let j = 0; j < cols; j++) d[0]![j] = j\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n let v = Math.min(d[i - 1]![j]! + 1, d[i]![j - 1]! + 1, d[i - 1]![j - 1]! + cost)\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) v = Math.min(v, d[i - 2]![j - 2]! + 1)\n d[i]![j] = v\n }\n }\n return d[a.length]![b.length]!\n}\n\n/**\n * 후보 중 query 와 가까운 것 (가까운 순 · 같은 거리는 이름 순).\n * 후보는 [비교할 이름, 돌려줄 값]. 같은 값은 한 번만.\n */\nexport function closest(query: string, candidates: Iterable<readonly [string, string]>, limit = 3): string[] {\n const q = query.toLowerCase()\n const threshold = Math.max(2, Math.floor(q.length / 3))\n const best = new Map<string, number>()\n for (const [name, value] of candidates) {\n const n = name.toLowerCase()\n const distance = editDistance(q, n)\n if (distance > threshold) continue\n const prev = best.get(value)\n if (prev === undefined || distance < prev) best.set(value, distance)\n }\n return [...best]\n .sort((x, y) => x[1] - y[1] || (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0))\n .slice(0, limit)\n .map(([value]) => value)\n}\n"]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 명령어 타입 생성 (specs/client.md §4). 생성 파일 = 명령어 ID → 명령어 모듈 타입 참조 표:
3
+ * "users.get": CommandTypes<typeof import(<명령어 파일 상대 경로>).default>
4
+ * 입력 · 출력 타입은 TypeScript 가 명령어 정의에서 계산한다 (타입을 코드로 다시 쓰지 않는다).
5
+ * 명령어 모듈을 import 하지 않는다 (파일 트리만: walkCommands). 재생성이 필요한 때 = 파일 추가 · 삭제 · 이름 변경
6
+ */
7
+ /** 기본 생성 파일 (도입 프로젝트 루트 기준) */
8
+ export declare const TYPES_FILE = "mext.gen.ts";
9
+ /**
10
+ * 생성 파일 절대 경로: override (--out) > config.types (true = 기본 파일, 문자열 = 경로) > fallback.
11
+ * 셋 다 없으면 undefined (mext dev · mext build 는 만들지 않는다)
12
+ */
13
+ export declare function resolveTypesPath(cwd: string, types: boolean | string | undefined, override?: string, fallback?: string): string | undefined;
14
+ /** 생성 파일 내용. commandsDir · out = 절대 경로. 정식 ID 만 (별칭 제외), ID 순 */
15
+ export declare function renderTypes(commandsDir: string, out: string): string;
16
+ export interface WriteTypesResult {
17
+ /** 생성 파일 절대 경로 */
18
+ path: string;
19
+ /** 파일 내용이 달랐다 (check = 쓰지 않았다) */
20
+ changed: boolean;
21
+ /** 명령어 수 */
22
+ commands: number;
23
+ }
24
+ /** 생성 파일 쓰기. 내용이 같으면 쓰지 않는다 (mtime 유지). check = 비교만 */
25
+ export declare function writeTypes(commandsDir: string, out: string, options?: {
26
+ check?: boolean;
27
+ }): WriteTypesResult;