@obov/mext 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/build.js +16 -2
  2. package/dist/build.js.map +1 -1
  3. package/dist/cli/args.js +1 -2
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/cli/build.js +22 -2
  6. package/dist/cli/build.js.map +1 -1
  7. package/dist/cli/dev-server.js +3 -2
  8. package/dist/cli/dev-server.js.map +1 -1
  9. package/dist/cli/dev.d.ts +6 -0
  10. package/dist/cli/dev.js +4 -4
  11. package/dist/cli/dev.js.map +1 -1
  12. package/dist/cli/main.js +2 -0
  13. package/dist/cli/main.js.map +1 -1
  14. package/dist/cli/media.d.ts +19 -0
  15. package/dist/cli/media.js +77 -0
  16. package/dist/cli/media.js.map +1 -0
  17. package/dist/cli/run.js +5 -0
  18. package/dist/cli/run.js.map +1 -1
  19. package/dist/cli/serve.d.ts +10 -0
  20. package/dist/cli/serve.js +114 -0
  21. package/dist/cli/serve.js.map +1 -0
  22. package/dist/client/index.d.ts +2 -1
  23. package/dist/client/index.js.map +1 -1
  24. package/dist/client/runner.js +3 -0
  25. package/dist/client/runner.js.map +1 -1
  26. package/dist/client/typed.d.ts +3 -1
  27. package/dist/client/typed.js +39 -3
  28. package/dist/client/typed.js.map +1 -1
  29. package/dist/client/types.d.ts +31 -2
  30. package/dist/client/types.js.map +1 -1
  31. package/dist/config.d.ts +17 -0
  32. package/dist/config.js +36 -1
  33. package/dist/config.js.map +1 -1
  34. package/dist/content.d.ts +65 -0
  35. package/dist/content.js +99 -0
  36. package/dist/content.js.map +1 -0
  37. package/dist/index.d.ts +3 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/invoke.d.ts +4 -0
  41. package/dist/invoke.js +12 -5
  42. package/dist/invoke.js.map +1 -1
  43. package/dist/manifest.d.ts +6 -1
  44. package/dist/manifest.js.map +1 -1
  45. package/dist/mcp/constants.d.ts +2 -0
  46. package/dist/mcp/constants.js +2 -0
  47. package/dist/mcp/constants.js.map +1 -1
  48. package/dist/mcp/dispatch.d.ts +9 -3
  49. package/dist/mcp/dispatch.js +10 -4
  50. package/dist/mcp/dispatch.js.map +1 -1
  51. package/dist/mcp/host.d.ts +14 -0
  52. package/dist/mcp/host.js +48 -0
  53. package/dist/mcp/host.js.map +1 -0
  54. package/dist/mcp/http.d.ts +22 -5
  55. package/dist/mcp/http.js +125 -18
  56. package/dist/mcp/http.js.map +1 -1
  57. package/dist/mcp/index.d.ts +1 -0
  58. package/dist/mcp/index.js +1 -0
  59. package/dist/mcp/index.js.map +1 -1
  60. package/dist/mcp/tasks.js +1 -1
  61. package/dist/mcp/tasks.js.map +1 -1
  62. package/dist/remote/client.d.ts +24 -1
  63. package/dist/remote/client.js +177 -53
  64. package/dist/remote/client.js.map +1 -1
  65. package/dist/remote/index.d.ts +1 -1
  66. package/dist/remote/index.js.map +1 -1
  67. package/dist/route.d.ts +40 -2
  68. package/dist/route.js +128 -8
  69. package/dist/route.js.map +1 -1
  70. package/dist/start.js +3 -2
  71. package/dist/start.js.map +1 -1
  72. package/dist/version-constant.d.ts +1 -1
  73. package/dist/version-constant.js +1 -1
  74. package/dist/version-constant.js.map +1 -1
  75. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { approvalConfigProblem, type ApprovalConfig } from \"./approval.ts\"\nimport { existsSync } from \"node:fs\"\nimport { join, resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport { auditConfigProblem, type AuditConfig } from \"./audit.ts\"\nimport type { CliErrorFormatter } from \"./cli/output.ts\"\nimport type { MextApp } from \"./command.ts\"\nimport { isSegment } from \"./ids.ts\"\nimport type { McpAuthRequest, OAuthResourceOptions } from \"./mcp/http.ts\"\nimport { assertCallerFields, callerFieldsProblem, localPrincipal, type Principal } from \"./principal.ts\"\nimport { stateProblem, type MextState } from \"./state.ts\"\n\n/** mext.config.ts 의 default export */\nexport interface MextConfig {\n /** 명령어 폴더. 설정 파일 위치 (cwd) 기준. 기본 \"commands\" */\n commandsDir?: string\n /** MCP 자원 폴더 (§12.3). 설정 파일 위치 (cwd) 기준. 기본 \"resources\". 폴더 없음 = 자원 없음 */\n resourcesDir?: string\n /** MCP 프롬프트 폴더 (§12.3). 설정 파일 위치 (cwd) 기준. 기본 \"prompts\". 폴더 없음 = 프롬프트 없음 */\n promptsDir?: string\n /**\n * 명령어 타입 생성 파일 (specs/client.md §4). true = ./mext.gen.ts, 문자열 = 그 경로 (프로젝트 루트 기준).\n * 있으면 mext dev · mext build 가 생성한다. 없음 · false = 만들지 않는다 (mext types 는 설정 없이도 동작)\n */\n types?: boolean | string\n /** ctx.app 팩토리. 실행 프로세스당 1회 */\n app?: () => MextApp | Promise<MextApp>\n /**\n * HTTP 전용. 요청마다 주체 생성. 잘못된 토큰 = unauthenticated() throw.\n * req = { authorization, headers, surface, client } (McpAuthRequest). client 는 자가 신고 값 (판정 근거 아님).\n * 반환 Principal 의 actor · surface 가 ctx.caller 의 행위자 · 논리 표면을 정한다 (spec §4)\n */\n auth?: (req: McpAuthRequest) => Principal | Promise<Principal>\n /** MCP 노출 방식. 기본 \"execute\". command = 명령어별 도구 (§12.2) */\n tools?: \"execute\" | \"split\" | \"command\"\n server?: { host?: string; port?: number; allowedOrigins?: string[] }\n /** HTTP 전용. OAuth 보호 자원 메타데이터 (인가 서버 위치). mext login · MCP 클라이언트의 discovery */\n oauth?: OAuthResourceOptions\n /**\n * 로컬 실행 (mext run · 로컬 bin · stdio) 주체. 기본 localPrincipal().\n * 함수 인자 surface = 어댑터 기본 표면 (mext run · 로컬 bin = \"cli\", stdio = \"stdio\"): 표면별로 actor 를 다르게 정할 수 있다\n */\n localPrincipal?: Principal | ((req: LocalPrincipalRequest) => Principal | Promise<Principal>)\n /** 고객 CLI (mext build → .mext/cli/). 없으면 고객 CLI 를 만들지 않는다 */\n cli?: CliConfig\n /** MCP 서버 선언 (serverInfo.name · instructions · capabilities) · stdio 서버 발신 알림 (§6) */\n mcp?: McpConfig\n /**\n * 서버 비밀 (32바이트 이상). MRTR requestState 서명 키 (§12.1). 미지정 = MEXT_SECRET 환경변수, 둘 다 없으면 프로세스별 임의 키.\n * 다중 인스턴스 · 재시작을 넘는 ctx.ask 재시도에 필요\n */\n secret?: string\n /**\n * 도입 프로젝트가 주입하는 저장소 · 메시지 버스 (§12.1). 없으면 stateless.\n * 단일 프로세스 = memoryState(), 다중 인스턴스 = 도입 프로젝트가 구현한 { store, bus }\n */\n state?: MextState\n /** HTTP 경로 폴더 (§12.4). 설정 파일 위치 (cwd) 기준. 기본 \"routes\". 폴더 없음 = route 없음 */\n routesDir?: string\n /**\n * 감사 (§11.1). sink = 변경 명령어 호출 1건마다 AuditEvent 1건 (모든 어댑터). 없으면 감사 없음.\n * mext 는 저장소에 의존하지 않는다: 저장 · 조회는 sink 가 한다\n */\n audit?: AuditConfig\n /**\n * 승인의 표면별 확인 방식 (§4 승인). 없으면 모든 표면 ask (ctx.ask 확인 = requiresConfirmation 의 기존 동작).\n * surfaces: { web: \"client\" } = web 표면은 클라이언트가 확인받고 요청에 확인 표시를 싣는다\n */\n approval?: ApprovalConfig\n}\n\n/** localPrincipal 함수의 인자 */\nexport interface LocalPrincipalRequest {\n /** 어댑터 기본 표면. mext run · 로컬 bin = \"cli\", stdio (mext dev --stdio · mext start --stdio · <bin> mcp serve) = \"stdio\" */\n surface: \"cli\" | \"stdio\"\n}\n\n/** mext.config.ts 의 mcp (§6 서버 선언 · 서버 발신 알림) */\nexport interface McpConfig {\n /** serverInfo.name. 기본 \"mext\" */\n name?: string\n /** initialize · server/discover 결과 instructions */\n instructions?: string\n /** 서버 capabilities 에 병합. experimental 만 (예: { experimental: { \"claude/channel\": {} } }) */\n capabilities?: McpCapabilities\n /**\n * stdio 전용. 연결 하나에 1회 (2025 = notifications/initialized 후, 2026-07-28 = 연결 직후).\n * 반환 함수 = 연결 종료 시 cleanup. HTTP 는 stateless 라 호출하지 않는다\n */\n onConnect?: McpConnectHandler\n /**\n * stdio 프로토콜. auto = 2026-07-28 · 2025 모두, legacy = 2025 만 (server/discover 거부).\n * Claude Code channel 은 2025 연결에서만 알림을 전달. 기본 = experimental[\"claude/channel\"] 선언 시 legacy, 그 외 auto\n */\n stdioEra?: \"auto\" | \"legacy\"\n}\n\nexport interface McpCapabilities {\n experimental?: Record<string, object>\n}\n\n/** stdio 연결. notify = 요청과 무관한 서버 발신 알림 */\nexport interface McpConnection {\n /** 협상된 프로토콜 era */\n readonly era: \"legacy\" | \"modern\"\n /** 연결 종료 후 호출 = reject */\n notify(method: string, params?: Record<string, unknown>): Promise<void>\n /**\n * 클라이언트 발신 알림 수신 (예: notifications/claude/channel/permission_request).\n * SDK 가 처리하는 사양 알림 (initialized · cancelled 등) 은 대상 아님. 같은 method 재등록 = 교체. 반환 = 해제\n */\n onNotification(method: string, handler: (params: Record<string, unknown>) => void | Promise<void>): () => void\n}\n\nexport type McpConnectHandler = (\n conn: McpConnection,\n) => void | (() => void | Promise<void>) | Promise<void | (() => void | Promise<void>)>\n\n/** mext.config.ts 의 cli (§5 고객 CLI 설정) */\nexport interface CliConfig {\n /** 실행 파일 이름 (kebab-case). 환경변수 접두 (MYAPP_TOKEN · MYAPP_URL) · 설정 폴더 (~/.config/<bin>) */\n bin: string\n /** 서버 MCP 엔드포인트 (http(s)). 실행 시 <BIN>_URL 환경변수가 있으면 그 값. local 이면 없음 */\n url?: string\n /** npm 패키지 이름. 기본 = bin */\n packageName?: string\n /** 고객 CLI 버전 (--version · clientInfo). 기본 = 도입 프로젝트 package.json version */\n version?: string\n /** true = 번들 형태 (내장 manifest, 기본), false = 범용 형태 (help · 스키마를 서버에서 조회) */\n manifest?: boolean\n /**\n * 오류 출력 · exit code 커스텀 모듈 (도입 프로젝트 루트 기준 경로). default export = CliErrorFormatter.\n * 고객 CLI bin.js 에 번들, mext run (로컬) 이 import. @obov/mext 는 타입만 import (값 import = 번들 포함)\n */\n errors?: string\n /**\n * true = 로컬 bin (§5). mext build → .mext/bin.js (핸들러를 사용자 PC 에서 실행, .mext/cli/ 없음).\n * 도입 프로젝트 package.json bin { \"<bin>\": \".mext/bin.js\" }. url · packageName · manifest 와 함께 쓸 수 없음\n */\n local?: boolean\n}\n\nexport const CONFIG_FILE = \"mext.config.ts\"\n\nconst CONFIG_KEYS: readonly string[] = [\"commandsDir\", \"app\", \"auth\", \"tools\", \"server\", \"oauth\", \"localPrincipal\", \"cli\", \"mcp\", \"secret\", \"state\", \"resourcesDir\", \"routesDir\", \"promptsDir\", \"audit\", \"approval\", \"types\"]\n\n/** secret 최소 길이 (바이트, HMAC-SHA256 키) */\nexport const SECRET_MIN_BYTES = 32\n/** secret 환경변수 */\nexport const SECRET_ENV = \"MEXT_SECRET\"\nconst MCP_KEYS: readonly string[] = [\"name\", \"instructions\", \"capabilities\", \"onConnect\", \"stdioEra\"]\nconst CLI_KEYS: readonly string[] = [\"bin\", \"url\", \"packageName\", \"version\", \"manifest\", \"errors\", \"local\"]\n/** 고객 CLI 의 내장 명령 (루트 세그먼트로 쓸 수 없음) */\nexport const CLI_BUILTIN_COMMANDS: readonly string[] = [\"help\", \"login\", \"logout\", \"mcp\"]\n/** 로컬 bin (cli.local) 의 내장 명령 */\nexport const LOCAL_BIN_BUILTIN_COMMANDS: readonly string[] = [\"help\", \"mcp\"]\n\n/** 타입 도우미. 값은 그대로 반환 */\nexport function defineConfig(config: MextConfig): MextConfig {\n return config\n}\n\n/** cwd 의 mext.config.ts 를 import. 없으면 {}. 형식이 틀리면 TypeError (모르는 키 포함) */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<MextConfig> {\n const file = join(resolve(cwd), CONFIG_FILE)\n if (!existsSync(file)) return {}\n const mod = (await import(pathToFileURL(file).href)) as { default?: unknown }\n return validateConfig(mod.default)\n}\n\n/** commands/ 절대 경로 */\nexport function resolveCommandsDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.commandsDir ?? \"commands\")\n}\n\n/** resources/ 절대 경로 */\nexport function resolveResourcesDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.resourcesDir ?? \"resources\")\n}\n\n/** prompts/ 절대 경로 */\nexport function resolvePromptsDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.promptsDir ?? \"prompts\")\n}\n\n/** routes/ 절대 경로 */\nexport function resolveRoutesDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.routesDir ?? \"routes\")\n}\n\n/**\n * 로컬 실행 주체: config.localPrincipal (값 · 함수) 또는 localPrincipal().\n * surface = 어댑터 기본 표면 (함수 인자). 함수 결과의 actor · surface 형식 오류 = TypeError\n */\nexport async function resolveLocalPrincipal(config: MextConfig, surface: LocalPrincipalRequest[\"surface\"] = \"cli\"): Promise<Principal> {\n const p = config.localPrincipal\n if (p === undefined) return localPrincipal()\n if (typeof p !== \"function\") return p\n const principal = await p({ surface })\n assertCallerFields(principal, \"localPrincipal\")\n return principal\n}\n\n/**\n * 서버 비밀: config.secret > MEXT_SECRET > undefined (프로세스별 임의 키).\n * 환경변수 값이 짧으면 TypeError (config.secret 은 설정 로드 시 검사)\n */\nexport function resolveSecret(config: MextConfig, env: Record<string, string | undefined> = process.env): string | undefined {\n if (config.secret !== undefined) return config.secret\n const value = env[SECRET_ENV]\n if (value === undefined || value === \"\") return undefined\n if (Buffer.byteLength(value) < SECRET_MIN_BYTES) throw new TypeError(`${SECRET_ENV} must be at least ${SECRET_MIN_BYTES} bytes`)\n return value\n}\n\n/** 서버 선언 (모든 transport): config.mcp 의 name · instructions · capabilities + secret (requestStateKey) + state + audit. onConnect 는 stdio 만 따로 */\nexport function mcpDeclarations(\n config: MextConfig,\n env: Record<string, string | undefined> = process.env,\n): { name?: string; instructions?: string; capabilities?: McpCapabilities; requestStateKey?: string; state?: MextState; audit?: AuditConfig; approval?: ApprovalConfig } {\n const mcp = config.mcp\n const secret = resolveSecret(config, env)\n return {\n ...(mcp?.name !== undefined ? { name: mcp.name } : {}),\n ...(mcp?.instructions !== undefined ? { instructions: mcp.instructions } : {}),\n ...(mcp?.capabilities !== undefined ? { capabilities: mcp.capabilities } : {}),\n ...(secret !== undefined ? { requestStateKey: secret } : {}),\n ...(config.state !== undefined ? { state: config.state } : {}),\n ...(config.audit !== undefined ? { audit: config.audit } : {}),\n ...(config.approval !== undefined ? { approval: config.approval } : {}),\n }\n}\n\n/** stdio 옵션 = 선언 + onConnect */\nexport function mcpStdioDeclarations(\n config: MextConfig,\n env: Record<string, string | undefined> = process.env,\n): ReturnType<typeof mcpDeclarations> & { onConnect?: McpConnectHandler; era?: \"auto\" | \"legacy\" } {\n return {\n ...mcpDeclarations(config, env),\n ...(config.mcp?.onConnect ? { onConnect: config.mcp.onConnect } : {}),\n ...(config.mcp?.stdioEra ? { era: config.mcp.stdioEra } : {}),\n }\n}\n\n/** cli.errors 절대 경로 (없으면 undefined) */\nexport function resolveCliErrorsPath(cwd: string, config: MextConfig): string | undefined {\n return config.cli?.errors === undefined ? undefined : resolve(cwd, config.cli.errors)\n}\n\n/** cli.errors 모듈의 default export (함수). 파일 없음 · default 가 함수 아님 = TypeError */\nexport async function loadCliErrorFormatter(cwd: string, config: MextConfig): Promise<CliErrorFormatter | undefined> {\n const file = resolveCliErrorsPath(cwd, config)\n if (file === undefined) return undefined\n if (!existsSync(file)) throw new TypeError(`${CONFIG_FILE}: cli.errors file not found: ${config.cli!.errors}`)\n const mod = (await import(pathToFileURL(file).href)) as { default?: unknown }\n if (typeof mod.default !== \"function\") throw new TypeError(`${config.cli!.errors}: default export must be a function (CliErrorFormatter)`)\n return mod.default as CliErrorFormatter\n}\n\n/** ctx.app: config.app() 또는 {} */\nexport async function createApp(config: MextConfig): Promise<MextApp> {\n return config.app ? await config.app() : ({} as MextApp)\n}\n\nfunction validateConfig(value: unknown): MextConfig {\n const fail = (message: string): never => {\n throw new TypeError(`${CONFIG_FILE}: ${message}`)\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return fail(\"default export must be an object (export default defineConfig({ ... }))\")\n }\n const c = value as Record<string, unknown>\n const unknown = Object.keys(c).filter((k) => !CONFIG_KEYS.includes(k))\n if (unknown.length > 0) fail(`unknown key${unknown.length === 1 ? \"\" : \"s\"}: ${unknown.join(\", \")}`)\n if (c.commandsDir !== undefined && typeof c.commandsDir !== \"string\") fail(\"commandsDir must be a string\")\n if (c.resourcesDir !== undefined && typeof c.resourcesDir !== \"string\") fail(\"resourcesDir must be a string\")\n if (c.routesDir !== undefined && typeof c.routesDir !== \"string\") fail(\"routesDir must be a string\")\n if (c.promptsDir !== undefined && typeof c.promptsDir !== \"string\") fail(\"promptsDir must be a string\")\n if (c.types !== undefined && typeof c.types !== \"boolean\" && (typeof c.types !== \"string\" || !c.types.endsWith(\".ts\"))) {\n fail('types must be true or a .ts file path (e.g. \"./mext.gen.ts\")')\n }\n if (c.app !== undefined && typeof c.app !== \"function\") fail(\"app must be a function\")\n if (c.auth !== undefined && typeof c.auth !== \"function\") fail(\"auth must be a function\")\n if (c.tools !== undefined && c.tools !== \"execute\" && c.tools !== \"split\" && c.tools !== \"command\") {\n fail('tools must be \"execute\", \"split\" or \"command\"')\n }\n if (c.server !== undefined && (typeof c.server !== \"object\" || c.server === null)) fail(\"server must be an object\")\n if (c.oauth !== undefined) {\n const o = c.oauth as { authorizationServers?: unknown } | null\n if (typeof o !== \"object\" || o === null || !Array.isArray(o.authorizationServers) || o.authorizationServers.length === 0) {\n fail(\"oauth.authorizationServers must be a non-empty array of URLs\")\n }\n }\n const lp = c.localPrincipal\n if (lp !== undefined && typeof lp !== \"function\" && !isPrincipal(lp)) {\n fail(\"localPrincipal must be a Principal ({ id, kind, scopes }) or a function\")\n }\n if (c.secret !== undefined && (typeof c.secret !== \"string\" || Buffer.byteLength(c.secret) < SECRET_MIN_BYTES)) {\n fail(`secret must be a string of at least ${SECRET_MIN_BYTES} bytes`)\n }\n if (c.state !== undefined) {\n const problem = stateProblem(c.state)\n if (problem !== undefined) fail(problem)\n }\n if (c.audit !== undefined) {\n const problem = auditConfigProblem(c.audit)\n if (problem !== undefined) fail(problem)\n }\n if (c.approval !== undefined) {\n const problem = approvalConfigProblem(c.approval)\n if (problem !== undefined) fail(problem)\n }\n if (c.cli !== undefined) validateCli(c.cli, fail)\n if (c.mcp !== undefined) validateMcp(c.mcp, fail)\n return c as MextConfig\n}\n\nfunction validateMcp(value: unknown, fail: (message: string) => never): void {\n if (!isPlainObject(value)) fail(\"mcp must be an object\")\n const mcp = value as Record<string, unknown>\n const unknown = Object.keys(mcp).filter((k) => !MCP_KEYS.includes(k))\n if (unknown.length > 0) fail(`unknown mcp key${unknown.length === 1 ? \"\" : \"s\"}: ${unknown.join(\", \")}`)\n if (mcp.name !== undefined && (typeof mcp.name !== \"string\" || mcp.name.trim() === \"\")) fail(\"mcp.name must be a non-empty string\")\n if (mcp.instructions !== undefined && typeof mcp.instructions !== \"string\") fail(\"mcp.instructions must be a string\")\n if (mcp.onConnect !== undefined && typeof mcp.onConnect !== \"function\") fail(\"mcp.onConnect must be a function\")\n if (mcp.stdioEra !== undefined && mcp.stdioEra !== \"auto\" && mcp.stdioEra !== \"legacy\") fail('mcp.stdioEra must be \"auto\" or \"legacy\"')\n if (mcp.capabilities !== undefined) {\n if (!isPlainObject(mcp.capabilities)) fail(\"mcp.capabilities must be an object ({ experimental })\")\n const caps = mcp.capabilities as Record<string, unknown>\n const other = Object.keys(caps).filter((k) => k !== \"experimental\")\n if (other.length > 0) fail(`mcp.capabilities supports only experimental (got ${other.join(\", \")})`)\n const exp = caps.experimental\n if (exp !== undefined) {\n if (!isPlainObject(exp)) fail(\"mcp.capabilities.experimental must be an object\")\n for (const [key, v] of Object.entries(exp as Record<string, unknown>)) {\n if (!isPlainObject(v)) fail(`mcp.capabilities.experimental[\"${key}\"] must be an object`)\n }\n }\n }\n}\n\nfunction isPlainObject(value: unknown): boolean {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction validateCli(value: unknown, fail: (message: string) => never): void {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) fail(\"cli must be an object ({ bin, url })\")\n const cli = value as Record<string, unknown>\n const unknown = Object.keys(cli).filter((k) => !CLI_KEYS.includes(k))\n if (unknown.length > 0) fail(`unknown cli key${unknown.length === 1 ? \"\" : \"s\"}: ${unknown.join(\", \")}`)\n if (typeof cli.bin !== \"string\" || !isSegment(cli.bin)) fail('cli.bin must be a kebab-case name (e.g. \"myapp\")')\n if (cli.local !== undefined && typeof cli.local !== \"boolean\") fail(\"cli.local must be a boolean\")\n if (cli.local === true) {\n const remoteOnly = [\"url\", \"packageName\", \"manifest\"].filter((k) => cli[k] !== undefined)\n if (remoteOnly.length > 0) fail(`cli.local cannot be combined with ${remoteOnly.map((k) => `cli.${k}`).join(\", \")} (local bin runs handlers, no server)`)\n } else if (typeof cli.url !== \"string\" || !isHttpUrl(cli.url)) {\n fail(\"cli.url must be an http(s) URL of the MCP endpoint (or set cli.local: true for a local bin)\")\n }\n if (cli.packageName !== undefined && (typeof cli.packageName !== \"string\" || !NPM_NAME.test(cli.packageName))) {\n fail('cli.packageName must be an npm package name (e.g. \"@example/myapp-cli\")')\n }\n if (cli.version !== undefined && (typeof cli.version !== \"string\" || cli.version.trim() === \"\")) {\n fail(\"cli.version must be a non-empty string\")\n }\n if (cli.manifest !== undefined && typeof cli.manifest !== \"boolean\") fail(\"cli.manifest must be a boolean\")\n if (cli.errors !== undefined && (typeof cli.errors !== \"string\" || cli.errors.trim() === \"\")) {\n fail('cli.errors must be a module path (e.g. \"./cli-errors.ts\")')\n }\n}\n\n/** npm 패키지 이름 (소문자 · scope 선택) */\nconst NPM_NAME = /^(?:@[a-z0-9][a-z0-9._~-]*\\/)?[a-z0-9][a-z0-9._~-]*$/\n\nfunction isHttpUrl(value: string): boolean {\n if (!/^https?:\\/\\//i.test(value)) return false\n try {\n new URL(value)\n return true\n } catch {\n return false\n }\n}\n\nfunction isPrincipal(value: unknown): value is Principal {\n const p = value as Partial<Principal> | null\n return (\n typeof p === \"object\" &&\n p !== null &&\n typeof p.id === \"string\" &&\n (p.kind === \"local\" || p.kind === \"token\" || p.kind === \"anonymous\") &&\n Array.isArray(p.scopes) &&\n callerFieldsProblem(p) === undefined\n )\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { approvalConfigProblem, type ApprovalConfig } from \"./approval.ts\"\nimport { existsSync } from \"node:fs\"\nimport { join, resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport { auditConfigProblem, type AuditConfig } from \"./audit.ts\"\nimport type { CliErrorFormatter } from \"./cli/output.ts\"\nimport type { MextApp } from \"./command.ts\"\nimport { isSegment } from \"./ids.ts\"\nimport { allowedHostProblem } from \"./mcp/host.ts\"\nimport type { McpAuthRequest, OAuthResourceOptions } from \"./mcp/http.ts\"\nimport { assertCallerFields, callerFieldsProblem, localPrincipal, type Principal } from \"./principal.ts\"\nimport { routeOptionsProblem, type RouteOptions } from \"./route.ts\"\nimport { stateProblem, type MextState } from \"./state.ts\"\n\n/** mext.config.ts 의 default export */\nexport interface MextConfig {\n /** 명령어 폴더. 설정 파일 위치 (cwd) 기준. 기본 \"commands\" */\n commandsDir?: string\n /** MCP 자원 폴더 (§12.3). 설정 파일 위치 (cwd) 기준. 기본 \"resources\". 폴더 없음 = 자원 없음 */\n resourcesDir?: string\n /** MCP 프롬프트 폴더 (§12.3). 설정 파일 위치 (cwd) 기준. 기본 \"prompts\". 폴더 없음 = 프롬프트 없음 */\n promptsDir?: string\n /**\n * 명령어 타입 생성 파일 (specs/client.md §4). true = ./mext.gen.ts, 문자열 = 그 경로 (프로젝트 루트 기준).\n * 있으면 mext dev · mext build 가 생성한다. 없음 · false = 만들지 않는다 (mext types 는 설정 없이도 동작)\n */\n types?: boolean | string\n /** ctx.app 팩토리. 실행 프로세스당 1회 */\n app?: () => MextApp | Promise<MextApp>\n /**\n * HTTP 전용. 요청마다 주체 생성. 잘못된 토큰 = unauthenticated() throw.\n * req = { authorization, headers, surface, client } (McpAuthRequest). client 는 자가 신고 값 (판정 근거 아님).\n * 반환 Principal 의 actor · surface 가 ctx.caller 의 행위자 · 논리 표면을 정한다 (spec §4)\n */\n auth?: (req: McpAuthRequest) => Principal | Promise<Principal>\n /** MCP 노출 방식. 기본 \"execute\". command = 명령어별 도구 (§12.2) */\n tools?: \"execute\" | \"split\" | \"command\"\n /**\n * HTTP 서버. maxBodyBytes = POST /mcp 본문 상한 (기본 4 MiB). routes/ 는 상한 없음 (route 의 export maxBodyBytes = true 가 이 값을 쓴다)\n */\n server?: { host?: string; port?: number; allowedOrigins?: string[]; allowedHosts?: string[]; maxBodyBytes?: number }\n /** HTTP 전용. OAuth 보호 자원 메타데이터 (인가 서버 위치). mext login · MCP 클라이언트의 discovery */\n oauth?: OAuthResourceOptions\n /**\n * 로컬 실행 (mext run · 로컬 bin · stdio) 주체. 기본 localPrincipal().\n * 함수 인자 surface = 어댑터 기본 표면 (mext run · 로컬 bin = \"cli\", stdio = \"stdio\"): 표면별로 actor 를 다르게 정할 수 있다\n */\n localPrincipal?: Principal | ((req: LocalPrincipalRequest) => Principal | Promise<Principal>)\n /** 고객 CLI (mext build → .mext/cli/). 없으면 고객 CLI 를 만들지 않는다 */\n cli?: CliConfig\n /** MCP 서버 선언 (serverInfo.name · instructions · capabilities) · stdio 서버 발신 알림 (§6) */\n mcp?: McpConfig\n /**\n * 서버 비밀 (32바이트 이상). MRTR requestState 서명 키 (§12.1). 미지정 = MEXT_SECRET 환경변수, 둘 다 없으면 프로세스별 임의 키.\n * 다중 인스턴스 · 재시작을 넘는 ctx.ask 재시도에 필요\n */\n secret?: string\n /**\n * 도입 프로젝트가 주입하는 저장소 · 메시지 버스 (§12.1). 없으면 stateless.\n * 단일 프로세스 = memoryState(), 다중 인스턴스 = 도입 프로젝트가 구현한 { store, bus }\n */\n state?: MextState\n /** HTTP 경로 폴더 (§12.4). 설정 파일 위치 (cwd) 기준. 기본 \"routes\". 폴더 없음 = route 없음 */\n routesDir?: string\n /**\n * 모든 route 의 auth · origin · maxBodyBytes 기본값 (§12.4). route 모듈의 export 가 있으면 그 값 (false 포함).\n * 없음 = route 마다 export 로 켠다 (기본 = 인증 · Origin 검사 · 본문 상한 없음)\n */\n routes?: RouteOptions\n /**\n * 감사 (§11.1). sink = 변경 명령어 호출 1건마다 AuditEvent 1건 (모든 어댑터). 없으면 감사 없음.\n * mext 는 저장소에 의존하지 않는다: 저장 · 조회는 sink 가 한다\n */\n audit?: AuditConfig\n /**\n * 승인의 표면별 확인 방식 (§4 승인). 없으면 모든 표면 ask (ctx.ask 확인 = requiresConfirmation 의 기존 동작).\n * surfaces: { web: \"client\" } = web 표면은 클라이언트가 확인받고 요청에 확인 표시를 싣는다\n */\n approval?: ApprovalConfig\n}\n\n/** localPrincipal 함수의 인자 */\nexport interface LocalPrincipalRequest {\n /** 어댑터 기본 표면. mext run · 로컬 bin = \"cli\", stdio (mext dev --stdio · mext start --stdio · <bin> mcp serve) = \"stdio\" */\n surface: \"cli\" | \"stdio\"\n}\n\n/** mext.config.ts 의 mcp (§6 서버 선언 · 서버 발신 알림) */\nexport interface McpConfig {\n /** serverInfo.name. 기본 \"mext\" */\n name?: string\n /** initialize · server/discover 결과 instructions */\n instructions?: string\n /** 서버 capabilities 에 병합. experimental 만 (예: { experimental: { \"claude/channel\": {} } }) */\n capabilities?: McpCapabilities\n /**\n * stdio 전용. 연결 하나에 1회 (2025 = notifications/initialized 후, 2026-07-28 = 연결 직후).\n * 반환 함수 = 연결 종료 시 cleanup. HTTP 는 stateless 라 호출하지 않는다\n */\n onConnect?: McpConnectHandler\n /**\n * stdio 프로토콜. auto = 2026-07-28 · 2025 모두, legacy = 2025 만 (server/discover 거부).\n * Claude Code channel 은 2025 연결에서만 알림을 전달. 기본 = experimental[\"claude/channel\"] 선언 시 legacy, 그 외 auto\n */\n stdioEra?: \"auto\" | \"legacy\"\n}\n\nexport interface McpCapabilities {\n experimental?: Record<string, object>\n}\n\n/** stdio 연결. notify = 요청과 무관한 서버 발신 알림 */\nexport interface McpConnection {\n /** 협상된 프로토콜 era */\n readonly era: \"legacy\" | \"modern\"\n /** 연결 종료 후 호출 = reject */\n notify(method: string, params?: Record<string, unknown>): Promise<void>\n /**\n * 클라이언트 발신 알림 수신 (예: notifications/claude/channel/permission_request).\n * SDK 가 처리하는 사양 알림 (initialized · cancelled 등) 은 대상 아님. 같은 method 재등록 = 교체. 반환 = 해제\n */\n onNotification(method: string, handler: (params: Record<string, unknown>) => void | Promise<void>): () => void\n}\n\nexport type McpConnectHandler = (\n conn: McpConnection,\n) => void | (() => void | Promise<void>) | Promise<void | (() => void | Promise<void>)>\n\n/** mext.config.ts 의 cli (§5 고객 CLI 설정) */\nexport interface CliConfig {\n /** 실행 파일 이름 (kebab-case). 환경변수 접두 (MYAPP_TOKEN · MYAPP_URL) · 설정 폴더 (~/.config/<bin>) */\n bin: string\n /** 서버 MCP 엔드포인트 (http(s)). 실행 시 <BIN>_URL 환경변수가 있으면 그 값. local 이면 없음 */\n url?: string\n /** npm 패키지 이름. 기본 = bin */\n packageName?: string\n /** 고객 CLI 버전 (--version · clientInfo). 기본 = 도입 프로젝트 package.json version */\n version?: string\n /** true = 번들 형태 (내장 manifest, 기본), false = 범용 형태 (help · 스키마를 서버에서 조회) */\n manifest?: boolean\n /**\n * 오류 출력 · exit code 커스텀 모듈 (도입 프로젝트 루트 기준 경로). default export = CliErrorFormatter.\n * 고객 CLI bin.js 에 번들, mext run (로컬) 이 import. @obov/mext 는 타입만 import (값 import = 번들 포함)\n */\n errors?: string\n /**\n * true = 로컬 bin (§5). mext build → .mext/bin.js (핸들러를 사용자 PC 에서 실행, .mext/cli/ 없음).\n * 도입 프로젝트 package.json bin { \"<bin>\": \".mext/bin.js\" }. url · packageName · manifest 와 함께 쓸 수 없음\n */\n local?: boolean\n}\n\nexport const CONFIG_FILE = \"mext.config.ts\"\n\nconst CONFIG_KEYS: readonly string[] = [\"commandsDir\", \"app\", \"auth\", \"tools\", \"server\", \"oauth\", \"localPrincipal\", \"cli\", \"mcp\", \"secret\", \"state\", \"resourcesDir\", \"routesDir\", \"routes\", \"promptsDir\", \"audit\", \"approval\", \"types\"]\n\n/** secret 최소 길이 (바이트, HMAC-SHA256 키) */\nexport const SECRET_MIN_BYTES = 32\n/** secret 환경변수 */\nexport const SECRET_ENV = \"MEXT_SECRET\"\nconst MCP_KEYS: readonly string[] = [\"name\", \"instructions\", \"capabilities\", \"onConnect\", \"stdioEra\"]\nconst CLI_KEYS: readonly string[] = [\"bin\", \"url\", \"packageName\", \"version\", \"manifest\", \"errors\", \"local\"]\n/** 고객 CLI 의 내장 명령 (루트 세그먼트로 쓸 수 없음) */\nexport const CLI_BUILTIN_COMMANDS: readonly string[] = [\"help\", \"login\", \"logout\", \"mcp\"]\n/** 로컬 bin (cli.local) 의 내장 명령 */\nexport const LOCAL_BIN_BUILTIN_COMMANDS: readonly string[] = [\"help\", \"mcp\"]\n\n/** 타입 도우미. 값은 그대로 반환 */\nexport function defineConfig(config: MextConfig): MextConfig {\n return config\n}\n\n/** cwd 의 mext.config.ts 를 import. 없으면 {}. 형식이 틀리면 TypeError (모르는 키 포함) */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<MextConfig> {\n const file = join(resolve(cwd), CONFIG_FILE)\n if (!existsSync(file)) return {}\n const mod = (await import(pathToFileURL(file).href)) as { default?: unknown }\n return validateConfig(mod.default)\n}\n\n/** commands/ 절대 경로 */\nexport function resolveCommandsDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.commandsDir ?? \"commands\")\n}\n\n/** resources/ 절대 경로 */\nexport function resolveResourcesDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.resourcesDir ?? \"resources\")\n}\n\n/** prompts/ 절대 경로 */\nexport function resolvePromptsDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.promptsDir ?? \"prompts\")\n}\n\n/** routes/ 절대 경로 */\nexport function resolveRoutesDir(cwd: string, config: MextConfig): string {\n return resolve(cwd, config.routesDir ?? \"routes\")\n}\n\n/**\n * 로컬 실행 주체: config.localPrincipal (값 · 함수) 또는 localPrincipal().\n * surface = 어댑터 기본 표면 (함수 인자). 함수 결과의 actor · surface 형식 오류 = TypeError\n */\nexport async function resolveLocalPrincipal(config: MextConfig, surface: LocalPrincipalRequest[\"surface\"] = \"cli\"): Promise<Principal> {\n const p = config.localPrincipal\n if (p === undefined) return localPrincipal()\n if (typeof p !== \"function\") return p\n const principal = await p({ surface })\n assertCallerFields(principal, \"localPrincipal\")\n return principal\n}\n\n/**\n * 서버 비밀: config.secret > MEXT_SECRET > undefined (프로세스별 임의 키).\n * 환경변수 값이 짧으면 TypeError (config.secret 은 설정 로드 시 검사)\n */\nexport function resolveSecret(config: MextConfig, env: Record<string, string | undefined> = process.env): string | undefined {\n if (config.secret !== undefined) return config.secret\n const value = env[SECRET_ENV]\n if (value === undefined || value === \"\") return undefined\n if (Buffer.byteLength(value) < SECRET_MIN_BYTES) throw new TypeError(`${SECRET_ENV} must be at least ${SECRET_MIN_BYTES} bytes`)\n return value\n}\n\n/** 서버 선언 (모든 transport): config.mcp 의 name · instructions · capabilities + secret (requestStateKey) + state + audit. onConnect 는 stdio 만 따로 */\nexport function mcpDeclarations(\n config: MextConfig,\n env: Record<string, string | undefined> = process.env,\n): { name?: string; instructions?: string; capabilities?: McpCapabilities; requestStateKey?: string; state?: MextState; audit?: AuditConfig; approval?: ApprovalConfig } {\n const mcp = config.mcp\n const secret = resolveSecret(config, env)\n return {\n ...(mcp?.name !== undefined ? { name: mcp.name } : {}),\n ...(mcp?.instructions !== undefined ? { instructions: mcp.instructions } : {}),\n ...(mcp?.capabilities !== undefined ? { capabilities: mcp.capabilities } : {}),\n ...(secret !== undefined ? { requestStateKey: secret } : {}),\n ...(config.state !== undefined ? { state: config.state } : {}),\n ...(config.audit !== undefined ? { audit: config.audit } : {}),\n ...(config.approval !== undefined ? { approval: config.approval } : {}),\n }\n}\n\n/** HTTP 처리기의 server 옵션 (host · port 제외): allowedOrigins · allowedHosts · maxBodyBytes */\nexport function httpServerOptions(config: MextConfig): { allowedOrigins?: string[]; allowedHosts?: string[]; maxBodyBytes?: number } {\n const server = config.server\n return {\n ...(server?.allowedOrigins ? { allowedOrigins: server.allowedOrigins } : {}),\n ...(server?.allowedHosts ? { allowedHosts: server.allowedHosts } : {}),\n ...(server?.maxBodyBytes !== undefined ? { maxBodyBytes: server.maxBodyBytes } : {}),\n }\n}\n\n/** stdio 옵션 = 선언 + onConnect */\nexport function mcpStdioDeclarations(\n config: MextConfig,\n env: Record<string, string | undefined> = process.env,\n): ReturnType<typeof mcpDeclarations> & { onConnect?: McpConnectHandler; era?: \"auto\" | \"legacy\" } {\n return {\n ...mcpDeclarations(config, env),\n ...(config.mcp?.onConnect ? { onConnect: config.mcp.onConnect } : {}),\n ...(config.mcp?.stdioEra ? { era: config.mcp.stdioEra } : {}),\n }\n}\n\n/** cli.errors 절대 경로 (없으면 undefined) */\nexport function resolveCliErrorsPath(cwd: string, config: MextConfig): string | undefined {\n return config.cli?.errors === undefined ? undefined : resolve(cwd, config.cli.errors)\n}\n\n/** cli.errors 모듈의 default export (함수). 파일 없음 · default 가 함수 아님 = TypeError */\nexport async function loadCliErrorFormatter(cwd: string, config: MextConfig): Promise<CliErrorFormatter | undefined> {\n const file = resolveCliErrorsPath(cwd, config)\n if (file === undefined) return undefined\n if (!existsSync(file)) throw new TypeError(`${CONFIG_FILE}: cli.errors file not found: ${config.cli!.errors}`)\n const mod = (await import(pathToFileURL(file).href)) as { default?: unknown }\n if (typeof mod.default !== \"function\") throw new TypeError(`${config.cli!.errors}: default export must be a function (CliErrorFormatter)`)\n return mod.default as CliErrorFormatter\n}\n\n/** ctx.app: config.app() 또는 {} */\nexport async function createApp(config: MextConfig): Promise<MextApp> {\n return config.app ? await config.app() : ({} as MextApp)\n}\n\nfunction validateConfig(value: unknown): MextConfig {\n const fail = (message: string): never => {\n throw new TypeError(`${CONFIG_FILE}: ${message}`)\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return fail(\"default export must be an object (export default defineConfig({ ... }))\")\n }\n const c = value as Record<string, unknown>\n const unknown = Object.keys(c).filter((k) => !CONFIG_KEYS.includes(k))\n if (unknown.length > 0) fail(`unknown key${unknown.length === 1 ? \"\" : \"s\"}: ${unknown.join(\", \")}`)\n if (c.commandsDir !== undefined && typeof c.commandsDir !== \"string\") fail(\"commandsDir must be a string\")\n if (c.resourcesDir !== undefined && typeof c.resourcesDir !== \"string\") fail(\"resourcesDir must be a string\")\n if (c.routesDir !== undefined && typeof c.routesDir !== \"string\") fail(\"routesDir must be a string\")\n if (c.routes !== undefined) {\n if (typeof c.routes !== \"object\" || c.routes === null || Array.isArray(c.routes)) fail(\"routes must be an object ({ auth, origin, maxBodyBytes })\")\n const extra = Object.keys(c.routes as object).filter((k) => k !== \"auth\" && k !== \"origin\" && k !== \"maxBodyBytes\")\n if (extra.length > 0) fail(`routes: unknown key${extra.length === 1 ? \"\" : \"s\"}: ${extra.join(\", \")} (auth · origin · maxBodyBytes)`)\n const problem = routeOptionsProblem(c.routes as Record<string, unknown>)\n if (problem !== undefined) fail(problem.replace(/^export /, \"routes.\"))\n }\n if (c.promptsDir !== undefined && typeof c.promptsDir !== \"string\") fail(\"promptsDir must be a string\")\n if (c.types !== undefined && typeof c.types !== \"boolean\" && (typeof c.types !== \"string\" || !c.types.endsWith(\".ts\"))) {\n fail('types must be true or a .ts file path (e.g. \"./mext.gen.ts\")')\n }\n if (c.app !== undefined && typeof c.app !== \"function\") fail(\"app must be a function\")\n if (c.auth !== undefined && typeof c.auth !== \"function\") fail(\"auth must be a function\")\n if (c.tools !== undefined && c.tools !== \"execute\" && c.tools !== \"split\" && c.tools !== \"command\") {\n fail('tools must be \"execute\", \"split\" or \"command\"')\n }\n if (c.server !== undefined && (typeof c.server !== \"object\" || c.server === null)) fail(\"server must be an object\")\n const maxBodyBytes = (c.server as { maxBodyBytes?: unknown } | undefined)?.maxBodyBytes\n if (maxBodyBytes !== undefined && !isPositiveInteger(maxBodyBytes)) fail(\"server.maxBodyBytes must be a positive integer (bytes)\")\n const allowedHosts = (c.server as { allowedHosts?: unknown } | undefined)?.allowedHosts\n if (allowedHosts !== undefined) {\n if (!Array.isArray(allowedHosts)) fail('server.allowedHosts must be an array (\"api.example.com\", \"api.example.com:8443\", \"loopback\", \"*\")')\n const problem = (allowedHosts as unknown[]).map(allowedHostProblem).find((p) => p !== undefined)\n if (problem !== undefined) fail(`server.allowedHosts: ${problem} (use a host name, host:port, \"loopback\" or \"*\")`)\n }\n if (c.oauth !== undefined) {\n const o = c.oauth as { authorizationServers?: unknown } | null\n if (typeof o !== \"object\" || o === null || !Array.isArray(o.authorizationServers) || o.authorizationServers.length === 0) {\n fail(\"oauth.authorizationServers must be a non-empty array of URLs\")\n }\n }\n const lp = c.localPrincipal\n if (lp !== undefined && typeof lp !== \"function\" && !isPrincipal(lp)) {\n fail(\"localPrincipal must be a Principal ({ id, kind, scopes }) or a function\")\n }\n if (c.secret !== undefined && (typeof c.secret !== \"string\" || Buffer.byteLength(c.secret) < SECRET_MIN_BYTES)) {\n fail(`secret must be a string of at least ${SECRET_MIN_BYTES} bytes`)\n }\n if (c.state !== undefined) {\n const problem = stateProblem(c.state)\n if (problem !== undefined) fail(problem)\n }\n if (c.audit !== undefined) {\n const problem = auditConfigProblem(c.audit)\n if (problem !== undefined) fail(problem)\n }\n if (c.approval !== undefined) {\n const problem = approvalConfigProblem(c.approval)\n if (problem !== undefined) fail(problem)\n }\n if (c.cli !== undefined) validateCli(c.cli, fail)\n if (c.mcp !== undefined) validateMcp(c.mcp, fail)\n return c as MextConfig\n}\n\nfunction validateMcp(value: unknown, fail: (message: string) => never): void {\n if (!isPlainObject(value)) fail(\"mcp must be an object\")\n const mcp = value as Record<string, unknown>\n const unknown = Object.keys(mcp).filter((k) => !MCP_KEYS.includes(k))\n if (unknown.length > 0) fail(`unknown mcp key${unknown.length === 1 ? \"\" : \"s\"}: ${unknown.join(\", \")}`)\n if (mcp.name !== undefined && (typeof mcp.name !== \"string\" || mcp.name.trim() === \"\")) fail(\"mcp.name must be a non-empty string\")\n if (mcp.instructions !== undefined && typeof mcp.instructions !== \"string\") fail(\"mcp.instructions must be a string\")\n if (mcp.onConnect !== undefined && typeof mcp.onConnect !== \"function\") fail(\"mcp.onConnect must be a function\")\n if (mcp.stdioEra !== undefined && mcp.stdioEra !== \"auto\" && mcp.stdioEra !== \"legacy\") fail('mcp.stdioEra must be \"auto\" or \"legacy\"')\n if (mcp.capabilities !== undefined) {\n if (!isPlainObject(mcp.capabilities)) fail(\"mcp.capabilities must be an object ({ experimental })\")\n const caps = mcp.capabilities as Record<string, unknown>\n const other = Object.keys(caps).filter((k) => k !== \"experimental\")\n if (other.length > 0) fail(`mcp.capabilities supports only experimental (got ${other.join(\", \")})`)\n const exp = caps.experimental\n if (exp !== undefined) {\n if (!isPlainObject(exp)) fail(\"mcp.capabilities.experimental must be an object\")\n for (const [key, v] of Object.entries(exp as Record<string, unknown>)) {\n if (!isPlainObject(v)) fail(`mcp.capabilities.experimental[\"${key}\"] must be an object`)\n }\n }\n }\n}\n\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0\n}\n\nfunction isPlainObject(value: unknown): boolean {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction validateCli(value: unknown, fail: (message: string) => never): void {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) fail(\"cli must be an object ({ bin, url })\")\n const cli = value as Record<string, unknown>\n const unknown = Object.keys(cli).filter((k) => !CLI_KEYS.includes(k))\n if (unknown.length > 0) fail(`unknown cli key${unknown.length === 1 ? \"\" : \"s\"}: ${unknown.join(\", \")}`)\n if (typeof cli.bin !== \"string\" || !isSegment(cli.bin)) fail('cli.bin must be a kebab-case name (e.g. \"myapp\")')\n if (cli.local !== undefined && typeof cli.local !== \"boolean\") fail(\"cli.local must be a boolean\")\n if (cli.local === true) {\n const remoteOnly = [\"url\", \"packageName\", \"manifest\"].filter((k) => cli[k] !== undefined)\n if (remoteOnly.length > 0) fail(`cli.local cannot be combined with ${remoteOnly.map((k) => `cli.${k}`).join(\", \")} (local bin runs handlers, no server)`)\n } else if (typeof cli.url !== \"string\" || !isHttpUrl(cli.url)) {\n fail(\"cli.url must be an http(s) URL of the MCP endpoint (or set cli.local: true for a local bin)\")\n }\n if (cli.packageName !== undefined && (typeof cli.packageName !== \"string\" || !NPM_NAME.test(cli.packageName))) {\n fail('cli.packageName must be an npm package name (e.g. \"@example/myapp-cli\")')\n }\n if (cli.version !== undefined && (typeof cli.version !== \"string\" || cli.version.trim() === \"\")) {\n fail(\"cli.version must be a non-empty string\")\n }\n if (cli.manifest !== undefined && typeof cli.manifest !== \"boolean\") fail(\"cli.manifest must be a boolean\")\n if (cli.errors !== undefined && (typeof cli.errors !== \"string\" || cli.errors.trim() === \"\")) {\n fail('cli.errors must be a module path (e.g. \"./cli-errors.ts\")')\n }\n}\n\n/** npm 패키지 이름 (소문자 · scope 선택) */\nconst NPM_NAME = /^(?:@[a-z0-9][a-z0-9._~-]*\\/)?[a-z0-9][a-z0-9._~-]*$/\n\nfunction isHttpUrl(value: string): boolean {\n if (!/^https?:\\/\\//i.test(value)) return false\n try {\n new URL(value)\n return true\n } catch {\n return false\n }\n}\n\nfunction isPrincipal(value: unknown): value is Principal {\n const p = value as Partial<Principal> | null\n return (\n typeof p === \"object\" &&\n p !== null &&\n typeof p.id === \"string\" &&\n (p.kind === \"local\" || p.kind === \"token\" || p.kind === \"anonymous\") &&\n Array.isArray(p.scopes) &&\n callerFieldsProblem(p) === undefined\n )\n}\n"]}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * 결과 콘텐츠 (spec §4): 핸들러가 값과 별도로 돌려주는 이미지 · 오디오 · 자원 링크.
3
+ * MCP = content 블록 (image · audio · resource_link), CLI = 파일 저장 · 경로 출력, 타입 client = onContent.
4
+ * 값 (structuredContent · --json · output 검증 · 감사 result) 과 섞이지 않는다
5
+ */
6
+ /** MCP ImageContent. data = base64 */
7
+ export interface ImageContent {
8
+ type: "image";
9
+ data: string;
10
+ mimeType: string;
11
+ }
12
+ /** MCP AudioContent. data = base64 */
13
+ export interface AudioContent {
14
+ type: "audio";
15
+ data: string;
16
+ mimeType: string;
17
+ }
18
+ /** MCP ResourceLink */
19
+ export interface ResourceLinkContent {
20
+ type: "resource_link";
21
+ uri: string;
22
+ name: string;
23
+ title?: string;
24
+ description?: string;
25
+ mimeType?: string;
26
+ /** 바이트 */
27
+ size?: number;
28
+ }
29
+ /** 결과 콘텐츠 블록 (MCP content 블록 모양 그대로) */
30
+ export type ContentBlock = ImageContent | AudioContent | ResourceLinkContent;
31
+ declare const CONTENT: unique symbol;
32
+ declare const CONTENT_RESULT: unique symbol;
33
+ /** image · audio · resourceLink 의 반환값. JSON = 블록 모양 (표시는 symbol 키라 직렬화되지 않는다) */
34
+ export type Content<B extends ContentBlock = ContentBlock> = Readonly<B> & {
35
+ readonly [CONTENT]: true;
36
+ };
37
+ /** withContent 의 반환값: 값 + 콘텐츠 */
38
+ export interface ContentResult<T> {
39
+ readonly [CONTENT_RESULT]: true;
40
+ readonly value: T;
41
+ readonly content: readonly Content[];
42
+ }
43
+ /** execute 반환 타입 → 값 타입 (withContent = 그 값, 콘텐츠만 = undefined). 타입 client 의 CommandTypes 가 쓴다 */
44
+ export type ResultValue<R> = R extends ContentResult<infer V> ? V : R extends Content ? undefined : R;
45
+ /** 바이너리 입력: Uint8Array (Buffer 포함) · ArrayBuffer · base64 문자열 */
46
+ export type BinaryData = Uint8Array | ArrayBuffer | string;
47
+ /** image/png 등. mimeType 은 image/* */
48
+ export declare function image(data: BinaryData, mimeType: string): Content<ImageContent>;
49
+ /** audio/wav 등. mimeType 은 audio/* */
50
+ export declare function audio(data: BinaryData, mimeType: string): Content<AudioContent>;
51
+ /** 자원 링크 (MCP resource_link). uri = 절대 URI, name = 표시 이름 */
52
+ export declare function resourceLink(link: Omit<ResourceLinkContent, "type">): Content<ResourceLinkContent>;
53
+ /** 값 + 콘텐츠. 빈 목록 = 값만 반환한 것과 같다 */
54
+ export declare function withContent<T>(value: T, content: readonly Content[]): ContentResult<T>;
55
+ export declare function isContent(value: unknown): value is Content;
56
+ export declare function isContentResult(value: unknown): value is ContentResult<unknown>;
57
+ /**
58
+ * execute 반환값 → 값 · 콘텐츠 블록. 콘텐츠 하나 = 값 undefined, withContent = 그 값 + 블록, 그 외 = 값 그대로 (content 없음).
59
+ * 블록 = 표시 없는 plain 객체 (MCP content 그대로)
60
+ */
61
+ export declare function splitResult(raw: unknown): {
62
+ value: unknown;
63
+ content?: ContentBlock[];
64
+ };
65
+ export {};
@@ -0,0 +1,99 @@
1
+ /**
2
+ * 결과 콘텐츠 (spec §4): 핸들러가 값과 별도로 돌려주는 이미지 · 오디오 · 자원 링크.
3
+ * MCP = content 블록 (image · audio · resource_link), CLI = 파일 저장 · 경로 출력, 타입 client = onContent.
4
+ * 값 (structuredContent · --json · output 검증 · 감사 result) 과 섞이지 않는다
5
+ */
6
+ const CONTENT = Symbol.for("@obov/mext/content");
7
+ const CONTENT_RESULT = Symbol.for("@obov/mext/content-result");
8
+ /** image/png 등. mimeType 은 image/* */
9
+ export function image(data, mimeType) {
10
+ return brand({ type: "image", data: base64Of(data, "image"), mimeType: mediaType(mimeType, "image") });
11
+ }
12
+ /** audio/wav 등. mimeType 은 audio/* */
13
+ export function audio(data, mimeType) {
14
+ return brand({ type: "audio", data: base64Of(data, "audio"), mimeType: mediaType(mimeType, "audio") });
15
+ }
16
+ /** 자원 링크 (MCP resource_link). uri = 절대 URI, name = 표시 이름 */
17
+ export function resourceLink(link) {
18
+ const l = link;
19
+ if (typeof l !== "object" || l === null)
20
+ throw new TypeError("resourceLink: expected { uri, name }");
21
+ if (typeof l.uri !== "string" || !isAbsoluteUri(l.uri))
22
+ throw new TypeError("resourceLink: uri must be an absolute URI (scheme:...)");
23
+ if (typeof l.name !== "string" || l.name === "")
24
+ throw new TypeError("resourceLink: name must be a non-empty string");
25
+ for (const key of ["title", "description", "mimeType"]) {
26
+ if (l[key] !== undefined && typeof l[key] !== "string")
27
+ throw new TypeError(`resourceLink: ${key} must be a string`);
28
+ }
29
+ if (l.size !== undefined && !(Number.isSafeInteger(l.size) && l.size >= 0))
30
+ throw new TypeError("resourceLink: size must be a non-negative integer");
31
+ const block = { type: "resource_link", uri: l.uri, name: l.name };
32
+ if (l.title !== undefined)
33
+ block.title = l.title;
34
+ if (l.description !== undefined)
35
+ block.description = l.description;
36
+ if (l.mimeType !== undefined)
37
+ block.mimeType = l.mimeType;
38
+ if (l.size !== undefined)
39
+ block.size = l.size;
40
+ return brand(block);
41
+ }
42
+ /** 값 + 콘텐츠. 빈 목록 = 값만 반환한 것과 같다 */
43
+ export function withContent(value, content) {
44
+ if (!Array.isArray(content))
45
+ throw new TypeError("withContent: content must be an array of image() · audio() · resourceLink()");
46
+ for (const [i, c] of content.entries()) {
47
+ if (!isContent(c))
48
+ throw new TypeError(`withContent: content[${i}] is not image() · audio() · resourceLink()`);
49
+ }
50
+ return Object.freeze({ [CONTENT_RESULT]: true, value, content: Object.freeze([...content]) });
51
+ }
52
+ export function isContent(value) {
53
+ return typeof value === "object" && value !== null && value[CONTENT] === true;
54
+ }
55
+ export function isContentResult(value) {
56
+ return typeof value === "object" && value !== null && value[CONTENT_RESULT] === true;
57
+ }
58
+ /**
59
+ * execute 반환값 → 값 · 콘텐츠 블록. 콘텐츠 하나 = 값 undefined, withContent = 그 값 + 블록, 그 외 = 값 그대로 (content 없음).
60
+ * 블록 = 표시 없는 plain 객체 (MCP content 그대로)
61
+ */
62
+ export function splitResult(raw) {
63
+ if (isContent(raw))
64
+ return { value: undefined, content: [blockOf(raw)] };
65
+ if (!isContentResult(raw))
66
+ return { value: raw };
67
+ return raw.content.length === 0 ? { value: raw.value } : { value: raw.value, content: raw.content.map(blockOf) };
68
+ }
69
+ function blockOf(content) {
70
+ return { ...content };
71
+ }
72
+ function brand(block) {
73
+ Object.defineProperty(block, CONTENT, { value: true, enumerable: false });
74
+ return Object.freeze(block);
75
+ }
76
+ const BASE64 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
77
+ function base64Of(data, kind) {
78
+ if (typeof data === "string") {
79
+ if (data === "" || !BASE64.test(data))
80
+ throw new TypeError(`${kind}: data string must be base64`);
81
+ return data;
82
+ }
83
+ const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
84
+ if (!(bytes instanceof Uint8Array))
85
+ throw new TypeError(`${kind}: data must be a Uint8Array, ArrayBuffer or base64 string`);
86
+ if (bytes.byteLength === 0)
87
+ throw new TypeError(`${kind}: data is empty`);
88
+ return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64");
89
+ }
90
+ function mediaType(mimeType, kind) {
91
+ if (typeof mimeType !== "string" || !new RegExp(`^${kind}/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$`).test(mimeType)) {
92
+ throw new TypeError(`${kind}: mimeType must be ${kind}/<subtype> (got ${JSON.stringify(mimeType)})`);
93
+ }
94
+ return mimeType;
95
+ }
96
+ function isAbsoluteUri(value) {
97
+ return /^[A-Za-z][A-Za-z0-9+.-]*:\S+$/.test(value);
98
+ }
99
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 결과 콘텐츠 (spec §4): 핸들러가 값과 별도로 돌려주는 이미지 · 오디오 · 자원 링크.\n * MCP = content 블록 (image · audio · resource_link), CLI = 파일 저장 · 경로 출력, 타입 client = onContent.\n * 값 (structuredContent · --json · output 검증 · 감사 result) 과 섞이지 않는다\n */\n\n/** MCP ImageContent. data = base64 */\nexport interface ImageContent {\n type: \"image\"\n data: string\n mimeType: string\n}\n\n/** MCP AudioContent. data = base64 */\nexport interface AudioContent {\n type: \"audio\"\n data: string\n mimeType: string\n}\n\n/** MCP ResourceLink */\nexport interface ResourceLinkContent {\n type: \"resource_link\"\n uri: string\n name: string\n title?: string\n description?: string\n mimeType?: string\n /** 바이트 */\n size?: number\n}\n\n/** 결과 콘텐츠 블록 (MCP content 블록 모양 그대로) */\nexport type ContentBlock = ImageContent | AudioContent | ResourceLinkContent\n\nconst CONTENT: unique symbol = Symbol.for(\"@obov/mext/content\") as never\nconst CONTENT_RESULT: unique symbol = Symbol.for(\"@obov/mext/content-result\") as never\n\n/** image · audio · resourceLink 의 반환값. JSON = 블록 모양 (표시는 symbol 키라 직렬화되지 않는다) */\nexport type Content<B extends ContentBlock = ContentBlock> = Readonly<B> & { readonly [CONTENT]: true }\n\n/** withContent 의 반환값: 값 + 콘텐츠 */\nexport interface ContentResult<T> {\n readonly [CONTENT_RESULT]: true\n readonly value: T\n readonly content: readonly Content[]\n}\n\n/** execute 반환 타입 → 값 타입 (withContent = 그 값, 콘텐츠만 = undefined). 타입 client 의 CommandTypes 가 쓴다 */\nexport type ResultValue<R> = R extends ContentResult<infer V> ? V : R extends Content ? undefined : R\n\n/** 바이너리 입력: Uint8Array (Buffer 포함) · ArrayBuffer · base64 문자열 */\nexport type BinaryData = Uint8Array | ArrayBuffer | string\n\n/** image/png 등. mimeType 은 image/* */\nexport function image(data: BinaryData, mimeType: string): Content<ImageContent> {\n return brand({ type: \"image\", data: base64Of(data, \"image\"), mimeType: mediaType(mimeType, \"image\") })\n}\n\n/** audio/wav 등. mimeType 은 audio/* */\nexport function audio(data: BinaryData, mimeType: string): Content<AudioContent> {\n return brand({ type: \"audio\", data: base64Of(data, \"audio\"), mimeType: mediaType(mimeType, \"audio\") })\n}\n\n/** 자원 링크 (MCP resource_link). uri = 절대 URI, name = 표시 이름 */\nexport function resourceLink(link: Omit<ResourceLinkContent, \"type\">): Content<ResourceLinkContent> {\n const l = link as Partial<ResourceLinkContent> | null\n if (typeof l !== \"object\" || l === null) throw new TypeError(\"resourceLink: expected { uri, name }\")\n if (typeof l.uri !== \"string\" || !isAbsoluteUri(l.uri)) throw new TypeError(\"resourceLink: uri must be an absolute URI (scheme:...)\")\n if (typeof l.name !== \"string\" || l.name === \"\") throw new TypeError(\"resourceLink: name must be a non-empty string\")\n for (const key of [\"title\", \"description\", \"mimeType\"] as const) {\n if (l[key] !== undefined && typeof l[key] !== \"string\") throw new TypeError(`resourceLink: ${key} must be a string`)\n }\n if (l.size !== undefined && !(Number.isSafeInteger(l.size) && l.size >= 0)) throw new TypeError(\"resourceLink: size must be a non-negative integer\")\n const block: ResourceLinkContent = { type: \"resource_link\", uri: l.uri, name: l.name }\n if (l.title !== undefined) block.title = l.title\n if (l.description !== undefined) block.description = l.description\n if (l.mimeType !== undefined) block.mimeType = l.mimeType\n if (l.size !== undefined) block.size = l.size\n return brand(block)\n}\n\n/** 값 + 콘텐츠. 빈 목록 = 값만 반환한 것과 같다 */\nexport function withContent<T>(value: T, content: readonly Content[]): ContentResult<T> {\n if (!Array.isArray(content)) throw new TypeError(\"withContent: content must be an array of image() · audio() · resourceLink()\")\n for (const [i, c] of content.entries()) {\n if (!isContent(c)) throw new TypeError(`withContent: content[${i}] is not image() · audio() · resourceLink()`)\n }\n return Object.freeze({ [CONTENT_RESULT]: true as const, value, content: Object.freeze([...content]) })\n}\n\nexport function isContent(value: unknown): value is Content {\n return typeof value === \"object\" && value !== null && (value as Record<symbol, unknown>)[CONTENT] === true\n}\n\nexport function isContentResult(value: unknown): value is ContentResult<unknown> {\n return typeof value === \"object\" && value !== null && (value as Record<symbol, unknown>)[CONTENT_RESULT] === true\n}\n\n/**\n * execute 반환값 → 값 · 콘텐츠 블록. 콘텐츠 하나 = 값 undefined, withContent = 그 값 + 블록, 그 외 = 값 그대로 (content 없음).\n * 블록 = 표시 없는 plain 객체 (MCP content 그대로)\n */\nexport function splitResult(raw: unknown): { value: unknown; content?: ContentBlock[] } {\n if (isContent(raw)) return { value: undefined, content: [blockOf(raw)] }\n if (!isContentResult(raw)) return { value: raw }\n return raw.content.length === 0 ? { value: raw.value } : { value: raw.value, content: raw.content.map(blockOf) }\n}\n\nfunction blockOf(content: Content): ContentBlock {\n return { ...content } as ContentBlock\n}\n\nfunction brand<B extends ContentBlock>(block: B): Content<B> {\n Object.defineProperty(block, CONTENT, { value: true, enumerable: false })\n return Object.freeze(block) as Content<B>\n}\n\nconst BASE64 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/\n\nfunction base64Of(data: BinaryData, kind: \"image\" | \"audio\"): string {\n if (typeof data === \"string\") {\n if (data === \"\" || !BASE64.test(data)) throw new TypeError(`${kind}: data string must be base64`)\n return data\n }\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data\n if (!(bytes instanceof Uint8Array)) throw new TypeError(`${kind}: data must be a Uint8Array, ArrayBuffer or base64 string`)\n if (bytes.byteLength === 0) throw new TypeError(`${kind}: data is empty`)\n return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString(\"base64\")\n}\n\nfunction mediaType(mimeType: string, kind: \"image\" | \"audio\"): string {\n if (typeof mimeType !== \"string\" || !new RegExp(`^${kind}/[A-Za-z0-9][A-Za-z0-9!#$&^_.+-]*$`).test(mimeType)) {\n throw new TypeError(`${kind}: mimeType must be ${kind}/<subtype> (got ${JSON.stringify(mimeType)})`)\n }\n return mimeType\n}\n\nfunction isAbsoluteUri(value: string): boolean {\n return /^[A-Za-z][A-Za-z0-9+.-]*:\\S+$/.test(value)\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export { VERSION } from "./version.ts";
2
2
  export { DEFAULT_TASK_TTL_MS, defineCommand, isCommand } from "./command.ts";
3
3
  export type { Ask, AskRequest, Command, CommandAudit, CommandContext, CommandDefinition, ConfirmRequest, InputRequest, InputSchema, MextApp, ProgressUpdate, TaskOptions, UrlRequest, } from "./command.ts";
4
+ export { audio, image, isContent, isContentResult, resourceLink, splitResult, withContent } from "./content.ts";
5
+ export type { AudioContent, BinaryData, Content, ContentBlock, ContentResult, ImageContent, ResourceLinkContent, ResultValue, } from "./content.ts";
4
6
  export { collectResources, collectResourceSet, createLazyResourceSet, createResourceSet, defineResource, describeResource, isResource, loadResourceSet, matchResource, parseUriTemplate, resourceEntries, withResources, } from "./resource.ts";
5
7
  export type { LazyResourceInput, ManifestResource, RegisteredResource, Resource, ResourceCompleteContext, ResourceCompleter, ResourceContext, ResourceDefinition, ResourceInput, ResourceListItem, ResourceSet, ResourceVariables, UriTemplatePattern, } from "./resource.ts";
6
8
  export { collectPrompts, collectPromptSet, createLazyPromptSet, createPromptSet, definePrompt, describePrompt, isPrompt, loadPromptSet, promptArguments, withPrompts, } from "./prompt.ts";
@@ -28,7 +30,7 @@ export { buildManifest, describeCommand, generateManifest, MANIFEST_SCHEMA_VERSI
28
30
  export type { BuildManifest, BuildManifestCommand, BuildManifestResource, BuildManifestRoute, Manifest, ManifestCommand, ManifestNamespace } from "./manifest.ts";
29
31
  export type { BuildManifestPrompt } from "./manifest.ts";
30
32
  export { collectRoutes, loadRoutes, ROUTE_METHODS, walkRoutes } from "./route.ts";
31
- export type { RouteContext, RouteEntry, RouteHandler, RouteMethod, RouteModule, ScannedRoute } from "./route.ts";
33
+ export type { RouteAuth, RouteContext, RouteEntry, RouteHandler, RouteMethod, RouteModule, RouteOptions, ScannedRoute } from "./route.ts";
32
34
  export { BUILD_DIR, BUILD_MANIFEST_FILE, buildProject, HANDLER_JS, RolldownUnavailableError, SERVER_JS, START_ENTRY } from "./build.ts";
33
35
  export type { BuildOptions, BuildResult, BuildWarning, RolldownModule, RolldownOutputItem } from "./build.ts";
34
36
  export { formatBuildSummary, runBuild } from "./cli/build.ts";
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { VERSION } from "./version.js";
2
2
  export { DEFAULT_TASK_TTL_MS, defineCommand, isCommand } from "./command.js";
3
+ export { audio, image, isContent, isContentResult, resourceLink, splitResult, withContent } from "./content.js";
3
4
  export { collectResources, collectResourceSet, createLazyResourceSet, createResourceSet, defineResource, describeResource, isResource, loadResourceSet, matchResource, parseUriTemplate, resourceEntries, withResources, } from "./resource.js";
4
5
  export { collectPrompts, collectPromptSet, createLazyPromptSet, createPromptSet, definePrompt, describePrompt, isPrompt, loadPromptSet, promptArguments, withPrompts, } from "./prompt.js";
5
6
  export { ANONYMOUS, hasScope, localPrincipal } from "./principal.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { VERSION } from \"./version.ts\"\n\nexport { DEFAULT_TASK_TTL_MS, defineCommand, isCommand } from \"./command.ts\"\nexport type {\n Ask,\n AskRequest,\n Command,\n CommandAudit,\n CommandContext,\n CommandDefinition,\n ConfirmRequest,\n InputRequest,\n InputSchema,\n MextApp,\n ProgressUpdate,\n TaskOptions,\n UrlRequest,\n} from \"./command.ts\"\nexport {\n collectResources,\n collectResourceSet,\n createLazyResourceSet,\n createResourceSet,\n defineResource,\n describeResource,\n isResource,\n loadResourceSet,\n matchResource,\n parseUriTemplate,\n resourceEntries,\n withResources,\n} from \"./resource.ts\"\nexport type {\n LazyResourceInput,\n ManifestResource,\n RegisteredResource,\n Resource,\n ResourceCompleteContext,\n ResourceCompleter,\n ResourceContext,\n ResourceDefinition,\n ResourceInput,\n ResourceListItem,\n ResourceSet,\n ResourceVariables,\n UriTemplatePattern,\n} from \"./resource.ts\"\nexport {\n collectPrompts,\n collectPromptSet,\n createLazyPromptSet,\n createPromptSet,\n definePrompt,\n describePrompt,\n isPrompt,\n loadPromptSet,\n promptArguments,\n withPrompts,\n} from \"./prompt.ts\"\nexport type {\n LazyPromptInput,\n ManifestPrompt,\n Prompt,\n PromptArgs,\n PromptArgument,\n PromptCompleteContext,\n PromptCompleter,\n PromptContext,\n PromptDefinition,\n PromptInput,\n PromptMessage,\n PromptResult,\n PromptSet,\n RegisteredPrompt,\n} from \"./prompt.ts\"\nexport { ANONYMOUS, hasScope, localPrincipal } from \"./principal.ts\"\nexport type { Actor, ActorKind, Principal } from \"./principal.ts\"\nexport { ANY_SURFACE, callerOf, defaultSurface, isExposedOn, surfaceOf } from \"./caller.ts\"\nexport type { BuiltinSurface, Caller, Exposure, ReportedClient, Surface } from \"./caller.ts\"\nexport { exposedRegistry, hasExposure } from \"./expose.ts\"\nexport { approvalModeOf, isApprovalMark } from \"./approval.ts\"\nexport type { ApprovalConfig, ApprovalMode, ApprovalSignal } from \"./approval.ts\"\nexport { auditHidden, startAudit } from \"./audit.ts\"\nexport type { AuditConfig, AuditContext, AuditEvent, AuditOutcome, AuditTarget, AuditTrail } from \"./audit.ts\"\nexport {\n CommandError,\n approvalRequired,\n inputDeclined,\n isCommandError,\n isMextError,\n MextBuildError,\n MextError,\n RESERVED_ERROR_CODES,\n unauthenticated,\n} from \"./errors.ts\"\nexport type { ArgumentIssue, BuildIssue, BuildIssueCode, MextErrorCode, MextErrorDetails } from \"./errors.ts\"\nexport { authorize, confirmationMessage, createContext, findCommand, invalidArgument, invoke, OutputValidationError, parseInput } from \"./invoke.ts\"\nexport type { AskHandler, AskHandlerRequest, DetachedExecution, InvokeOptions, InvokeResult } from \"./invoke.ts\"\nexport {\n findInstrumentation,\n INSTRUMENTATION_FILE,\n loadInstrumentation,\n loadProjectInstrumentation,\n} from \"./instrumentation.ts\"\nexport type {\n CommandErrorInfo,\n Instrumentation,\n InstrumentationModule,\n LoadInstrumentationOptions,\n OtelApi,\n TraceIds,\n Transport,\n} from \"./instrumentation.ts\"\nexport { collectRegistry, createLazyRegistry, createRegistry, filterRegistry, loadCommand, resolveCommand } from \"./registry.ts\"\nexport type {\n JsonSchema,\n LazyCommandInput,\n NamespaceInfo,\n RegisteredCommand,\n Registry,\n RegistryCommandInput,\n RegistryInput,\n RegistryNamespaceInput,\n} from \"./registry.ts\"\nexport { collectCommands, loadRegistry, scanCommands, walkCommands } from \"./scan.ts\"\nexport type { ScannedFile, ScanResult } from \"./scan.ts\"\nexport { buildManifest, describeCommand, generateManifest, MANIFEST_SCHEMA_VERSION, manifestHash } from \"./manifest.ts\"\nexport type { BuildManifest, BuildManifestCommand, BuildManifestResource, BuildManifestRoute, Manifest, ManifestCommand, ManifestNamespace } from \"./manifest.ts\"\nexport type { BuildManifestPrompt } from \"./manifest.ts\"\nexport { collectRoutes, loadRoutes, ROUTE_METHODS, walkRoutes } from \"./route.ts\"\nexport type { RouteContext, RouteEntry, RouteHandler, RouteMethod, RouteModule, ScannedRoute } from \"./route.ts\"\nexport { BUILD_DIR, BUILD_MANIFEST_FILE, buildProject, HANDLER_JS, RolldownUnavailableError, SERVER_JS, START_ENTRY } from \"./build.ts\"\nexport type { BuildOptions, BuildResult, BuildWarning, RolldownModule, RolldownOutputItem } from \"./build.ts\"\nexport { formatBuildSummary, runBuild } from \"./cli/build.ts\"\nexport { mextVersion } from \"./version.ts\"\nexport { renderTypes, resolveTypesPath, TYPES_FILE, writeTypes } from \"./typegen.ts\"\nexport type { WriteTypesResult } from \"./typegen.ts\"\nexport * from \"./mcp/index.ts\"\nexport { CLI_BUILTIN_COMMANDS, CONFIG_FILE, createApp, defineConfig, loadConfig, resolveCommandsDir, resolveLocalPrincipal } from \"./config.ts\"\nexport { resolveResourcesDir } from \"./config.ts\"\nexport { resolvePromptsDir } from \"./config.ts\"\nexport { resolveRoutesDir } from \"./config.ts\"\nexport { memoryState } from \"./state.ts\"\nexport type { MemoryStateOptions, MextBus, MextState, MextStore } from \"./state.ts\"\nexport type { CliConfig, LocalPrincipalRequest, McpCapabilities, McpConfig, McpConnectHandler, McpConnection, MextConfig } from \"./config.ts\"\nexport { buildCustomerCli, CLI_BIN_FILE, CLI_DIR, customerCliIssues } from \"./build-cli.ts\"\nexport type { BuildCustomerCliOptions, CustomerCliBuild } from \"./build-cli.ts\"\nexport { runCustomerCli } from \"./client/main.ts\"\nexport type { CustomerCliConfig } from \"./client/main.ts\"\nexport { clientManifest, manifestHelp } from \"./client/manifest.ts\"\nexport type { ClientManifest, ClientManifestCommand } from \"./client/manifest.ts\"\nexport { runRemote } from \"./client/runner.ts\"\nexport type { HelpSource, RemoteRunOptions } from \"./client/runner.ts\"\nexport { runCli, SUBCOMMANDS } from \"./cli/main.ts\"\nexport type { CliSubcommand } from \"./cli/main.ts\"\nexport type { CliIo, CliWriter } from \"./cli/io.ts\"\nexport { analyzeInput, assertCliConvertible, cliBuildIssues, cliSpec, parseArgs, RESERVED_FLAGS, toKebab } from \"./cli/args.ts\"\nexport type { CliField, CliSpec, FieldKind, ParseArgsOptions, ParsedArgs, Primitive, ScalarKind } from \"./cli/args.ts\"\nexport {\n cliPath,\n formatInvocation,\n renderCommandHelp,\n renderHelp,\n renderNamespaceHelp,\n resolveHelpTarget,\n} from \"./cli/help.ts\"\nexport type { HelpOptions, HelpTarget } from \"./cli/help.ts\"\nexport { errorJson, exitCodeOf, formatError, formatJson, formatResult } from \"./cli/output.ts\"\nexport type { CliErrorFormatter, CliErrorInfo, CliErrorOutput } from \"./cli/output.ts\"\nexport { loginCommand, resolveServerUrl } from \"./cli/login.ts\"\nexport type { AuthCommandOptions } from \"./cli/login.ts\"\nexport { logoutCommand } from \"./cli/logout.ts\"\nexport * from \"./remote/index.ts\"\nexport { cliSpecFromJsonSchema, defineCliSpec } from \"./cli/args.ts\"\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { VERSION } from \"./version.ts\"\n\nexport { DEFAULT_TASK_TTL_MS, defineCommand, isCommand } from \"./command.ts\"\nexport type {\n Ask,\n AskRequest,\n Command,\n CommandAudit,\n CommandContext,\n CommandDefinition,\n ConfirmRequest,\n InputRequest,\n InputSchema,\n MextApp,\n ProgressUpdate,\n TaskOptions,\n UrlRequest,\n} from \"./command.ts\"\nexport { audio, image, isContent, isContentResult, resourceLink, splitResult, withContent } from \"./content.ts\"\nexport type {\n AudioContent,\n BinaryData,\n Content,\n ContentBlock,\n ContentResult,\n ImageContent,\n ResourceLinkContent,\n ResultValue,\n} from \"./content.ts\"\nexport {\n collectResources,\n collectResourceSet,\n createLazyResourceSet,\n createResourceSet,\n defineResource,\n describeResource,\n isResource,\n loadResourceSet,\n matchResource,\n parseUriTemplate,\n resourceEntries,\n withResources,\n} from \"./resource.ts\"\nexport type {\n LazyResourceInput,\n ManifestResource,\n RegisteredResource,\n Resource,\n ResourceCompleteContext,\n ResourceCompleter,\n ResourceContext,\n ResourceDefinition,\n ResourceInput,\n ResourceListItem,\n ResourceSet,\n ResourceVariables,\n UriTemplatePattern,\n} from \"./resource.ts\"\nexport {\n collectPrompts,\n collectPromptSet,\n createLazyPromptSet,\n createPromptSet,\n definePrompt,\n describePrompt,\n isPrompt,\n loadPromptSet,\n promptArguments,\n withPrompts,\n} from \"./prompt.ts\"\nexport type {\n LazyPromptInput,\n ManifestPrompt,\n Prompt,\n PromptArgs,\n PromptArgument,\n PromptCompleteContext,\n PromptCompleter,\n PromptContext,\n PromptDefinition,\n PromptInput,\n PromptMessage,\n PromptResult,\n PromptSet,\n RegisteredPrompt,\n} from \"./prompt.ts\"\nexport { ANONYMOUS, hasScope, localPrincipal } from \"./principal.ts\"\nexport type { Actor, ActorKind, Principal } from \"./principal.ts\"\nexport { ANY_SURFACE, callerOf, defaultSurface, isExposedOn, surfaceOf } from \"./caller.ts\"\nexport type { BuiltinSurface, Caller, Exposure, ReportedClient, Surface } from \"./caller.ts\"\nexport { exposedRegistry, hasExposure } from \"./expose.ts\"\nexport { approvalModeOf, isApprovalMark } from \"./approval.ts\"\nexport type { ApprovalConfig, ApprovalMode, ApprovalSignal } from \"./approval.ts\"\nexport { auditHidden, startAudit } from \"./audit.ts\"\nexport type { AuditConfig, AuditContext, AuditEvent, AuditOutcome, AuditTarget, AuditTrail } from \"./audit.ts\"\nexport {\n CommandError,\n approvalRequired,\n inputDeclined,\n isCommandError,\n isMextError,\n MextBuildError,\n MextError,\n RESERVED_ERROR_CODES,\n unauthenticated,\n} from \"./errors.ts\"\nexport type { ArgumentIssue, BuildIssue, BuildIssueCode, MextErrorCode, MextErrorDetails } from \"./errors.ts\"\nexport { authorize, confirmationMessage, createContext, findCommand, invalidArgument, invoke, OutputValidationError, parseInput } from \"./invoke.ts\"\nexport type { AskHandler, AskHandlerRequest, DetachedExecution, InvokeOptions, InvokeResult } from \"./invoke.ts\"\nexport {\n findInstrumentation,\n INSTRUMENTATION_FILE,\n loadInstrumentation,\n loadProjectInstrumentation,\n} from \"./instrumentation.ts\"\nexport type {\n CommandErrorInfo,\n Instrumentation,\n InstrumentationModule,\n LoadInstrumentationOptions,\n OtelApi,\n TraceIds,\n Transport,\n} from \"./instrumentation.ts\"\nexport { collectRegistry, createLazyRegistry, createRegistry, filterRegistry, loadCommand, resolveCommand } from \"./registry.ts\"\nexport type {\n JsonSchema,\n LazyCommandInput,\n NamespaceInfo,\n RegisteredCommand,\n Registry,\n RegistryCommandInput,\n RegistryInput,\n RegistryNamespaceInput,\n} from \"./registry.ts\"\nexport { collectCommands, loadRegistry, scanCommands, walkCommands } from \"./scan.ts\"\nexport type { ScannedFile, ScanResult } from \"./scan.ts\"\nexport { buildManifest, describeCommand, generateManifest, MANIFEST_SCHEMA_VERSION, manifestHash } from \"./manifest.ts\"\nexport type { BuildManifest, BuildManifestCommand, BuildManifestResource, BuildManifestRoute, Manifest, ManifestCommand, ManifestNamespace } from \"./manifest.ts\"\nexport type { BuildManifestPrompt } from \"./manifest.ts\"\nexport { collectRoutes, loadRoutes, ROUTE_METHODS, walkRoutes } from \"./route.ts\"\nexport type { RouteAuth, RouteContext, RouteEntry, RouteHandler, RouteMethod, RouteModule, RouteOptions, ScannedRoute } from \"./route.ts\"\nexport { BUILD_DIR, BUILD_MANIFEST_FILE, buildProject, HANDLER_JS, RolldownUnavailableError, SERVER_JS, START_ENTRY } from \"./build.ts\"\nexport type { BuildOptions, BuildResult, BuildWarning, RolldownModule, RolldownOutputItem } from \"./build.ts\"\nexport { formatBuildSummary, runBuild } from \"./cli/build.ts\"\nexport { mextVersion } from \"./version.ts\"\nexport { renderTypes, resolveTypesPath, TYPES_FILE, writeTypes } from \"./typegen.ts\"\nexport type { WriteTypesResult } from \"./typegen.ts\"\nexport * from \"./mcp/index.ts\"\nexport { CLI_BUILTIN_COMMANDS, CONFIG_FILE, createApp, defineConfig, loadConfig, resolveCommandsDir, resolveLocalPrincipal } from \"./config.ts\"\nexport { resolveResourcesDir } from \"./config.ts\"\nexport { resolvePromptsDir } from \"./config.ts\"\nexport { resolveRoutesDir } from \"./config.ts\"\nexport { memoryState } from \"./state.ts\"\nexport type { MemoryStateOptions, MextBus, MextState, MextStore } from \"./state.ts\"\nexport type { CliConfig, LocalPrincipalRequest, McpCapabilities, McpConfig, McpConnectHandler, McpConnection, MextConfig } from \"./config.ts\"\nexport { buildCustomerCli, CLI_BIN_FILE, CLI_DIR, customerCliIssues } from \"./build-cli.ts\"\nexport type { BuildCustomerCliOptions, CustomerCliBuild } from \"./build-cli.ts\"\nexport { runCustomerCli } from \"./client/main.ts\"\nexport type { CustomerCliConfig } from \"./client/main.ts\"\nexport { clientManifest, manifestHelp } from \"./client/manifest.ts\"\nexport type { ClientManifest, ClientManifestCommand } from \"./client/manifest.ts\"\nexport { runRemote } from \"./client/runner.ts\"\nexport type { HelpSource, RemoteRunOptions } from \"./client/runner.ts\"\nexport { runCli, SUBCOMMANDS } from \"./cli/main.ts\"\nexport type { CliSubcommand } from \"./cli/main.ts\"\nexport type { CliIo, CliWriter } from \"./cli/io.ts\"\nexport { analyzeInput, assertCliConvertible, cliBuildIssues, cliSpec, parseArgs, RESERVED_FLAGS, toKebab } from \"./cli/args.ts\"\nexport type { CliField, CliSpec, FieldKind, ParseArgsOptions, ParsedArgs, Primitive, ScalarKind } from \"./cli/args.ts\"\nexport {\n cliPath,\n formatInvocation,\n renderCommandHelp,\n renderHelp,\n renderNamespaceHelp,\n resolveHelpTarget,\n} from \"./cli/help.ts\"\nexport type { HelpOptions, HelpTarget } from \"./cli/help.ts\"\nexport { errorJson, exitCodeOf, formatError, formatJson, formatResult } from \"./cli/output.ts\"\nexport type { CliErrorFormatter, CliErrorInfo, CliErrorOutput } from \"./cli/output.ts\"\nexport { loginCommand, resolveServerUrl } from \"./cli/login.ts\"\nexport type { AuthCommandOptions } from \"./cli/login.ts\"\nexport { logoutCommand } from \"./cli/logout.ts\"\nexport * from \"./remote/index.ts\"\nexport { cliSpecFromJsonSchema, defineCliSpec } from \"./cli/args.ts\"\n"]}
package/dist/invoke.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as z from "zod";
2
2
  import { type ApprovalConfig } from "./approval.ts";
3
+ import { type ContentBlock } from "./content.ts";
3
4
  import { type AuditConfig } from "./audit.ts";
4
5
  import { type ReportedClient } from "./caller.ts";
5
6
  import type { CommandContext, InputSchema, MextApp, ProgressUpdate } from "./command.ts";
@@ -85,6 +86,7 @@ export interface DetachedExecution {
85
86
  /** execute 종료. 값 = output 검증 후, 예외 = onCommandError 보고 후. 거부하지 않는다 */
86
87
  settle(outcome: {
87
88
  value: unknown;
89
+ content?: ContentBlock[];
88
90
  } | {
89
91
  error: unknown;
90
92
  }): Promise<void>;
@@ -93,6 +95,8 @@ export interface InvokeResult {
93
95
  /** 정식 ID (별칭으로 호출해도) */
94
96
  command: string;
95
97
  value: unknown;
98
+ /** 결과 콘텐츠 (image · audio · resource_link, spec §4). 없으면 생략 */
99
+ content?: ContentBlock[];
96
100
  /** detach 로 분리 실행됨: DetachedExecution.handle (value 는 undefined) */
97
101
  detached?: unknown;
98
102
  }
package/dist/invoke.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as z from "zod";
2
2
  import { approvalModeOf } from "./approval.js";
3
+ import { splitResult } from "./content.js";
3
4
  import { auditHidden, startAudit } from "./audit.js";
4
5
  import { callerOf, surfaceOf } from "./caller.js";
5
6
  import { approvalRequired, inputDeclined, isCommandError, isMextError, MextError } from "./errors.js";
@@ -69,10 +70,10 @@ export async function invoke(registry, id, rawInput, options) {
69
70
  trail?.task(detached.taskId);
70
71
  // 감사 = 분리 실행의 실제 종료 시점, task 결과 기록 (settle) 전
71
72
  try {
72
- const value = await parseOutput(entry.id, command, await command.execute(input, taskCtx));
73
+ const { value, content } = await settleOutput(entry.id, command, await command.execute(input, taskCtx));
73
74
  await trail?.finish({ value }, false);
74
- await detached.settle({ value });
75
- return { command: entry.id, value };
75
+ await detached.settle(content ? { value, content } : { value });
76
+ return { command: entry.id, value, ...(content ? { content } : {}) };
76
77
  }
77
78
  catch (error) {
78
79
  await reportCommandError(error, entry.id, options, taskCtx.signal);
@@ -82,8 +83,8 @@ export async function invoke(registry, id, rawInput, options) {
82
83
  }
83
84
  }
84
85
  try {
85
- const value = await parseOutput(entry.id, command, await command.execute(input, ctx));
86
- return { command: entry.id, value };
86
+ const { value, content } = await settleOutput(entry.id, command, await command.execute(input, ctx));
87
+ return { command: entry.id, value, ...(content ? { content } : {}) };
87
88
  }
88
89
  catch (error) {
89
90
  await reportCommandError(error, entry.id, options, ctx.signal);
@@ -226,6 +227,12 @@ export async function parseInput(entry, rawInput) {
226
227
  * output 이 있으면 반환값 safeParse (모든 어댑터 · 노출 방식, §12.2). 결과 = 파싱된 값 (outputSchema 와 같은 모양).
227
228
  * 실패 = OutputValidationError (핸들러 예외와 같이 EXECUTION_ERROR · onCommandError 보고). 던진 오류는 검증하지 않는다
228
229
  */
230
+ /** execute 반환값 → 값 · 콘텐츠 (spec §4 결과 콘텐츠). output 검증 = 값만 */
231
+ async function settleOutput(id, command, raw) {
232
+ const { value, content } = splitResult(raw);
233
+ const parsed = await parseOutput(id, command, value);
234
+ return content ? { value: parsed, content } : { value: parsed };
235
+ }
229
236
  async function parseOutput(id, command, value) {
230
237
  if (!command.output)
231
238
  return value;