@keke1933/vibe-dictionary-mcp 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +36 -3
  2. package/dist/index.js +1873 -248
  3. package/package.json +14 -4
package/dist/index.js CHANGED
@@ -7211,6 +7211,124 @@ var PIXELART_EXPANSION_ADDITIONS = [
7211
7211
  }
7212
7212
  ];
7213
7213
 
7214
+ // ../../packages/catalog/src/additions/ai.ts
7215
+ var AI_ADDITIONS = [
7216
+ /* 1. 입력 제어 (ai_input) */
7217
+ {
7218
+ id: "ai-prompt-box",
7219
+ domain: "ai",
7220
+ category: "ai_input",
7221
+ vibeTag: "\uC785\uB825 \uAE38\uC774\uC5D0 \uB9DE\uCDB0 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uB298\uC5B4\uB098\uB294",
7222
+ vibeKeywords: ["\uD504\uB86C\uD504\uD2B8 \uC785\uB825\uCC3D", "\uC624\uD1A0\uB9AC\uC0AC\uC774\uC988 textarea", "\uBAA8\uB378 \uD1A0\uAE00", "\uD504\uB86C\uD504\uD2B8 \uC804\uC1A1", "\uC778\uD48B \uBC15\uC2A4"],
7223
+ titleKo: "\uC790\uB3D9 \uD655\uC7A5 \uD504\uB86C\uD504\uD2B8 \uC785\uB825\uCC3D",
7224
+ titleEn: "Auto-Expanding Prompt Box",
7225
+ summary: "\uD14D\uC2A4\uD2B8 \uAE38\uC774\uC5D0 \uB530\uB77C \uB192\uC774\uAC00 \uBD80\uB4DC\uB7FD\uAC8C \uB298\uC5B4\uB098\uACE0 Fast/Pro \uBAA8\uB378 \uC804\uD658\uACFC \uCCA8\uBD80\xB7\uC804\uC1A1 \uC0C1\uD0DC\uB97C \uC81C\uC5B4",
7226
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uD14D\uC2A4\uD2B8 \uAE38\uC774\uC5D0 \uB530\uB77C \uB192\uC774\uAC00 \uB298\uC5B4\uB098\uB294 \uC778\uD130\uB799\uD2F0\uBE0C \uD504\uB86C\uD504\uD2B8 \uC785\uB825\uCC3D\uC744 \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px\uC758 \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 1px \uD14C\uB450\uB9AC(\uB77C\uC774\uD2B8 #e2e8f0, \uB2E4\uD06C #334155), 16px \uB465\uADFC \uBAA8\uC11C\uB9AC, \uBC30\uACBD(\uB77C\uC774\uD2B8 #ffffff, \uB2E4\uD06C #0f172a)\uC758 \uCE74\uB4DC \uD504\uB808\uC784\uC744 \uAD6C\uC131\uD574 \uC918. \uC0C1\uB2E8\uC5D0\uB294 textarea(\uCD5C\uC18C 48px, \uCD5C\uB300 120px \uB192\uC774, overflow-y auto, resize none, 14px \uAE00\uC790, \uD328\uB529 12px)\uB97C \uBC30\uCE58\uD558\uACE0, \uAE00\uC744 \uC785\uB825\uD558\uBA74 scrollHeight\uC5D0 \uB9DE\uCDB0 \uB192\uC774\uAC00 \uC2E4\uC2DC\uAC04 \uC870\uC808\uB418\uAC8C \uD574 \uC918. \uD558\uB2E8 \uD234\uBC14\uC5D0\uB294 \uC88C\uCE21\uC5D0 Fast\uC640 Pro \uBAA8\uB4DC\uB97C \uC804\uD658\uD558\uB294 2\uAC1C \uC138\uADF8\uBA3C\uD2B8 \uBC84\uD2BC(\uB192\uC774 28px, 11px \uAE00\uC790, 8px \uB465\uADFC \uBAA8\uC11C\uB9AC, \uD65C\uC131 \uC2DC #6366f1 \uBC30\uACBD \uBC0F \uD770\uC0C9 \uAE00\uC790)\uACFC \uD30C\uC77C \uCCA8\uBD80 \uBC84\uD2BC\uC744 \uB450\uACE0, \uC6B0\uCE21\uC5D0\uB294 \uD14D\uC2A4\uD2B8 \uC720\uBB34\uC5D0 \uB530\uB77C \uD65C\uC131\uD654\uB418\uB294 \uC804\uC1A1 \uBC84\uD2BC(32px \uC6D0\uD615, #6366f1 \uBC30\uACBD, \uD770\uC0C9 \uD654\uC0B4\uD45C \uC544\uC774\uCF58)\uC744 \uC81C\uACF5\uD574 \uC918. \uC5D4\uD130 \uD0A4\uB97C \uB204\uB974\uBA74 \uC804\uC1A1\uB418\uACE0 Shift+\uC5D4\uD130\uB294 \uC904\uBC14\uAFC8\uC744 \uC9C0\uC6D0\uD574 \uC918. \uC804\uC1A1 \uD6C4\uC5D0\uB294 \uD14D\uC2A4\uD2B8\uAC00 \uBE44\uC6CC\uC9C0\uACE0 \uB192\uC774\uAC00 48px\uB85C \uCD08\uAE30\uD654\uB418\uC5B4\uC57C \uD574. \uC678\uBD80 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC5C6\uC774 \uC21C\uC218 React\uC640 Tailwind CSS\uB85C \uAD6C\uD604\uD574 \uC918."
7227
+ },
7228
+ {
7229
+ id: "ai-slash-command",
7230
+ domain: "ai",
7231
+ category: "ai_input",
7232
+ vibeTag: "\uC2AC\uB798\uC2DC \uC785\uB825\uC73C\uB85C \uC989\uC2DC \uBA85\uB839\uC5B4\uB97C \uD638\uCD9C\uD558\uB294",
7233
+ vibeKeywords: ["\uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC", "\uD504\uB86C\uD504\uD2B8 \uBA85\uB839\uC5B4", "\uCEE4\uB9E8\uB4DC \uD31D\uC624\uBC84", "\uB2E8\uCD95 \uBA85\uB839", "\uD0A4\uBCF4\uB4DC \uD314\uB808\uD2B8"],
7234
+ titleKo: "\uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8",
7235
+ titleEn: "Slash Command Palette",
7236
+ summary: "\uC785\uB825\uCC3D\uC5D0 \uC2AC\uB798\uC2DC\uB97C \uC785\uB825\uD558\uBA74 \uCD94\uCC9C \uBA85\uB839 \uD31D\uC624\uBC84\uAC00 \uC5F4\uB9AC\uACE0 \uBC29\uD5A5\uD0A4\uC640 \uC5D4\uD130\uB85C \uD14D\uC2A4\uD2B8\uB97C \uC790\uB3D9 \uC644\uC131",
7237
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uC2AC\uB798\uC2DC(/) \uBB38\uC790\uB85C \uD2B8\uB9AC\uAC70\uB418\uB294 \uBA85\uB839\uC5B4 \uD31D\uC624\uBC84 \uC778\uD130\uB799\uC158\uC744 \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108\uC5D0 \uB2E8\uC77C input \uB610\uB294 textarea\uB97C \uB450\uACE0, \uC0AC\uC6A9\uC790\uAC00 /\uB97C \uC785\uB825\uD558\uBA74 \uCEE4\uC11C \uC704\uCABD\uC73C\uB85C 220px \uB108\uBE44\uC758 \uD50C\uB85C\uD305 \uBA54\uB274\uAC00 150ms \uD398\uC774\uB4DC\uC778\uC73C\uB85C \uB098\uD0C0\uB098\uAC8C \uD574 \uC918. \uD31D\uC624\uBC84 \uBA54\uB274\uC5D0\uB294 \uC694\uC57D(/summarize), \uBC88\uC5ED(/translate), \uCF54\uB4DC \uC0DD\uC131(/code), \uB9AC\uD329\uD1A0\uB9C1(/refactor)\uC758 4\uAC1C \uCEE4\uB9E8\uB4DC \uD56D\uBAA9(\uB192\uC774 36px, \uD328\uB529 8px, 12px \uD3F0\uD2B8, \uC544\uC774\uCF58 \uD3EC\uD568)\uC744 \uB2F4\uC544 \uC918. \uD0A4\uBCF4\uB4DC \uC704/\uC544\uB798 \uBC29\uD5A5\uD0A4\uB85C \uD3EC\uCEE4\uC2A4 \uD56D\uBAA9\uC744 \uD0D0\uC0C9\uD560 \uC218 \uC788\uACE0, Enter \uD0A4\uB098 \uD074\uB9AD\uC73C\uB85C \uC120\uD0DD\uD558\uBA74 \uC785\uB825\uCC3D\uC758 /\uAC00 \uD574\uB2F9 \uBA85\uB839\uC5B4 \uD504\uB86C\uD504\uD2B8\uB85C \uCE58\uD658\uB418\uBA70 \uD31D\uC624\uBC84\uAC00 \uB2EB\uD788\uAC8C \uD574 \uC918. Escape \uD0A4\uB97C \uB204\uB974\uBA74 \uD31D\uC624\uBC84\uAC00 \uCDE8\uC18C\uB418\uACE0 \uD14C\uB9C8(\uB77C\uC774\uD2B8 #ffffff \uBC14\uD0D5/#e2e8f0 \uD14C\uB450\uB9AC, \uB2E4\uD06C #1e293b \uBC14\uD0D5/#475569 \uD14C\uB450\uB9AC)\uB97C \uC9C0\uC6D0\uD574 \uC918. \uC678\uBD80 \uC758\uC874\uC131 \uC5C6\uC774 React \uC0C1\uD0DC\uB85C \uAD6C\uD604\uD574 \uC918."
7238
+ },
7239
+ {
7240
+ id: "ai-context-pill",
7241
+ domain: "ai",
7242
+ category: "ai_input",
7243
+ vibeTag: "\uCCA8\uBD80\uB41C \uCEE8\uD14D\uC2A4\uD2B8\uC640 \uD1A0\uD070 \uC18C\uBAA8\uB7C9\uC744 \uD55C\uB208\uC5D0 \uBCF4\uC5EC\uC8FC\uB294",
7244
+ vibeKeywords: ["\uCEE8\uD14D\uC2A4\uD2B8 \uAC8C\uC774\uC9C0", "\uD1A0\uD070 \uBC14", "\uBB38\uC11C \uD0DC\uADF8 \uCE69", "\uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0", "\uD1A0\uD070 \uC0AC\uC6A9\uB7C9"],
7245
+ titleKo: "\uCEE8\uD14D\uC2A4\uD2B8 \uD1A0\uD070 \uAC8C\uC774\uC9C0",
7246
+ titleEn: "Context Token Gauge",
7247
+ summary: "\uCC38\uC870 \uBB38\uC11C \uCE69\uC744 \uD0DC\uADF8 \uD615\uD0DC\uB85C \uCD94\uAC00\xB7\uC0AD\uC81C\uD558\uBA70 \uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0\uC758 \uD1A0\uD070 \uD55C\uB3C4 \uB300\uBE44 \uC18C\uBAA8\uC728\uC744 \uAC8C\uC774\uC9C0\uB85C \uD45C\uC2DC",
7248
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uCCA8\uBD80 \uBB38\uC11C \uD0DC\uADF8 \uCE69\uACFC \uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uAC8C\uC774\uC9C0\uB97C \uAC16\uCD98 \uCEE8\uD14D\uC2A4\uD2B8 \uAD00\uB9AC UI\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 12px \uBAA8\uC11C\uB9AC\uC640 1px \uD14C\uB450\uB9AC\uC758 \uCE74\uB4DC\uB97C \uAD6C\uC131\uD574 \uC918. \uC0C1\uB2E8\uC5D0\uB294 \uCCA8\uBD80\uB41C \uCEE8\uD14D\uC2A4\uD2B8 \uCE69(\uC608: API_Spec.pdf 1200\uD1A0\uD070, System_Prompt 400\uD1A0\uD070)\uB4E4\uC774 \uAC00\uB85C flex\uB85C \uB098\uC5F4\uB418\uBA70, \uAC01 \uCE69\uC740 24px \uB192\uC774, 11px \uAE00\uC790, X \uC0AD\uC81C \uBC84\uD2BC\uC744 \uAC16\uCDB0 \uD074\uB9AD \uC2DC \uC81C\uAC70\uB418\uAC8C \uD574 \uC918. [\uBB38\uC11C \uCD94\uAC00] \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uBA74 \uC0C8\uB85C\uC6B4 \uC0D8\uD50C \uCE69(800\uD1A0\uD070)\uC774 \uCD94\uAC00\uB418\uC5B4\uC57C \uD574. \uD558\uB2E8\uC5D0\uB294 \uCD1D \uD55C\uB3C4 8000\uD1A0\uD070 \uC911 \uD604\uC7AC \uC0AC\uC6A9\uB41C \uD1A0\uD070 \uBE44\uC728\uC744 \uB098\uD0C0\uB0B4\uB294 8px \uB192\uC774\uC758 \uD504\uB85C\uADF8\uB808\uC2A4 \uBC14\uB97C \uB450\uACE0, 70% \uBBF8\uB9CC\uC740 #10b981 \uCD08\uB85D, 70% \uC774\uC0C1 90% \uBBF8\uB9CC\uC740 #f59e0b \uC8FC\uD669, 90% \uC774\uC0C1\uC740 #ef4444 \uBE68\uAC15\uC73C\uB85C \uAC8C\uC774\uC9C0 \uC0C9\uC0C1\uC774 \uBC14\uB00C\uAC8C \uD574 \uC918. \uCE69 \uCD94\uAC00\xB7\uC0AD\uC81C \uC2DC \uAC8C\uC774\uC9C0 \uB108\uBE44\uAC00 200ms \uD2B8\uB79C\uC9C0\uC158\uC73C\uB85C \uBD80\uB4DC\uB7FD\uAC8C \uBCC0\uD574\uC57C \uD574."
7249
+ },
7250
+ /* 2. 스트리밍 & 렌더링 (ai_streaming) */
7251
+ {
7252
+ id: "ai-streaming-text",
7253
+ domain: "ai",
7254
+ category: "ai_streaming",
7255
+ vibeTag: "\uD55C \uAE00\uC790\uC529 \uC2E4\uC2DC\uAC04\uC73C\uB85C \uD0C0\uC774\uD551\uB418\uBA70 \uC0DD\uC131\uB418\uB294",
7256
+ vibeKeywords: ["\uC2A4\uD2B8\uB9AC\uBC0D \uD14D\uC2A4\uD2B8", "\uD384\uC2A4 \uCEE4\uC11C", "\uD0C0\uC774\uD551 \uD6A8\uACFC", "\uC751\uB2F5 \uC911\uB2E8", "\uC2E4\uC2DC\uAC04 \uC0DD\uC131"],
7257
+ titleKo: "\uD384\uC2A4 \uCEE4\uC11C \uC2A4\uD2B8\uB9AC\uBC0D \uD14D\uC2A4\uD2B8",
7258
+ titleEn: "Pulsing Cursor Streaming Text",
7259
+ summary: "\uC751\uB2F5 \uC0DD\uC131 \uC2DC \uAE5C\uBE61\uC774\uB294 \uD384\uC2A4 \uCE90\uB7FF\uACFC \uD568\uAED8 \uAE00\uC790\uAC00 \uD758\uB7EC\uB098\uC624\uBA70 \uC989\uC2DC \uC911\uB2E8\uD560 \uC218 \uC788\uB294 \uCEE8\uD2B8\uB864\uC744 \uC81C\uACF5",
7260
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uC2E4\uC2DC\uAC04 \uD14D\uC2A4\uD2B8 \uC2A4\uD2B8\uB9AC\uBC0D \uD0C0\uC774\uD551\uACFC \uAE5C\uBE61\uC774\uB294 \uD384\uC2A4 \uCE90\uB7FF \uD6A8\uACFC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCE74\uB4DC \uC548\uC5D0\uC11C [\uC751\uB2F5 \uC0DD\uC131] \uBC84\uD2BC\uC744 \uB204\uB974\uBA74 \uBBF8\uB9AC \uC815\uC758\uB41C 150\uC790 \uBD84\uB7C9\uC758 AI \uB2F5\uBCC0\uC774 30ms \uAC04\uACA9\uC73C\uB85C \uD55C \uAE00\uC790\uC529 \uCD9C\uB825\uB418\uAC8C \uD574 \uC918. \uD14D\uC2A4\uD2B8 \uB9E8 \uB05D\uC5D0\uB294 2px \uB108\uBE44, 14px \uB192\uC774\uC758 #6366f1 \uC0C9\uC0C1 \uC218\uC9C1 \uBC14(\uC778\uB77C\uC778 \uCE90\uB7FF)\uAC00 0.8\uCD08 \uC8FC\uAE30\uB85C \uAE5C\uBE61\uC5EC\uC57C \uD574. \uC2A4\uD2B8\uB9AC\uBC0D \uC911\uC5D0\uB294 [\uC751\uB2F5 \uC0DD\uC131] \uBC84\uD2BC\uC774 [\uC751\uB2F5 \uC911\uC9C0] \uBC84\uD2BC(\uBE68\uAC04\uC0C9 \uD14C\uB450\uB9AC\uC640 12px \uD3F0\uD2B8)\uC73C\uB85C \uC804\uD658\uB418\uBA70, \uD074\uB9AD \uC2DC \uC989\uC2DC \uD0C0\uC774\uBA38\uAC00 \uBA48\uCD94\uACE0 \uCE90\uB7FF\uC774 \uC0AC\uB77C\uC838\uC57C \uD574. \uC644\uB8CC\uB418\uAC70\uB098 \uC911\uC9C0\uB41C \uD6C4\uC5D0\uB294 [\uB2E4\uC2DC \uC0DD\uC131] \uBC84\uD2BC\uC73C\uB85C \uCC98\uC74C\uBD80\uD130 \uC7AC\uC0DD\uD560 \uC218 \uC788\uAC8C \uD574 \uC918. \uB77C\uC774\uD2B8 \uBAA8\uB4DC(#1e293b \uAE00\uC790)\uC640 \uB2E4\uD06C \uBAA8\uB4DC(#f8fafc \uAE00\uC790) \uAC00\uB3C5\uC131\uC744 \uBCF4\uC7A5\uD558\uACE0 unmount \uC2DC \uD0C0\uC774\uBA38\uB97C \uC815\uB9AC\uD574 \uC918."
7261
+ },
7262
+ {
7263
+ id: "ai-code-runner",
7264
+ domain: "ai",
7265
+ category: "ai_streaming",
7266
+ vibeTag: "\uC2E0\uD0DD\uC2A4 \uD558\uC774\uB77C\uC774\uD305\uACFC \uACB0\uACFC \uBBF8\uB9AC\uBCF4\uAE30\uB97C \uC624\uAC00\uB294",
7267
+ vibeKeywords: ["\uC778\uD130\uB799\uD2F0\uBE0C \uCF54\uB4DC \uBE14\uB85D", "\uCF54\uB4DC \uD558\uC774\uB77C\uC774\uD2B8", "\uACB0\uACFC \uBBF8\uB9AC\uBCF4\uAE30", "\uC6D0\uD074\uB9AD \uBCF5\uC0AC", "\uC2E4\uD589 \uD0ED"],
7268
+ titleKo: "\uC778\uD130\uB799\uD2F0\uBE0C \uCF54\uB4DC \uBE14\uB85D",
7269
+ titleEn: "Interactive Code Block",
7270
+ summary: "\uC5B8\uC5B4 \uBC30\uC9C0\uC640 \uBCF5\uC0AC \uBC84\uD2BC\uC744 \uAC16\uCD98 \uCF54\uB4DC \uBE14\uB85D\uC5D0\uC11C \uD0ED \uC804\uD658\uC744 \uD1B5\uD574 \uB80C\uB354\uB9C1\uB41C \uCEF4\uD3EC\uB10C\uD2B8 \uACB0\uACFC\uB97C \uBC14\uB85C \uD655\uC778",
7271
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uCF54\uB4DC \uBDF0\uC640 \uBBF8\uB9AC\uBCF4\uAE30(Preview) \uBDF0\uB97C \uD0ED\uC73C\uB85C \uC804\uD658\uD560 \uC218 \uC788\uB294 \uC778\uD130\uB799\uD2F0\uBE0C \uCF54\uB4DC \uBE14\uB85D\uC744 \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px\uC758 \uC5B4\uB450\uC6B4 \uCE74\uB4DC(#0f172a \uBC30\uACBD, 12px \uBAA8\uC11C\uB9AC, 1px #334155 \uD14C\uB450\uB9AC)\uB97C \uAD6C\uC131\uD574 \uC918. \uC0C1\uB2E8 \uD5E4\uB354(36px \uB192\uC774, \uD328\uB529 12px)\uC5D0\uB294 \uC88C\uCE21\uC5D0 [Code]\uC640 [Preview] 2\uAC1C\uC758 \uD0ED \uBC84\uD2BC(12px \uD3F0\uD2B8, \uC120\uD0DD \uC2DC #6366f1 \uD558\uB2E8 2px \uC778\uB514\uCF00\uC774\uD130)\uACFC TypeScript \uC5B8\uC5B4 \uBC30\uC9C0\uB97C \uB450\uACE0, \uC6B0\uCE21\uC5D0\uB294 [\uBCF5\uC0AC] \uBC84\uD2BC\uC744 \uBC30\uCE58\uD574 \uC918. \uBCF5\uC0AC \uD074\uB9AD \uC2DC 1.5\uCD08\uAC04 [\uBCF5\uC0AC\uB428 \u2713]\uC73C\uB85C \uB77C\uBCA8\uC774 \uC804\uD658\uB418\uC5B4\uC57C \uD574. Code \uD0ED\uC5D0\uC11C\uB294 \uBB38\uBC95 \uD558\uC774\uB77C\uC774\uD2B8 \uC2A4\uD0C0\uC77C\uC774 \uC801\uC6A9\uB41C \uC18C\uC2A4 \uCF54\uB4DC\uB97C \uD45C\uC2DC\uD558\uACE0, Preview \uD0ED\uC73C\uB85C \uC804\uD658\uD558\uBA74 \uD574\uB2F9 \uCF54\uB4DC\uAC00 \uB80C\uB354\uB9C1\uD55C \uC2E4\uC81C \uCE74\uC6B4\uD130 \uBC84\uD2BC UI\uAC00 \uC778\uD130\uB799\uD2F0\uBE0C\uD558\uAC8C \uB3D9\uC791\uD574\uC57C \uD574. \uD0ED \uC804\uD658\uC740 150ms \uD398\uC774\uB4DC \uD6A8\uACFC\uB85C \uBD80\uB4DC\uB7FD\uAC8C \uC5F0\uACB0\uD574 \uC918."
7272
+ },
7273
+ {
7274
+ id: "ai-message-branch",
7275
+ domain: "ai",
7276
+ category: "ai_streaming",
7277
+ vibeTag: "\uB2E4\uC2DC \uC0DD\uC131\uD55C \uB2F5\uBCC0\uB4E4\uC744 \uC790\uC720\uB86D\uAC8C \uB118\uACA8\uBCF4\uB294",
7278
+ vibeKeywords: ["\uBC84\uC804 \uBD84\uAE30", "\uC7AC\uC0DD\uC131 \uD788\uC2A4\uD1A0\uB9AC", "\uC751\uB2F5 \uC2A4\uC704\uCC98", "\uBE0C\uB79C\uCE58 \uB124\uBE44\uAC8C\uC774\uC158", "\uBC84\uC804 \uBE44\uAD50"],
7279
+ titleKo: "\uC751\uB2F5 \uBC84\uC804 \uBD84\uAE30 \uC2A4\uC704\uCC98",
7280
+ titleEn: "Response Branch Switcher",
7281
+ summary: "\uB3D9\uC77C \uD504\uB86C\uD504\uD2B8\uC5D0\uC11C \uC7AC\uC0DD\uC131\uB41C \uC5EC\uB7EC \uB2F5\uBCC0 \uBC84\uC804\uC744 \uC774\uC804/\uB2E4\uC74C \uBC84\uD2BC\uC73C\uB85C \uD0D0\uC0C9\uD558\uBA70 \uBD84\uAE30 \uC774\uB825\uC744 \uAD00\uB9AC",
7282
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uC5EC\uB7EC \uBC88 \uC7AC\uC0DD\uC131\uB41C AI \uC751\uB2F5 \uBC84\uC804\uC744 \uB118\uACA8\uBCFC \uC218 \uC788\uB294 \uBD84\uAE30 \uC2A4\uC704\uCC98 UI\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 \uB9D0\uD48D\uC120 \uCE74\uB4DC(12px \uBAA8\uC11C\uB9AC, \uD328\uB529 16px, 1px \uD14C\uB450\uB9AC)\uB97C \uB450\uACE0, \uD558\uB2E8\uC5D0 < 1 / 3 > \uD615\uD0DC\uC758 \uBC84\uC804 \uB124\uBE44\uAC8C\uC774\uC158 \uCEE8\uD2B8\uB864(\uB192\uC774 28px, 11px \uAE00\uC790)\uC744 \uBC30\uCE58\uD574 \uC918. \uC88C\uC6B0 \uD654\uC0B4\uD45C \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uBA74 \uBC84\uC804 \uC778\uB371\uC2A4\uAC00 \uBC14\uB00C\uBA74\uC11C \uC774\uC804/\uB2E4\uC74C \uC751\uB2F5 \uD14D\uC2A4\uD2B8(\uC608: \uBC84\uC804 1 \uAC04\uACB0\uD615, \uBC84\uC804 2 \uC0C1\uC138\uD615, \uBC84\uC804 3 \uD45C \uD615\uC2DD)\uB85C 200ms \uC2AC\uB77C\uC774\uB4DC \uC804\uD658\uB418\uC5B4\uC57C \uD574. \uC6B0\uCE21 \uC0C1\uB2E8\uC5D0\uB294 [\uC0C8 \uBC84\uC804 \uC0DD\uC131] \uBC84\uD2BC\uC744 \uB450\uC5B4 \uD074\uB9AD \uC2DC 4\uBC88\uC9F8 \uBC84\uC804\uC774 \uBC30\uC5F4\uC5D0 \uCD94\uAC00\uB418\uACE0 \uC989\uC2DC \uD574\uB2F9 \uBC84\uC804\uC73C\uB85C \uC774\uB3D9\uD558\uAC8C \uD574 \uC918. \uCCAB \uBC84\uC804\uC77C \uB54C\uB294 \uC774\uC804 \uBC84\uD2BC\uC774 \uBE44\uD65C\uC131\uD654\uB418\uACE0 \uB9C8\uC9C0\uB9C9 \uBC84\uC804\uC77C \uB54C\uB294 \uB2E4\uC74C \uBC84\uD2BC\uC774 \uBE44\uD65C\uC131\uD654\uB418\uC5B4\uC57C \uD574."
7283
+ },
7284
+ /* 3. 추론 & 사고과정 (ai_reasoning) */
7285
+ {
7286
+ id: "ai-thinking-accordion",
7287
+ domain: "ai",
7288
+ category: "ai_reasoning",
7289
+ vibeTag: "AI\uC758 \uCD94\uB860 \uB2E8\uACC4\uB97C \uD22C\uBA85\uD558\uAC8C \uD3BC\uCCD0\uBCF4\uB294",
7290
+ vibeKeywords: ["\uC0AC\uACE0 \uACFC\uC815 \uC544\uCF54\uB514\uC5B8", "\uCD94\uB860 \uD1A0\uAE00", "Thinking Log", "CoT \uB2E8\uACC4", "\uACBD\uACFC \uC2DC\uAC04"],
7291
+ titleKo: "\uC0AC\uACE0 \uACFC\uC815 \uC544\uCF54\uB514\uC5B8",
7292
+ titleEn: "Thinking Process Accordion",
7293
+ summary: "\uACBD\uACFC \uC2DC\uAC04 \uBC30\uC9C0\uC640 \uD568\uAED8 AI\uC758 \uB0B4\uBD80 \uCD94\uB860(Chain-of-Thought) \uB85C\uADF8\uB97C \uC811\uACE0 \uD3BC\uCE58\uBA70 \uC810\uAC80",
7294
+ promptSnippet: '\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 AI\uC758 \uCD94\uB860 \uACFC\uC815(Chain-of-Thought)\uC744 \uC811\uACE0 \uD3BC\uCE60 \uC218 \uC788\uB294 \uC544\uCF54\uB514\uC5B8 UI\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 12px \uBAA8\uC11C\uB9AC\uC640 1px \uD14C\uB450\uB9AC\uC758 \uCE74\uB4DC\uB97C \uAD6C\uC131\uD574 \uC918. \uC0C1\uB2E8 \uBC14(\uB192\uC774 40px, \uD328\uB529 12px)\uC5D0\uB294 \uC804\uAD6C \uC544\uC774\uCF58, "\uC0AC\uACE0 \uACFC\uC815 (4\uCD08 \uC18C\uC694)" \uD14D\uC2A4\uD2B8, \uD384\uC2A4 \uC560\uB2C8\uBA54\uC774\uC158 \uB3C4\uD2B8, \uC6B0\uCE21 \uD68C\uC804 \uD654\uC0B4\uD45C\uB97C \uBC30\uCE58\uD574 \uC918. \uC0C1\uB2E8 \uBC14\uB97C \uD074\uB9AD\uD558\uBA74 200ms \uD2B8\uB79C\uC9C0\uC158\uC73C\uB85C \uBCF8\uBB38 \uC601\uC5ED\uC774 \uD3BC\uCCD0\uC9C0\uAC70\uB098 \uB2EB\uD600\uC57C \uD574. \uD3BC\uCCD0\uC9C4 \uBCF8\uBB38(\uD328\uB529 12px, 12px \uD3F0\uD2B8, \uD750\uB9B0 \uD68C\uC0C9 \uD14D\uC2A4\uD2B8)\uC5D0\uB294 3\uB2E8\uACC4 \uC0AC\uACE0 \uD750\uB984("1. \uC9C8\uBB38 \uC758\uB3C4 \uBD84\uC11D \uC644\uB8CC", "2. \uAD00\uB828 \uBB38\uC11C 3\uAC74 \uC778\uB371\uC2F1", "3. \uCD5C\uC885 \uB2F5\uBCC0 \uC694\uC57D \uC791\uC131")\uC774 \uD0C0\uC784\uB77C\uC778 \uD615\uD0DC\uB85C \uCCB4\uD06C \uC544\uC774\uCF58\uACFC \uD568\uAED8 \uD45C\uC2DC\uB418\uC5B4\uC57C \uD574. \uB77C\uC774\uD2B8\uC640 \uB2E4\uD06C \uBAA8\uB4DC\uC5D0 \uB9DE\uCDB0 \uBC30\uACBD(#f8fafc vs #1e293b)\uACFC \uD14C\uB450\uB9AC\uAC00 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uC804\uD658\uB418\uB3C4\uB85D \uD574 \uC918.'
7295
+ },
7296
+ {
7297
+ id: "ai-source-citation",
7298
+ domain: "ai",
7299
+ category: "ai_reasoning",
7300
+ vibeTag: "\uB2F5\uBCC0 \uC18D \uC778\uC6A9 \uBC88\uD638\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uC62C\uB9AC\uBA74 \uADFC\uAC70\uB97C \uBCF4\uC5EC\uC8FC\uB294",
7301
+ vibeKeywords: ["\uCD9C\uCC98 \uC778\uC6A9 \uCE69", "\uC778\uB77C\uC778 \uB808\uD37C\uB7F0\uC2A4", "\uCD9C\uCC98 \uBBF8\uB9AC\uBCF4\uAE30", "\uCC38\uACE0 \uBB38\uD5CC \uD31D\uC624\uBC84", "\uADFC\uAC70 \uCE74\uB4DC"],
7302
+ titleKo: "\uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9 \uD31D\uC624\uBC84",
7303
+ titleEn: "Inline Source Citation Popover",
7304
+ summary: "\uD14D\uC2A4\uD2B8 \uC18D \uC778\uC6A9 \uBC30\uC9C0\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uC62C\uB9AC\uBA74 \uC6D0\uBB38 \uC0AC\uC774\uD2B8\uC758 \uD30C\uBE44\uCF58, \uC81C\uBAA9, \uBC1C\uCDCC \uC2A4\uB2C8\uD3AB \uCE74\uB4DC\uB97C \uD31D\uC624\uBC84\uB85C \uB178\uCD9C",
7305
+ promptSnippet: '\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uD14D\uC2A4\uD2B8 \uC778\uB77C\uC778 \uCD9C\uCC98 \uBC88\uD638 \uBC43\uC9C0\uC640 \uD638\uBC84 \uD31D\uC624\uBC84 \uCE74\uB4DC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 AI \uB2F5\uBCC0 \uBB38\uC7A5\uC744 \uD45C\uC2DC\uD558\uACE0, \uBB38\uC7A5 \uB05D\uC5D0 [1], [2] \uD615\uD0DC\uC758 \uC791\uC740 \uC778\uC6A9 \uCE69(\uB192\uC774 18px, \uD328\uB529 \uC88C\uC6B0 6px, 11px \uAE00\uC790, \uB465\uADFC \uBAA8\uC11C\uB9AC 9999px, #6366f1 \uD14D\uC2A4\uD2B8)\uC744 \uBC30\uCE58\uD574 \uC918. \uC778\uC6A9 \uCE69\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uC62C\uB9AC\uAC70\uB098 \uD3EC\uCEE4\uC2A4\uD558\uBA74 \uCE69 \uC0C1\uB2E8\uC73C\uB85C 240px \uB108\uBE44\uC758 \uCD9C\uCC98 \uBBF8\uB9AC\uBCF4\uAE30 \uCE74\uB4DC(12px \uBAA8\uC11C\uB9AC, \uD328\uB529 10px, 1px \uD14C\uB450\uB9AC, \uADF8\uB9BC\uC790)\uAC00 150ms \uD398\uC774\uB4DC\uC778\uC73C\uB85C \uB098\uD0C0\uB098\uAC8C \uD574 \uC918. \uD31D\uC624\uBC84 \uCE74\uB4DC \uB0B4\uBD80\uC5D0\uB294 \uBB38\uC11C \uC544\uC774\uCF58, \uCD9C\uCC98 \uC6F9\uD398\uC774\uC9C0 \uC81C\uBAA9("React 19 \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uAC00\uC774\uB4DC"), \uB3C4\uBA54\uC778 URL("react.dev"), \uD575\uC2EC \uBC1C\uCDCC\uBB38 2\uC904\uC774 \uD3EC\uD568\uB418\uC5B4\uC57C \uD574. \uB9C8\uC6B0\uC2A4\uAC00 \uBC97\uC5B4\uB098\uBA74 \uD31D\uC624\uBC84\uAC00 \uBD80\uB4DC\uB7FD\uAC8C \uC0AC\uB77C\uC9C0\uB3C4\uB85D \uD574 \uC918.'
7306
+ },
7307
+ /* 4. 에이전트 & 도구 (ai_agent) */
7308
+ {
7309
+ id: "ai-tool-call-card",
7310
+ domain: "ai",
7311
+ category: "ai_agent",
7312
+ vibeTag: "\uB3C4\uAD6C \uD638\uCD9C \uC778\uC790\uC640 \uC2E4\uD589 \uACB0\uACFC\uB97C \uC2DC\uAC01\uD654\uD558\uB294",
7313
+ vibeKeywords: ["\uB3C4\uAD6C \uC2E4\uD589 \uCE74\uB4DC", "Tool Call", "\uD568\uC218 \uD638\uCD9C", "\uC2E4\uD589 \uC0C1\uD0DC \uBC30\uC9C0", "\uD30C\uB77C\uBBF8\uD130 \uC811\uAE30"],
7314
+ titleKo: "\uC5D0\uC774\uC804\uD2B8 \uB3C4\uAD6C \uC2E4\uD589 \uCE74\uB4DC",
7315
+ titleEn: "Agent Tool Execution Card",
7316
+ summary: "\uAC80\uC0C9\xB7\uACC4\uC0B0 \uB4F1 \uC5D0\uC774\uC804\uD2B8\uAC00 \uD638\uCD9C\uD55C \uB3C4\uAD6C \uC774\uB984, \uC804\uB2EC \uC778\uC790, \uC2E4\uD589 \uC9C4\uD589 \uC2A4\uD53C\uB108 \uBC0F \uACB0\uACFC\uB97C \uB2E8\uACC4\uBCC4 \uCE74\uB4DC\uB85C \uD45C\uC2DC",
7317
+ promptSnippet: '\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 AI \uC5D0\uC774\uC804\uD2B8\uC758 \uB3C4\uAD6C \uC2E4\uD589(Tool Call) \uC0C1\uD0DC\uC640 \uC785\uCD9C\uB825\uC744 \uBCF4\uC5EC\uC8FC\uB294 \uCE74\uB4DC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 12px \uBAA8\uC11C\uB9AC\uC640 1px \uD14C\uB450\uB9AC\uC758 \uBC15\uC2A4\uB97C \uAD6C\uC131\uD574 \uC918. \uCE74\uB4DC \uD5E4\uB354\uC5D0\uB294 \uB80C\uCE58 \uC544\uC774\uCF58, \uB3C4\uAD6C \uC774\uB984("search_docs"), \uC2E4\uD589 \uC0C1\uD0DC \uBC30\uC9C0(\uC2E4\uD589 \uC911\uC5D0\uB294 \uD30C\uB780 \uC2A4\uD53C\uB108\uC640 "\uC2E4\uD589 \uC911...", \uC644\uB8CC \uC2DC \uCD08\uB85D \uCCB4\uD06C\uC640 "\uC131\uACF5 (120ms)")\uB97C \uD45C\uC2DC\uD574 \uC918. [\uB3C4\uAD6C \uC7AC\uC2E4\uD589] \uBC84\uD2BC\uC744 \uB204\uB974\uBA74 1.2\uCD08\uAC04 \uC2E4\uD589 \uC911 \uC0C1\uD0DC\uB85C \uC804\uD658\uB41C \uD6C4 \uC644\uB8CC \uC0C1\uD0DC\uB85C \uBCF5\uADC0\uD574\uC57C \uD574. \uBCF8\uBB38\uC5D0\uB294 \uC804\uB2EC\uB41C \uC778\uC790 JSON(query: "vibe coding")\uACFC \uBC18\uD658\uB41C \uACB0\uACFC \uC694\uC57D\uC774 \uC544\uCF54\uB514\uC5B8 \uD615\uD0DC\uB85C \uD3EC\uD568\uB418\uC5B4 \uD074\uB9AD \uC2DC \uC811\uAC70\uB098 \uD3BC\uCE60 \uC218 \uC788\uAC8C \uD574 \uC918. \uBAA8\uB178\uC2A4\uD398\uC774\uC2A4 \uAE00\uAF34\uACFC \uB77C\uC774\uD2B8/\uB2E4\uD06C \uD14C\uB9C8 \uBC30\uACBD\uC744 \uC9C0\uC6D0\uD574 \uC918.'
7318
+ },
7319
+ {
7320
+ id: "ai-human-in-the-loop",
7321
+ domain: "ai",
7322
+ category: "ai_agent",
7323
+ vibeTag: "\uC704\uD5D8\uD55C \uC791\uC5C5\uC744 \uC2E4\uD589\uD558\uAE30 \uC804 \uC0AC\uB78C\uC758 \uD655\uC778\uC744 \uAD6C\uD558\uB294",
7324
+ vibeKeywords: ["\uC2B9\uC778 \uAC00\uB4DC\uB808\uC77C", "Human-in-the-loop", "\uC791\uC5C5 \uC2B9\uC778 \uBAA8\uB2EC", "\uC704\uD5D8 \uBA85\uB839 \uCC28\uB2E8", "\uC2E4\uD589 \uD5C8\uC6A9"],
7325
+ titleKo: "\uC5D0\uC774\uC804\uD2B8 \uC2B9\uC778 \uAC00\uB4DC\uB808\uC77C",
7326
+ titleEn: "Agent Approval Guardrail",
7327
+ summary: "\uC911\uC694\uD55C \uD30C\uC77C \uC218\uC815\uC774\uB098 \uC678\uBD80 \uC804\uC1A1 \uC804 \uC704\uD5D8\uB3C4 \uBC30\uC9C0\uC640 \uC601\uD5A5\uB3C4\uB97C \uC548\uB0B4\uD558\uACE0 \uC0AC\uC6A9\uC790\uC758 \uBA85\uC2DC\uC801 \uC2B9\uC778\xB7\uAC70\uC808\uC744 \uC218\uC2E0",
7328
+ promptSnippet: '\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uC5D0\uC774\uC804\uD2B8\uC758 \uC7A0\uC7AC\uC801 \uC704\uD5D8 \uC791\uC5C5\uC5D0 \uB300\uD55C Human-in-the-loop \uC2B9\uC778 \uCE74\uB4DC \uC778\uD130\uB799\uC158\uC744 \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 \uC8FC\uD669\uC0C9 \uACBD\uACE0 \uD14C\uB450\uB9AC(1px #f59e0b)\uC640 12px \uBAA8\uC11C\uB9AC\uC758 \uCE74\uB4DC\uB97C \uBC30\uCE58\uD574 \uC918. \uC0C1\uB2E8\uC5D0\uB294 \uACBD\uACE0 \uC0BC\uAC01\uD615 \uC544\uC774\uCF58, "\uD30C\uC77C \uC0AD\uC81C \uC2B9\uC778 \uC694\uCCAD", \uC704\uD5D8\uB3C4 [High] \uBE68\uAC04 \uBC30\uC9C0\uB97C \uB450\uACE0, \uC911\uC559\uC5D0\uB294 \uC2E4\uD589 \uC608\uC815 \uBA85\uB839("rm -rf ./temp_cache")\uACFC \uC601\uD5A5\uBC1B\uB294 \uD30C\uC77C 3\uAC74\uC758 \uBAA9\uB85D\uC744 \uC548\uB0B4\uD574 \uC918. \uD558\uB2E8\uC5D0\uB294 [\uAC70\uC808\uD558\uAE30] \uBC84\uD2BC(\uD68C\uC0C9 \uBCF4\uB354, 32px \uB192\uC774)\uACFC [\uC2B9\uC778\uD558\uC5EC \uC2E4\uD589] \uBC84\uD2BC(\uC8FC\uD669/\uBE68\uAC15 \uBC30\uACBD, \uD770\uC0C9 \uD14D\uC2A4\uD2B8, 32px \uB192\uC774)\uC744 \uC81C\uACF5\uD574 \uC918. \uC2B9\uC778 \uD074\uB9AD \uC2DC \uCD08\uB85D\uC0C9 "\uC2B9\uC778 \uC644\uB8CC\uB428" \uC0C1\uD0DC\uB85C \uCE74\uB4DC \uB0B4\uC6A9\uC774 \uC804\uD658\uB418\uACE0, \uAC70\uC808 \uD074\uB9AD \uC2DC \uD68C\uC0C9 "\uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4"\uB85C \uBCC0\uACBD\uB418\uBA70 \uBCF5\uC6D0 \uBC84\uD2BC\uC744 \uC81C\uACF5\uD574 \uC918.'
7329
+ }
7330
+ ];
7331
+
7214
7332
  // ../../packages/catalog/src/techniques.ts
7215
7333
  var UI_CATEGORIES = [
7216
7334
  { id: "all", label: "\uC804\uCCB4" },
@@ -7260,13 +7378,21 @@ var VIDEO_CATEGORIES = [
7260
7378
  { id: "infographic", label: "\uB370\uC774\uD130\xB7\uCC28\uD2B8 \uBAA8\uC158" },
7261
7379
  { id: "broadcast", label: "\uBC29\uC1A1\xB7\uD2B8\uB79C\uC9C0\uC158\xB7\uC790\uB9C9" }
7262
7380
  ];
7381
+ var AI_CATEGORIES = [
7382
+ { id: "all", label: "\uC804\uCCB4" },
7383
+ { id: "ai_input", label: "\uC785\uB825\xB7\uD504\uB86C\uD504\uD2B8" },
7384
+ { id: "ai_streaming", label: "\uC2A4\uD2B8\uB9AC\uBC0D\xB7\uB80C\uB354\uB9C1" },
7385
+ { id: "ai_reasoning", label: "\uCD94\uB860\xB7\uC0AC\uACE0\uACFC\uC815" },
7386
+ { id: "ai_agent", label: "\uC5D0\uC774\uC804\uD2B8\xB7\uB3C4\uAD6C" }
7387
+ ];
7263
7388
  var DOMAIN_LABELS = {
7264
7389
  ui: "UI",
7265
7390
  motion: "\uADF8\uB798\uD53D",
7266
7391
  layout: "\uB808\uC774\uC544\uC6C3",
7267
7392
  style: "\uC2A4\uD0C0\uC77C",
7268
7393
  pixelart: "\uD53D\uC140\uC544\uD2B8",
7269
- video: "\uBAA8\uC158 \uC601\uC0C1"
7394
+ video: "\uBAA8\uC158 \uC601\uC0C1",
7395
+ ai: "AI \uB124\uC774\uD2F0\uBE0C"
7270
7396
  };
7271
7397
  var DOMAIN_CATEGORIES = {
7272
7398
  ui: UI_CATEGORIES,
@@ -7274,7 +7400,8 @@ var DOMAIN_CATEGORIES = {
7274
7400
  layout: LAYOUT_CATEGORIES,
7275
7401
  style: STYLE_CATEGORIES,
7276
7402
  pixelart: PIXELART_CATEGORIES,
7277
- video: VIDEO_CATEGORIES
7403
+ video: VIDEO_CATEGORIES,
7404
+ ai: AI_CATEGORIES
7278
7405
  };
7279
7406
  var CATEGORY_LABEL_MAP = Object.fromEntries(
7280
7407
  [
@@ -7283,10 +7410,12 @@ var CATEGORY_LABEL_MAP = Object.fromEntries(
7283
7410
  ...LAYOUT_CATEGORIES,
7284
7411
  ...STYLE_CATEGORIES,
7285
7412
  ...PIXELART_CATEGORIES,
7286
- ...VIDEO_CATEGORIES
7413
+ ...VIDEO_CATEGORIES,
7414
+ ...AI_CATEGORIES
7287
7415
  ].map((c) => [c.id, c.label])
7288
7416
  );
7289
7417
  var TECHNIQUES = [
7418
+ ...AI_ADDITIONS,
7290
7419
  ...STARTER_PACK_ADDITIONS,
7291
7420
  ...SIGNATURE_ADDITIONS,
7292
7421
  ...UI_COLLECTION_ADDITIONS,
@@ -7329,7 +7458,7 @@ var TECHNIQUES = [
7329
7458
  ];
7330
7459
 
7331
7460
  // ../../packages/catalog/src/translations/classification.en.ts
7332
- var DOMAIN_LABELS_EN = { ui: "UI", motion: "Graphics", layout: "Layout", style: "Style", pixelart: "Pixel Art", video: "Motion video" };
7461
+ var DOMAIN_LABELS_EN = { ui: "UI", motion: "Graphics", layout: "Layout", style: "Style", pixelart: "Pixel Art", video: "Motion video", ai: "AI Native" };
7333
7462
 
7334
7463
  // ../../packages/catalog/src/translations/additions/base.ts
7335
7464
  var text = (summary, vibeTag, keywords, promptSnippet) => ({ summary, vibeTag, vibeKeywords: keywords.split("|"), promptSnippet });
@@ -11761,6 +11890,70 @@ var EN_VFX_TECHNIQUES = {
11761
11890
  }
11762
11891
  };
11763
11892
 
11893
+ // ../../packages/catalog/src/translations/additions/ai.ts
11894
+ var EN_AI_TECHNIQUES = {
11895
+ "ai-prompt-box": {
11896
+ vibeTag: "Expands smoothly to fit your input length",
11897
+ vibeKeywords: ["prompt box", "autoresize textarea", "model toggle", "prompt submit", "input card"],
11898
+ summary: "Textarea expands smoothly with text length while managing Fast/Pro model switching, file attach, and submission states.",
11899
+ promptSnippet: "Build an interactive prompt input box that expands with text length in the specified area. Inside a container of width 100% and min-height 180px, create a card frame with 1px border (light #e2e8f0, dark #334155), 16px rounded corners, and background (light #ffffff, dark #0f172a). Place a textarea at the top (min-height 48px, max-height 120px, overflow-y auto, resize none, font size 14px, padding 12px) that dynamically adjusts its height based on scrollHeight as the user types. In the bottom toolbar, provide a 2-segment button group on the left to toggle between Fast and Pro modes (height 28px, font size 11px, 8px rounded corners, active state with #6366f1 background and white text) along with an attachment button. On the right, include a circular submit button (diameter 32px, #6366f1 background, white arrow icon) that activates when text is present. Pressing Enter submits the prompt while Shift+Enter inserts a new line. Submitting clears the input and resets height to 48px. Implement with pure React and Tailwind CSS without external libraries."
11900
+ },
11901
+ "ai-slash-command": {
11902
+ vibeTag: "Invokes quick commands on typing a slash",
11903
+ vibeKeywords: ["slash command", "prompt commands", "command popover", "shortcut menu", "keyboard palette"],
11904
+ summary: "Typing a slash opens a floating command palette with keyboard navigation and instant autocomplete.",
11905
+ promptSnippet: "Create a slash command popover interaction triggered by the slash (/) character in the specified area. In a container of width 100% and min-height 180px, provide a single input or textarea. When the user types /, display a 220px wide floating menu above the input with a 150ms fade-in transition. The popover menu displays 4 command options: Summarize (/summarize), Translate (/translate), Generate Code (/code), and Refactor (/refactor), each with height 36px, padding 8px, font size 12px, and an icon. Allow users to navigate the focused item using Up/Down arrow keys, and select an option via Enter key or click to replace / with the command prompt and dismiss the popover. Pressing Escape cancels the popover. Support light (#ffffff background / #e2e8f0 border) and dark (#1e293b background / #475569 border) themes using pure React state without external dependencies."
11906
+ },
11907
+ "ai-context-pill": {
11908
+ vibeTag: "Visualizes attached context and token consumption at a glance",
11909
+ vibeKeywords: ["context gauge", "token bar", "document tag pills", "context window", "token usage"],
11910
+ summary: "Manage referenced document tags and track context window token capacity with a color-coded progress gauge.",
11911
+ promptSnippet: "Create a context management UI featuring attached document tag pills and a real-time token gauge in the specified area. Inside a container of width 100% and min-height 180px, build a card with 12px rounded corners and 1px border. At the top, list attached context chips (e.g., API_Spec.pdf at 1200 tokens, System_Prompt at 400 tokens) in a horizontal flex layout, where each chip has height 24px, font size 11px, and an X button to remove on click. Clicking an [Add Document] button appends a new sample chip (800 tokens). At the bottom, display an 8px tall progress bar showing token consumption relative to the total limit of 8000 tokens. The gauge color changes dynamically: #10b981 green below 70%, #f59e0b amber between 70% and 90%, and #ef4444 red at or above 90%. Adjust gauge width smoothly with a 200ms transition upon adding or removing chips."
11912
+ },
11913
+ "ai-streaming-text": {
11914
+ vibeTag: "Generates text character-by-character in real time",
11915
+ vibeKeywords: ["streaming text", "pulsing cursor", "typing effect", "stop response", "realtime generation"],
11916
+ summary: "Simulate live response streaming with a blinking pulse caret and an immediate stop button.",
11917
+ promptSnippet: "Create a real-time text streaming typing effect with a blinking pulse caret in the specified area. Inside a card of width 100% and min-height 180px, clicking [Generate Response] streams a predefined 150 character AI answer character-by-character at 30ms intervals. At the trailing edge of the text, render an inline caret consisting of a 2px wide, 14px tall vertical bar colored #6366f1 that pulses every 0.8 seconds. While streaming, the button switches to [Stop Generating] with a red border and font size 12px, which immediately clears the timer and hides the caret upon click. Once complete or stopped, allow the user to replay from the start via [Regenerate]. Ensure contrast in light (#1e293b text) and dark (#f8fafc text) modes, and clean up the timer on unmount."
11918
+ },
11919
+ "ai-code-runner": {
11920
+ vibeTag: "Toggles seamlessly between syntax highlighting and live preview",
11921
+ vibeKeywords: ["interactive code block", "code highlight", "result preview", "one-click copy", "execution tab"],
11922
+ summary: "Tabbed code container with language badge, copy confirmation, and interactive component preview.",
11923
+ promptSnippet: "Build an interactive code block that toggles between code view and live preview in the specified area. Inside a dark card of width 100% and min-height 180px (#0f172a background, 12px corners, 1px #334155 border), construct a top header (height 36px, padding 12px). The header features [Code] and [Preview] tab buttons on the left (font size 12px, active tab with a #6366f1 bottom 2px indicator) and a TypeScript badge, with a [Copy] button on the right. Clicking copy temporarily displays [Copied \u2713] for 1.5 seconds. The Code tab renders syntax-highlighted source code, while switching to Preview displays the live interactive counter button rendered by that code. Smoothly transition between tabs using a 150ms fade effect."
11924
+ },
11925
+ "ai-message-branch": {
11926
+ vibeTag: "Navigate freely across regenerated response branches",
11927
+ vibeKeywords: ["branch switcher", "regenerate history", "response switcher", "branch navigation", "version comparison"],
11928
+ summary: "Explore multiple regenerated AI response variations using previous and next pagination buttons.",
11929
+ promptSnippet: "Create a response branch switcher UI allowing users to flip through multiple regenerated AI response versions in the specified area. Inside a container of width 100% and min-height 180px, place a message card (12px corners, padding 16px, 1px border) with a version navigation control formatted as < 1 / 3 > at the bottom (height 28px, font size 11px). Clicking the left or right arrow updates the version index and transitions between response texts (e.g., version 1 concise, version 2 detailed, version 3 tabular) with a 200ms slide animation. Provide a [Generate New Version] button in the top right that appends a 4th version to the array and jumps to it immediately. Disable the previous button on the first version and the next button on the last version."
11930
+ },
11931
+ "ai-thinking-accordion": {
11932
+ vibeTag: "Transparently unfolds the step-by-step AI reasoning",
11933
+ vibeKeywords: ["thinking accordion", "reasoning toggle", "thinking log", "chain of thought", "elapsed time"],
11934
+ summary: "Inspect the AI internal Chain-of-Thought log with an elapsed time badge and collapsible accordion.",
11935
+ promptSnippet: 'Create an accordion UI to inspect the AI Chain-of-Thought reasoning steps in the specified area. Inside a container of width 100% and min-height 180px, build a card with 12px rounded corners and 1px border. The top bar (height 40px, padding 12px) contains a lightbulb icon, "Thinking Process (4s elapsed)" label, a pulsing dot animation, and a rotating arrow on the right. Clicking the bar toggles the body open or closed with a 200ms transition. The expanded body (padding 12px, font size 12px, muted text) reveals a 3-step reasoning timeline ("1. Query intent analyzed", "2. 3 relevant docs indexed", "3. Final answer synthesized") with checkmark icons. Ensure natural background (#f8fafc vs #1e293b) and border adaptation across light and dark modes.'
11936
+ },
11937
+ "ai-source-citation": {
11938
+ vibeTag: "Reveals verifiable source cards upon hovering reference chips",
11939
+ vibeKeywords: ["source citation chips", "inline reference", "source preview", "citation popover", "evidence card"],
11940
+ summary: "Hovering inline citation badges displays a popover card with site favicon, title, and key excerpt.",
11941
+ promptSnippet: 'Create an inline citation badge and hover preview card interaction in the specified area. Inside a container of width 100% and min-height 180px, render an AI answer sentence ending with small citation chips like [1] and [2] (height 18px, horizontal padding 6px, font size 11px, border-radius 9999px, #6366f1 text). Hovering or focusing a citation chip triggers a 240px wide preview popover card (12px corners, padding 10px, 1px border, shadow) above the chip with a 150ms fade-in transition. The popover card includes a document icon, web page title ("React 19 Migration Guide"), domain URL ("react.dev"), and a 2-line snippet excerpt. The popover gracefully disappears when the cursor leaves.'
11942
+ },
11943
+ "ai-tool-call-card": {
11944
+ vibeTag: "Visualizes tool invocation arguments and execution output",
11945
+ vibeKeywords: ["tool execution card", "tool call", "function calling", "execution status badge", "parameter fold"],
11946
+ summary: "Displays tool invocation name, parameters, execution spinner, and returned output in an expandable card.",
11947
+ promptSnippet: 'Build a tool execution card displaying agent tool invocation status and parameters in the specified area. Inside a container of width 100% and min-height 180px, construct a box with 12px corners and 1px border. The card header shows a wrench icon, tool name ("search_docs"), and a status badge (blue spinner with "Running..." during execution, green check with "Success (120ms)" on completion). Clicking a [Re-run Tool] button sets the status to running for 1.2 seconds before returning to completed. The body features a collapsible accordion containing input arguments JSON (query: "vibe coding") and returned output summary. Support monospace typography and light/dark theme backgrounds.'
11948
+ },
11949
+ "ai-human-in-the-loop": {
11950
+ vibeTag: "Requests human confirmation before executing critical operations",
11951
+ vibeKeywords: ["approval guardrail", "human in the loop", "action approval modal", "safety confirmation", "execution consent"],
11952
+ summary: "Prompts users with risk severity badges and impact summaries for explicit approval or rejection before critical actions.",
11953
+ promptSnippet: 'Create a Human-in-the-loop approval card interaction for critical agent operations in the specified area. Inside a container of width 100% and min-height 180px, position a card with an amber warning border (1px #f59e0b) and 12px rounded corners. The top section displays a warning triangle icon, "File Deletion Approval Required" title, and a red [High] risk badge. The center outlines the command to execute ("rm -rf ./temp_cache") and lists 3 affected files. The bottom bar provides a [Reject] button (gray border, height 32px) and an [Approve & Execute] button (amber/red background, white text, height 32px). Clicking approve transitions the card into a green "Operation Approved" state, while clicking reject updates it to a gray "Operation Cancelled" state with an option to restore.'
11954
+ }
11955
+ };
11956
+
11764
11957
  // ../../packages/catalog/src/translations/additions/patterns.ts
11765
11958
  var EN_PATTERN_TECHNIQUES = {
11766
11959
  "zoom-lightbox-gallery": {
@@ -11797,6 +11990,7 @@ var EN_PATTERN_TECHNIQUES = {
11797
11990
 
11798
11991
  // ../../packages/catalog/src/translations/en.ts
11799
11992
  var ENGLISH_TECHNIQUES = {
11993
+ ...EN_AI_TECHNIQUES,
11800
11994
  ...EN_STARTER_PACK_TECHNIQUES,
11801
11995
  ...EN_SIGNATURE_TECHNIQUES,
11802
11996
  ...EN_UI_COLLECTION,
@@ -19715,10 +19909,135 @@ var VFX_SEARCH_METADATA = {
19715
19909
  }
19716
19910
  };
19717
19911
 
19912
+ // ../../packages/catalog/src/search-metadata/additions/ai.ts
19913
+ var AI_SEARCH_METADATA = {
19914
+ "ai-prompt-box": {
19915
+ targets: ["input", "button", "card"],
19916
+ triggers: ["input", "click"],
19917
+ useCases: {
19918
+ ko: ["\uD14D\uC2A4\uD2B8 \uAE38\uC774\uC5D0 \uB530\uB77C \uD655\uC7A5\uB418\uB294 \uD504\uB86C\uD504\uD2B8 \uC785\uB825\uCC3D\uACFC \uBAA8\uB378 \uC804\uD658"],
19919
+ en: ["Auto-expanding prompt textarea with model toggle and submission"]
19920
+ },
19921
+ aliases: {
19922
+ ko: ["\uC624\uD1A0\uB9AC\uC0AC\uC774\uC988 \uC785\uB825\uCC3D", "\uD504\uB86C\uD504\uD2B8 \uC778\uD48B", "\uCC57\uBD07 \uC785\uB825\uCC3D"],
19923
+ en: ["autoresize prompt input", "chat prompt box"]
19924
+ }
19925
+ },
19926
+ "ai-slash-command": {
19927
+ targets: ["input", "panel", "list"],
19928
+ triggers: ["input", "click"],
19929
+ useCases: {
19930
+ ko: ["\uC2AC\uB798\uC2DC(/) \uBB38\uC790\uB85C \uBA85\uB839\uC5B4 \uBA54\uB274\uB97C \uC5F4\uACE0 \uBC29\uD5A5\uD0A4\uC640 \uC5D4\uD130\uB85C \uC790\uB3D9 \uC644\uC131"],
19931
+ en: ["Trigger slash command popover menu with keyboard navigation and autocomplete"]
19932
+ },
19933
+ aliases: {
19934
+ ko: ["\uC2AC\uB798\uC2DC \uBA54\uB274", "\uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8", "\uD504\uB86C\uD504\uD2B8 \uB2E8\uCD95\uD0A4"],
19935
+ en: ["slash command palette", "command popover"]
19936
+ }
19937
+ },
19938
+ "ai-context-pill": {
19939
+ targets: ["card", "panel", "chart"],
19940
+ triggers: ["click"],
19941
+ useCases: {
19942
+ ko: ["\uCC38\uC870 \uBB38\uC11C \uD0DC\uADF8 \uCE69\uC744 \uCD94\uAC00/\uC81C\uAC70\uD558\uACE0 \uD1A0\uD070 \uC18C\uBAA8\uC728 \uAC8C\uC774\uC9C0\uB97C \uD655\uC778"],
19943
+ en: ["Manage context document chips and visualize token window utilization"]
19944
+ },
19945
+ aliases: {
19946
+ ko: ["\uD1A0\uD070 \uC0AC\uC6A9\uB7C9 \uAC8C\uC774\uC9C0", "\uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0 \uBC14", "\uBB38\uC11C \uD0DC\uADF8 \uCE69"],
19947
+ en: ["token usage gauge", "context window bar"]
19948
+ }
19949
+ },
19950
+ "ai-streaming-text": {
19951
+ targets: ["text", "button", "card"],
19952
+ triggers: ["click", "auto"],
19953
+ useCases: {
19954
+ ko: ["\uAE5C\uBE61\uC774\uB294 \uD384\uC2A4 \uCE90\uB7FF\uACFC \uD568\uAED8 \uC2E4\uC2DC\uAC04 \uD0C0\uC774\uD551 \uC2A4\uD2B8\uB9AC\uBC0D \uBC0F \uC911\uB2E8 \uC81C\uC5B4"],
19955
+ en: ["Stream text character-by-character with pulsing caret and stop control"]
19956
+ },
19957
+ aliases: {
19958
+ ko: ["\uC2E4\uC2DC\uAC04 \uD0C0\uC774\uD551 \uD6A8\uACFC", "\uC2A4\uD2B8\uB9AC\uBC0D \uD14D\uC2A4\uD2B8", "\uC751\uB2F5 \uC911\uC9C0 \uBC84\uD2BC"],
19959
+ en: ["realtime typing stream", "streaming response"]
19960
+ }
19961
+ },
19962
+ "ai-code-runner": {
19963
+ targets: ["panel", "button", "card"],
19964
+ triggers: ["click"],
19965
+ useCases: {
19966
+ ko: ["\uCF54\uB4DC \uBE14\uB85D\uC758 \uAD6C\uBB38 \uAC15\uC870\uC640 \uD0ED \uC804\uD658\uC744 \uD1B5\uD55C \uC2E4\uC2DC\uAC04 \uCEF4\uD3EC\uB10C\uD2B8 \uBBF8\uB9AC\uBCF4\uAE30"],
19967
+ en: ["Syntax-highlighted code block with one-click copy and live component preview tab"]
19968
+ },
19969
+ aliases: {
19970
+ ko: ["\uC778\uD130\uB799\uD2F0\uBE0C \uCF54\uB4DC \uBE14\uB85D", "\uCF54\uB4DC \uBBF8\uB9AC\uBCF4\uAE30 \uD0ED", "\uCEF4\uD3EC\uB10C\uD2B8 \uB7EC\uB108"],
19971
+ en: ["interactive code block", "code preview tab"]
19972
+ }
19973
+ },
19974
+ "ai-message-branch": {
19975
+ targets: ["card", "navigation", "text"],
19976
+ triggers: ["click"],
19977
+ useCases: {
19978
+ ko: ["\uC7AC\uC0DD\uC131\uB41C \uC751\uB2F5 \uBC84\uC804\uB4E4\uC744 \uC774\uC804/\uB2E4\uC74C \uBD84\uAE30 \uB124\uBE44\uAC8C\uC774\uC158\uC73C\uB85C \uD0D0\uC0C9"],
19979
+ en: ["Navigate between regenerated response variations with branch switcher buttons"]
19980
+ },
19981
+ aliases: {
19982
+ ko: ["\uC751\uB2F5 \uBC84\uC804 \uC2A4\uC704\uCC98", "\uBE0C\uB79C\uCE58 \uB124\uBE44\uAC8C\uC774\uC158", "\uB2F5\uBCC0 \uC7AC\uC0DD\uC131 \uC774\uB825"],
19983
+ en: ["response branch switcher", "version history pagination"]
19984
+ }
19985
+ },
19986
+ "ai-thinking-accordion": {
19987
+ targets: ["card", "panel", "list"],
19988
+ triggers: ["click"],
19989
+ useCases: {
19990
+ ko: ["AI\uC758 \uCD94\uB860 \uB2E8\uACC4\uC640 \uACBD\uACFC \uC2DC\uAC04\uC744 \uC811\uC774\uC2DD \uC544\uCF54\uB514\uC5B8\uC73C\uB85C \uAC80\uD1A0"],
19991
+ en: ["Inspect AI reasoning steps and elapsed time in a collapsible accordion"]
19992
+ },
19993
+ aliases: {
19994
+ ko: ["\uC0AC\uACE0 \uACFC\uC815 \uC544\uCF54\uB514\uC5B8", "\uCD94\uB860 \uB85C\uADF8 \uD1A0\uAE00", "Thinking \uC544\uCF54\uB514\uC5B8"],
19995
+ en: ["thinking process accordion", "chain-of-thought log"]
19996
+ }
19997
+ },
19998
+ "ai-source-citation": {
19999
+ targets: ["text", "card", "button"],
20000
+ triggers: ["hover", "pointer-move"],
20001
+ useCases: {
20002
+ ko: ["\uD14D\uC2A4\uD2B8 \uB0B4 \uC778\uB77C\uC778 \uCD9C\uCC98 \uBC88\uD638 \uD638\uBC84 \uC2DC \uC6D0\uBB38 \uC694\uC57D \uD31D\uC624\uBC84 \uB178\uCD9C"],
20003
+ en: ["Hover inline citation numbers to preview source website and excerpt popover"]
20004
+ },
20005
+ aliases: {
20006
+ ko: ["\uC778\uB77C\uC778 \uCD9C\uCC98 \uD31D\uC624\uBC84", "\uCC38\uACE0\uBB38\uD5CC \uCE69", "\uCD9C\uCC98 \uBBF8\uB9AC\uBCF4\uAE30"],
20007
+ en: ["inline source citation", "reference popover card"]
20008
+ }
20009
+ },
20010
+ "ai-tool-call-card": {
20011
+ targets: ["card", "panel", "list"],
20012
+ triggers: ["click"],
20013
+ useCases: {
20014
+ ko: ["\uC5D0\uC774\uC804\uD2B8 \uB3C4\uAD6C \uD638\uCD9C\uC758 \uC778\uC790\uC640 \uC2E4\uD589 \uC0C1\uD0DC, \uACB0\uACFC \uC694\uC57D\uC744 \uD655\uC778"],
20015
+ en: ["Inspect agent tool execution status, parameters, and output results"]
20016
+ },
20017
+ aliases: {
20018
+ ko: ["\uB3C4\uAD6C \uC2E4\uD589 \uC0C1\uD0DC \uCE74\uB4DC", "Tool Call \uCE74\uB4DC", "\uD568\uC218 \uD638\uCD9C \uCE74\uB4DC"],
20019
+ en: ["agent tool call card", "function execution card"]
20020
+ }
20021
+ },
20022
+ "ai-human-in-the-loop": {
20023
+ targets: ["card", "button", "panel"],
20024
+ triggers: ["click"],
20025
+ useCases: {
20026
+ ko: ["\uC704\uD5D8 \uC791\uC5C5 \uC2E4\uD589 \uC804 \uC601\uD5A5\uB3C4 \uC694\uC57D\uACFC \uC0AC\uC6A9\uC790\uC758 \uC2B9\uC778/\uAC70\uC808 \uC561\uC158\uC744 \uC218\uC2E0"],
20027
+ en: ["Prompt human confirmation with risk severity badge before executing critical actions"]
20028
+ },
20029
+ aliases: {
20030
+ ko: ["\uC2B9\uC778 \uAC00\uB4DC\uB808\uC77C \uBAA8\uB2EC", "Human-in-the-loop \uCE74\uB4DC", "\uC704\uD5D8 \uBA85\uB839 \uC2B9\uC778"],
20031
+ en: ["human-in-the-loop approval", "action confirmation card"]
20032
+ }
20033
+ }
20034
+ };
20035
+
19718
20036
  // ../../packages/catalog/src/search-metadata.ts
19719
20037
  var TARGETS = ["button", "card", "text", "list", "background", "shape", "scene", "navigation", "panel", "input", "chart", "logo", "image"];
19720
20038
  var TRIGGERS = ["pointer-move", "hover", "click", "hold", "drag", "input", "auto", "static"];
19721
20039
  var SEARCH_METADATA = {
20040
+ ...AI_SEARCH_METADATA,
19722
20041
  ...STARTER_PACK_SEARCH_METADATA,
19723
20042
  ...SIGNATURE_SEARCH_METADATA,
19724
20043
  ...UI_COLLECTION_SEARCH,
@@ -29364,247 +29683,1466 @@ var AUTOMATION_KNOWLEDGE = [
29364
29683
  }
29365
29684
  ];
29366
29685
 
29367
- // ../../packages/catalog/src/domain-knowledge.ts
29368
- var DOMAIN_KNOWLEDGE = [
29369
- ...EDUCATION_KNOWLEDGE,
29370
- ...COMMUNITY_KNOWLEDGE,
29371
- ...COMMERCE_KNOWLEDGE,
29372
- ...BOOKING_KNOWLEDGE,
29373
- ...SUBSCRIPTION_KNOWLEDGE,
29374
- ...COLLABORATION_KNOWLEDGE,
29375
- ...SUPPORT_KNOWLEDGE,
29376
- ...ACCOUNT_KNOWLEDGE,
29377
- ...NOTIFICATION_KNOWLEDGE,
29378
- ...PUBLISHING_KNOWLEDGE,
29379
- ...MEDIA_KNOWLEDGE,
29380
- ...MARKETPLACE_KNOWLEDGE,
29381
- ...EVENT_KNOWLEDGE,
29382
- ...RECRUITING_KNOWLEDGE,
29383
- ...ANALYTICS_KNOWLEDGE,
29384
- ...SECURITY_KNOWLEDGE,
29385
- ...LOGISTICS_KNOWLEDGE,
29386
- ...FINTECH_KNOWLEDGE,
29387
- ...HEALTHCARE_KNOWLEDGE,
29388
- ...AUTOMATION_KNOWLEDGE
29389
- ];
29390
-
29391
- // ../../packages/catalog/src/domain-knowledge/search-vocabulary.ts
29392
- var KNOWLEDGE_SYNONYMS = [
29393
- ["education", "\uAD50\uC721", "\uAD50\uC721\uC11C\uBE44\uC2A4", "\uAD50\uC721 \uC11C\uBE44\uC2A4", "\uAD50\uC721 \uD50C\uB7AB\uD3FC", "\uAD50\uC721\uD50C\uB7AB\uD3FC", "lms", "learning management system", "\uD559\uC2B5 \uAD00\uB9AC \uC2DC\uC2A4\uD15C", "\uD559\uC2B5\uAD00\uB9AC\uC2DC\uC2A4\uD15C", "\uC774\uB7EC\uB2DD", "e-learning", "elearning"],
29394
- ["course", "courses", "lesson", "lessons", "\uAC15\uC758", "\uC218\uC5C5", "\uAC15\uC88C", "\uB808\uC2A8", "\uC628\uB77C\uC778 \uAC15\uC758", "\uC628\uB77C\uC778\uAC15\uC758", "online course", "online courses"],
29395
- ["learning", "\uD559\uC2B5"],
29396
- ["quiz", "quizzes", "\uD034\uC988"],
29397
- ["assignment", "assignments", "homework", "\uACFC\uC81C"],
29398
- ["submission", "submissions", "submit", "\uC81C\uCD9C"],
29399
- ["resubmission", "resubmit", "\uC7AC\uC81C\uCD9C", "\uB2E4\uC2DC \uC81C\uCD9C"],
29400
- ["latework", "late submission", "late work", "\uC9C0\uAC01 \uC81C\uCD9C", "\uC9C0\uAC01\uC81C\uCD9C", "\uAE30\uD55C \uD6C4 \uC81C\uCD9C"],
29401
- ["retry", "retries", "\uC7AC\uC2DC\uB3C4", "\uB2E4\uC2DC \uD480\uAE30"],
29402
- ["feedback", "\uD53C\uB4DC\uBC31"],
29403
- ["assessment", "\uD3C9\uAC00"],
29404
- ["progress", "\uC9C4\uB3C4", "\uC9C4\uD589\uB960"],
29405
- ["completion", "\uC644\uB8CC", "\uC218\uB8CC"],
29406
- ["deadline", "deadlines", "\uB9C8\uAC10"],
29407
- ["draft", "drafts", "\uCD08\uC548"],
29408
- ["ratio", "\uBE44\uC728", "percentage", "percent"],
29409
- ["community", "communities", "forum", "forums", "\uCEE4\uBBA4\uB2C8\uD2F0", "\uAC8C\uC2DC\uD310", "\uD3EC\uB7FC"],
29410
- ["post", "posts", "\uAC8C\uC2DC\uBB3C", "\uAC8C\uC2DC\uAE00"],
29411
- ["comment", "comments", "\uB313\uAE00"],
29412
- ["visibility", "\uACF5\uAC1C \uBC94\uC704", "\uACF5\uAC1C\uBC94\uC704"],
29413
- ["permission", "permissions", "\uAD8C\uD55C", "\uC811\uADFC \uAD8C\uD55C", "\uC811\uADFC\uAD8C\uD55C", "access control", "\uC811\uADFC \uC81C\uC5B4", "\uC811\uADFC\uC81C\uC5B4"],
29414
- ["memberonly", "members only", "members-only", "member only", "\uD68C\uC6D0 \uC804\uC6A9", "\uD68C\uC6D0\uC804\uC6A9", "\uD68C\uC6D0\uB9CC", "private group", "\uBE44\uACF5\uAC1C \uADF8\uB8F9", "\uADF8\uB8F9 \uC804\uC6A9"],
29415
- ["report", "reports", "\uC2E0\uACE0"],
29416
- ["moderation", "\uC6B4\uC601", "\uBAA8\uB354\uB808\uC774\uC158", "\uC2E0\uACE0 \uCC98\uB9AC", "\uC2E0\uACE0\uCC98\uB9AC", "\uC2E0\uACE0 \uAC80\uD1A0"],
29417
- ["hide", "hidden", "hiding", "\uC228\uAE40", "\uC228\uAE30\uAE30"],
29418
- ["restore", "restoration", "\uBCF5\uAD6C", "\uBCF5\uC6D0"],
29419
- ["lock", "locking", "locked", "\uC7A0\uAE08"],
29420
- ["changelog", "\uBCC0\uACBD \uAE30\uB85D"],
29421
- ["commerce", "ecommerce", "e-commerce", "\uCEE4\uBA38\uC2A4", "\uC774\uCEE4\uBA38\uC2A4", "\uC1FC\uD551\uBAB0", "\uC628\uB77C\uC778 \uC2A4\uD1A0\uC5B4", "\uC628\uB77C\uC778\uC2A4\uD1A0\uC5B4", "online store", "online shop"],
29422
- ["order", "orders", "\uC8FC\uBB38", "\uC8FC\uBB38\uC11C", "\uC8FC\uBB38 \uAD00\uB9AC", "\uC8FC\uBB38\uAD00\uB9AC", "order management"],
29423
- ["inventory", "stock", "\uC7AC\uACE0", "\uD488\uC808", "out of stock", "stockout", "\uC7AC\uACE0 \uCC28\uAC10", "\uC7AC\uACE0\uCC28\uAC10"],
29424
- ["cart", "shopping cart", "\uC7A5\uBC14\uAD6C\uB2C8"],
29425
- ["checkout", "\uCCB4\uD06C\uC544\uC6C3", "\uC8FC\uBB38 \uACB0\uC81C", "\uC8FC\uBB38\uACB0\uC81C"],
29426
- ["refund", "refunds", "\uD658\uBD88", "\uBD80\uBD84 \uD658\uBD88", "\uBD80\uBD84\uD658\uBD88", "partial refund", "\uBC18\uD488"],
29427
- ["fulfillment", "shipping", "shipment", "\uBC30\uC1A1", "\uCD9C\uACE0"],
29428
- ["booking", "bookings", "reservation", "reservations", "\uC608\uC57D", "\uC608\uC57D \uC11C\uBE44\uC2A4", "\uC608\uC57D\uC11C\uBE44\uC2A4", "\uC608\uC57D \uC2DC\uC2A4\uD15C", "\uC608\uC57D\uC2DC\uC2A4\uD15C", "booking system"],
29429
- ["schedule", "scheduling", "appointment", "appointments", "\uC77C\uC815", "\uC2A4\uCF00\uC904", "\uC77C\uC815 \uC608\uC57D", "\uC77C\uC815\uC608\uC57D"],
29430
- ["timeslot", "time slot", "time slots", "timeslots", "\uC2DC\uAC04\uB300", "\uD0C0\uC784\uC2AC\uB86F"],
29431
- ["capacity", "\uC815\uC6D0", "\uC794\uC5EC\uC11D"],
29432
- ["waitlist", "waiting list", "\uB300\uAE30\uC5F4", "\uC608\uC57D \uB300\uAE30", "\uC608\uC57D\uB300\uAE30"],
29433
- ["noshow", "no-show", "no show", "\uB178\uC1FC", "\uBBF8\uBC29\uBB38"],
29434
- ["reschedule", "rescheduling", "\uC608\uC57D \uBCC0\uACBD", "\uC608\uC57D\uBCC0\uACBD", "\uC77C\uC815 \uBCC0\uACBD", "\uC77C\uC815\uBCC0\uACBD"],
29435
- ["subscription", "subscriptions", "saas", "\uAD6C\uB3C5", "\uAD6C\uB3C5 \uC11C\uBE44\uC2A4", "\uAD6C\uB3C5\uC11C\uBE44\uC2A4", "\uC815\uAE30 \uACB0\uC81C", "\uC815\uAE30\uACB0\uC81C", "recurring billing"],
29436
- ["pricing", "plan", "plans", "tier", "tiers", "\uC694\uAE08\uC81C", "\uD50C\uB79C", "\uAD6C\uB3C5 \uD50C\uB79C", "\uAD6C\uB3C5\uD50C\uB79C", "saas \uC694\uAE08\uC81C"],
29437
- ["entitlement", "entitlements", "quota", "\uD50C\uB79C \uAD8C\uD55C", "\uD50C\uB79C\uAD8C\uD55C", "\uC0AC\uC6A9 \uD55C\uB3C4", "\uC0AC\uC6A9\uD55C\uB3C4"],
29438
- ["billingcycle", "billing cycle", "\uACB0\uC81C \uC8FC\uAE30", "\uACB0\uC81C\uC8FC\uAE30", "\uC5C5\uADF8\uB808\uC774\uB4DC", "\uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC", "upgrade", "downgrade", "proration", "\uC77C\uD560 \uACC4\uC0B0", "\uC77C\uD560\uACC4\uC0B0"],
29439
- ["trial", "free trial", "\uBB34\uB8CC \uCCB4\uD5D8", "\uBB34\uB8CC\uCCB4\uD5D8", "\uCCB4\uD5D8\uD310"],
29440
- ["graceperiod", "grace period", "\uC720\uC608 \uAE30\uAC04", "\uC720\uC608\uAE30\uAC04", "\uD574\uC9C0 \uC608\uC57D", "\uD574\uC9C0\uC608\uC57D", "cancel at period end"],
29441
- ["collaboration", "workspace", "work management", "project management", "\uD611\uC5C5", "\uD611\uC5C5 \uD234", "\uD611\uC5C5\uD234", "\uC5C5\uBB34 \uAD00\uB9AC", "\uC5C5\uBB34\uAD00\uB9AC", "\uD504\uB85C\uC81D\uD2B8 \uAD00\uB9AC", "\uD504\uB85C\uC81D\uD2B8\uAD00\uB9AC", "\uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4"],
29442
- ["task", "tasks", "\uD0DC\uC2A4\uD06C", "\uD560 \uC77C", "\uD560\uC77C", "\uC791\uC5C5 \uBC30\uC815", "\uC791\uC5C5\uBC30\uC815"],
29443
- ["kanban", "kanban board", "kanban task board", "\uCE78\uBC18", "\uCE78\uBC18 \uBCF4\uB4DC", "\uCE78\uBC18\uBCF4\uB4DC"],
29444
- ["sharingscope", "sharing scope", "\uACF5\uC720 \uBC94\uC704", "\uACF5\uC720\uBC94\uC704"],
29445
- ["activityhistory", "activity history", "\uD65C\uB3D9 \uAE30\uB85D", "\uD65C\uB3D9\uAE30\uB85D", "\uBCC0\uACBD \uC774\uB825", "\uBCC0\uACBD\uC774\uB825"],
29446
- ["customersupport", "customer support", "helpdesk", "help desk", "\uACE0\uAC1D\uC9C0\uC6D0", "\uACE0\uAC1D \uC9C0\uC6D0", "\uACE0\uAC1D\uC13C\uD130", "\uACE0\uAC1D \uC13C\uD130", "\uD5EC\uD504\uB370\uC2A4\uD06C"],
29447
- ["ticket", "tickets", "ticketing", "inquiry", "inquiries", "\uD2F0\uCF13", "1:1 \uBB38\uC758", "1:1\uBB38\uC758", "\uBB38\uC758 \uC811\uC218", "\uBB38\uC758\uC811\uC218", "\uC0C1\uB2F4 \uD2F0\uCF13"],
29448
- ["reopen", "reopening", "\uC7AC\uC624\uD508", "\uB2E4\uC2DC \uC5F4\uAE30"],
29449
- ["authentication", "auth", "signin", "sign-in", "sign in", "login", "log in", "\uB85C\uADF8\uC778", "\uD68C\uC6D0\uAC00\uC785", "\uD68C\uC6D0 \uAC00\uC785", "\uC774\uBA54\uC77C \uC778\uC99D", "\uC774\uBA54\uC77C\uC778\uC99D"],
29450
- ["oauth", "social login", "\uC18C\uC15C \uB85C\uADF8\uC778", "\uC18C\uC15C\uB85C\uADF8\uC778", "\uACC4\uC815 \uC5F0\uB3D9", "\uACC4\uC815\uC5F0\uB3D9"],
29451
- ["passwordreset", "password reset", "\uBE44\uBC00\uBC88\uD638 \uC7AC\uC124\uC815", "\uBE44\uBC00\uBC88\uD638\uC7AC\uC124\uC815"],
29452
- ["accountdeletion", "account deletion", "\uD68C\uC6D0 \uD0C8\uD1F4", "\uD68C\uC6D0\uD0C8\uD1F4", "\uD0C8\uD1F4 \uC720\uC608", "\uD0C8\uD1F4\uC720\uC608", "\uAC1C\uC778\uC815\uBCF4 \uD30C\uAE30"],
29453
- ["notificationcenter", "notification center", "in-app inbox", "\uC54C\uB9BC\uD568", "\uC54C\uB9BC \uC13C\uD130", "\uC54C\uB9BC\uC13C\uD130", "\uC778\uC571 \uC54C\uB9BC", "\uC778\uC571\uC54C\uB9BC"],
29454
- ["pushnotification", "push notification", "push notifications", "\uD478\uC2DC \uC54C\uB9BC", "\uD478\uC2DC\uC54C\uB9BC", "\uC774\uBA54\uC77C \uC54C\uB9BC", "\uC774\uBA54\uC77C\uC54C\uB9BC"],
29455
- ["notificationpreferences", "notification preferences", "\uC218\uC2E0 \uC124\uC815", "\uC218\uC2E0\uC124\uC815", "\uC54C\uB9BC \uC124\uC815", "\uC54C\uB9BC\uC124\uC815", "\uBC29\uD574 \uAE08\uC9C0", "\uBC29\uD574\uAE08\uC9C0", "quiet hours"],
29456
- ["markallread", "mark all read", "read state", "\uC77D\uC74C \uCC98\uB9AC", "\uC77D\uC74C\uCC98\uB9AC", "\uBAA8\uB450 \uC77D\uC74C", "\uBAA8\uB450\uC77D\uC74C", "\uBC30\uC9C0 \uCE74\uC6B4\uD2B8", "\uC911\uBCF5 \uBC1C\uC1A1 \uBC29\uC9C0"],
29457
- ["cms", "content management system", "content publishing", "\uCF58\uD150\uCE20 \uBC1C\uD589", "\uCF58\uD150\uCE20\uBC1C\uD589", "\uBE14\uB85C\uADF8 \uC5D0\uB514\uD130"],
29458
- ["scheduledpublishing", "scheduled publishing", "\uC608\uC57D \uBC1C\uD589", "\uC608\uC57D\uBC1C\uD589", "\uAC8C\uC2DC \uB0B4\uB9BC", "\uAC8C\uC2DC\uB0B4\uB9BC", "unpublish"],
29459
- ["versionrestore", "version history", "version restore", "\uBC84\uC804 \uAD00\uB9AC", "\uBC84\uC804\uAD00\uB9AC", "\uBC84\uC804 \uBCF5\uC6D0", "\uBC84\uC804\uBCF5\uC6D0"],
29460
- ["slugredirect", "slug", "url slug", "\uC2AC\uB7EC\uADF8", "\uB9AC\uB2E4\uC774\uB809\uD2B8"],
29461
- ["fileupload", "file upload", "media management", "\uD30C\uC77C \uC5C5\uB85C\uB4DC", "\uD30C\uC77C\uC5C5\uB85C\uB4DC", "\uBBF8\uB514\uC5B4 \uAD00\uB9AC", "\uBBF8\uB514\uC5B4\uAD00\uB9AC", "\uBA40\uD2F0\uD30C\uD2B8 \uC5C5\uB85C\uB4DC"],
29462
- ["transcoding", "thumbnail generation", "\uC378\uB124\uC77C \uC0DD\uC131", "\uC378\uB124\uC77C\uC0DD\uC131", "\uC778\uCF54\uB529", "\uBCC0\uD658 \uB300\uAE30", "\uBCC0\uD658\uB300\uAE30", "async media processing"],
29463
- ["signedurl", "signed url", "presigned url", "\uC11C\uBA85\uB41C url", "\uACE0\uC544 \uD30C\uC77C", "\uACE0\uC544\uD30C\uC77C", "orphan cleanup"],
29464
- ["marketplace", "two-sided marketplace", "\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4", "\uC624\uD508\uB9C8\uCF13", "\uD310\uB9E4\uC790 \uC815\uC0B0", "\uD310\uB9E4\uC790\uC815\uC0B0", "seller payout", "seller payouts"],
29465
- ["escrow", "\uC5D0\uC2A4\uD06C\uB85C", "\uAD6C\uB9E4 \uD655\uC815", "\uAD6C\uB9E4\uD655\uC815", "\uC815\uC0B0 \uBCF4\uB958", "\uC815\uC0B0\uBCF4\uB958", "payout hold"],
29466
- ["platformfee", "platform fee", "\uC911\uAC1C \uC218\uC218\uB8CC", "\uC911\uAC1C\uC218\uC218\uB8CC", "\uCC28\uAC10 \uC815\uC0B0", "\uCC28\uAC10\uC815\uC0B0", "payout deduction"],
29467
- ["eventregistration", "event registration", "conference ticketing", "\uCC38\uAC00 \uC2E0\uCCAD", "\uCC38\uAC00\uC2E0\uCCAD", "\uCEE8\uD37C\uB7F0\uC2A4 \uB4F1\uB85D", "\uD2F0\uCF13 \uBC1C\uAD8C", "\uD2F0\uCF13\uBC1C\uAD8C"],
29468
- ["earlybird", "early bird", "\uC5BC\uB9AC\uBC84\uB4DC", "\uCC38\uAC00\uAD8C \uC591\uB3C4", "\uCC38\uAC00\uAD8C\uC591\uB3C4", "ticket transfer"],
29469
- ["qrcheckin", "check-in", "checkin", "qr check-in", "\uD604\uC7A5 \uCCB4\uD06C\uC778", "\uD604\uC7A5\uCCB4\uD06C\uC778", "qr \uCCB4\uD06C\uC778", "\uC911\uBCF5 \uC785\uC7A5 \uBC29\uC9C0"],
29470
- ["recruiting", "applicant tracking", "applicant tracking system", "ats", "\uCC44\uC6A9", "\uCC44\uC6A9 \uC0AC\uC774\uD2B8", "\uCC44\uC6A9\uC0AC\uC774\uD2B8", "\uC9C0\uC6D0 \uAD00\uB9AC", "\uC9C0\uC6D0\uAD00\uB9AC", "\uCC44\uC6A9 \uACF5\uACE0", "\uCC44\uC6A9\uACF5\uACE0", "\uC785\uC0AC \uC9C0\uC6D0", "\uC785\uC0AC\uC9C0\uC6D0"],
29471
- ["pipelinestage", "pipeline stage", "job application stages", "\uC804\uD615 \uB2E8\uACC4", "\uC804\uD615\uB2E8\uACC4", "\uC11C\uB958 \uC804\uD615", "\uC11C\uB958\uC804\uD615"],
29472
- ["scorecard", "scorecards", "interview scorecards", "\uBA74\uC811 \uD3C9\uAC00\uD45C", "\uBA74\uC811\uD3C9\uAC00\uD45C", "\uD3C9\uAC00\uD45C", "\uD569\uACA9 \uD1B5\uBCF4", "\uD569\uACA9\uD1B5\uBCF4"],
29473
- ["analytics", "analytics dashboard", "\uC9C0\uD45C \uB300\uC2DC\uBCF4\uB4DC", "\uC9C0\uD45C\uB300\uC2DC\uBCF4\uB4DC", "\uB370\uC774\uD130 \uBD84\uC11D", "\uB370\uC774\uD130\uBD84\uC11D", "\uD1B5\uACC4 \uC9D1\uACC4"],
29474
- ["kpi", "kpis", "metrics and kpis", "\uC804\uC8FC \uB300\uBE44", "\uC9D1\uACC4 \uC9C0\uC5F0", "\uC9D1\uACC4\uC9C0\uC5F0", "data freshness", "\uACB0\uCE21\uCE58"],
29475
- ["csvexport", "csv export", "csv download", "data export", "\uB370\uC774\uD130 \uB0B4\uBCF4\uB0B4\uAE30", "\uB370\uC774\uD130\uB0B4\uBCF4\uB0B4\uAE30", "csv \uB2E4\uC6B4\uB85C\uB4DC"],
29476
- ["rbac", "role-based access control", "\uC5ED\uD560 \uAE30\uBC18 \uAD8C\uD55C", "\uC5ED\uD560\uAE30\uBC18\uAD8C\uD55C", "\uAD8C\uD55C \uAC10\uC0AC", "\uAD8C\uD55C\uAC10\uC0AC"],
29477
- ["auditlog", "audit log", "audit logs", "\uAC10\uC0AC \uB85C\uADF8", "\uAC10\uC0AC\uB85C\uADF8", "\uBCF4\uC548 \uAC10\uC0AC", "\uBCF4\uC548\uAC10\uC0AC"],
29478
- ["apikey", "api key", "api keys", "webhook secret", "api \uD0A4", "\uC6F9\uD6C5 \uC2DC\uD06C\uB9BF", "\uC2DC\uD06C\uB9BF \uAD50\uCCB4"],
29479
- ["logistics", "warehouse fulfillment", "\uBB3C\uB958", "\uBC30\uB2EC", "\uD480\uD544\uBA3C\uD2B8", "\uCC3D\uACE0 \uCD9C\uACE0", "\uD569\uD3EC\uC7A5", "\uBD84\uB9AC\uBC30\uC1A1"],
29480
- ["deliveryproof", "proof of delivery", "last-mile", "\uC218\uB839 \uD655\uC778", "\uBC30\uCC28", "\uC1A1\uC7A5", "\uD68C\uC218 \uC1A1\uC7A5"],
29481
- ["fintech", "\uD540\uD14C\uD06C", "\uC1A1\uAE08", "\uC608\uCE58\uAE08 \uC9C0\uAC11", "\uD3EC\uC778\uD2B8 \uC9C0\uAC11", "\uBCF5\uC2DD \uC6D0\uC7A5", "\uACC4\uC88C \uC774\uCCB4", "\uACC4\uC88C\uC774\uCCB4"],
29482
- ["idempotency", "idempotency key", "\uBA71\uB4F1\uC131", "\uC911\uBCF5 \uCD9C\uAE08 \uBC29\uC9C0", "\uC790\uB3D9\uC774\uCCB4", "direct debit"],
29483
- ["healthcare", "clinic", "\uD5EC\uC2A4\uCF00\uC5B4", "\uC9C4\uB8CC", "\uAC74\uAC15\uAE30\uB85D", "\uC0AC\uC804 \uBB38\uC9C4\uD45C", "\uBB38\uC9C4\uD45C", "\uCC98\uBC29\uC804", "\uBCF5\uC57D \uC54C\uB9BC"],
29484
- ["formautomation", "workflow automation", "\uC124\uBB38", "\uD3FC \uBE4C\uB354", "\uC870\uAC74\uBD80 \uBD84\uAE30", "\uC6CC\uD06C\uD50C\uB85C \uC790\uB3D9\uD654", "\uBC30\uCE58 \uAC00\uC838\uC624\uAE30"]
29485
- ];
29486
- var KNOWLEDGE_STOP_WORDS = [
29487
- "\uC11C\uBE44\uC2A4",
29488
- "\uC0AC\uC774\uD2B8",
29489
- "\uD50C\uB7AB\uD3FC",
29490
- "\uB9CC\uB4E4\uACE0",
29491
- "\uB9CC\uB4E4\uB824\uACE0",
29492
- "\uB9CC\uB4E4\uB824\uB294",
29493
- "\uC2F6\uC5B4",
29494
- "\uC2F6\uC5B4\uC694",
29495
- "\uC2F6\uB2E4",
29496
- "\uC2F6\uC740\uB370",
29497
- "\uC54C\uB824\uC918",
29498
- "\uC54C\uACE0",
29499
- "\uB300\uD55C",
29500
- "\uAD00\uB828",
29501
- "\uD544\uC694\uD55C",
29502
- "\uC9C0\uC2DD",
29503
- "\uC5B4\uB5BB\uAC8C",
29504
- "\uD560",
29505
- "\uC218",
29506
- "\uC788\uB294",
29507
- "\uBCFC",
29508
- "service",
29509
- "website",
29510
- "platform",
29511
- "build",
29512
- "building",
29513
- "would",
29514
- "like",
29515
- "need",
29516
- "about",
29517
- "how"
29518
- ];
29519
-
29520
- // ../../packages/catalog/src/search-ranking.ts
29521
- var normalizeSearchText = (text2) => text2.normalize("NFKC").trim().toLowerCase();
29522
- function createSearchTokenizer(synonyms, extraStopWords = []) {
29523
- const stopWords = /* @__PURE__ */ new Set([
29524
- ..."a an the to of in on at with for and or i my want please make create implement design effect this that me it is as can you add show using \uB514\uC790\uC778 \uD6A8\uACFC \uAD6C\uD604 \uAD6C\uD604\uD574 \uAD6C\uD604\uD574\uC918 \uB9CC\uB4E4\uC5B4 \uB9CC\uB4E4\uC5B4\uC918 \uD574\uC918 \uC8FC\uC138\uC694 \uC918 \uC774 \uAC00 \uC740 \uB294 \uC744 \uB97C \uC5D0 \uC5D0\uC11C \uC73C\uB85C \uCC98\uB7FC \uB54C \uD558\uBA74 \uB418\uAC8C \uD558\uAC8C \uC0B4\uC9DD".split(" "),
29525
- ...extraStopWords
29526
- ]);
29527
- const escapeRegex = (text2) => text2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
29528
- const aliases = synonyms.flatMap((group) => group.map((alias) => ({ alias: normalizeSearchText(alias), canonical: group[0] }))).sort((a, b) => b.alias.length - a.alias.length);
29529
- const aliasMap = new Map(aliases.map(({ alias, canonical }) => [alias, canonical]));
29530
- const aliasPattern = new RegExp(aliases.map(({ alias }) => /[a-z]/.test(alias) ? `(?<![a-z0-9])${escapeRegex(alias)}(?![a-z0-9])` : escapeRegex(alias)).join("|"), "gu");
29531
- return (text2) => {
29532
- const canonical = normalizeSearchText(text2).replace(aliasPattern, (match) => ` ${aliasMap.get(match)} `);
29533
- return [...new Set(canonical.split(/[^\p{L}\p{N}.%-]+/u).filter((token) => token && !stopWords.has(token)))];
29534
- };
29535
- }
29536
- function createSearchEntries(fields, tokenize) {
29537
- return fields.flatMap(([field, values]) => values.map((value) => ({
29538
- field,
29539
- value,
29540
- normalizedValue: normalizeSearchText(value),
29541
- tokens: new Set(tokenize(value))
29542
- })));
29543
- }
29544
- function rankSearchEntries(entries3, queryTokens, weights3, exact, exactBonus = 100) {
29545
- if (!queryTokens.length && !exact) return null;
29546
- const matchedOn = [];
29547
- const best = /* @__PURE__ */ new Map();
29548
- for (const entry of entries3) {
29549
- const matched = queryTokens.filter((token) => entry.tokens.has(token));
29550
- if (!matched.length) continue;
29551
- for (const token of matched) best.set(token, Math.max(best.get(token) ?? 0, weights3[entry.field]));
29552
- if (!matchedOn.some((match) => match.field === entry.field)) matchedOn.push({ field: entry.field, value: entry.value });
29553
- }
29554
- if (!exact && best.size < Math.max(1, Math.ceil(queryTokens.length * 0.6))) return null;
29555
- let score = [...best.values()].reduce((sum, weight) => sum + weight, 0);
29556
- score += queryTokens.length ? Math.round(20 * best.size / queryTokens.length) : 0;
29557
- if (exact) {
29558
- score += exactBonus;
29686
+ // ../../packages/catalog/src/domain-knowledge/ai.ts
29687
+ var AI_KNOWLEDGE = [
29688
+ {
29689
+ id: "ai-prompt-context-and-token-budget",
29690
+ aliases: {
29691
+ ko: ["\uD504\uB86C\uD504\uD2B8 \uC5D4\uC9C0\uB2C8\uC5B4\uB9C1", "\uD1A0\uD070 \uC608\uC0B0", "\uD1A0\uD070\uC608\uC0B0", "\uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0", "\uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8", "\uD1A0\uD070 \uCD08\uACFC \uBC29\uC9C0"],
29692
+ en: ["prompt engineering", "token budget", "context window management", "system prompt design", "token overflow prevention"]
29693
+ },
29694
+ useCases: {
29695
+ ko: [
29696
+ "LLM \uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0 \uD55C\uB3C4 \uC548\uC5D0\uC11C \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8, \uB300\uD654 \uD788\uC2A4\uD1A0\uB9AC, RAG \uBB38\uC11C\uC758 \uC6B0\uC120\uC21C\uC704\uB97C \uBC30\uBD84\uD560 \uB54C",
29697
+ "\uD1A0\uD070 \uCD08\uACFC\uB85C \uC778\uD55C API \uD638\uCD9C \uC5D0\uB7EC\uB098 \uACFC\uB3C4\uD55C \uACFC\uAE08\uC744 \uBC29\uC9C0\uD558\uAE30 \uC704\uD55C \uD1A0\uD070 \uBAA8\uB2C8\uD130\uB9C1 UI\uB97C \uAD6C\uC131\uD560 \uB54C",
29698
+ "\uC0AC\uC6A9\uC790 \uC785\uB825 \uAE38\uC774\uC5D0 \uB9DE\uCDB0 \uC2E4\uC2DC\uAC04\uC73C\uB85C \uD1A0\uD070\uC744 \uACC4\uC0B0\uD558\uACE0 \uC704\uD5D8 \uC784\uACC4\uCE58\uB97C \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACBD\uACE0\uD560 \uB54C",
29699
+ "\uC5EC\uB7EC \uBB38\uC11C\uB97C \uCCA8\uBD80\uD588\uC744 \uB54C \uC6B0\uC120\uC21C\uC704\uC5D0 \uB530\uB77C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uB3D9\uC801\uC73C\uB85C \uC555\uCD95\uD558\uAC70\uB098 \uC694\uC57D\uD560 \uB54C"
29700
+ ],
29701
+ en: [
29702
+ "Allocating context window space between system instructions, conversation history, and retrieved docs",
29703
+ "Preventing token limit errors and unexpected billing surges with token monitoring controls",
29704
+ "Calculating real-time tokens as the user types and providing warning thresholds",
29705
+ "Dynamically truncating or summarizing attachments when total context exceeds budget"
29706
+ ]
29707
+ },
29708
+ keywords: {
29709
+ ko: ["\uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0", "\uD1A0\uD070 \uD55C\uB3C4", "\uD1A0\uD070 \uC608\uC0B0", "\uD504\uB86C\uD504\uD2B8 \uCD5C\uC801\uD654", "\uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8", "\uD1A0\uD070 \uACC4\uC0B0", "\uBE44\uC6A9 \uCD5C\uC801\uD654"],
29710
+ en: ["context window", "token limit", "token budget", "prompt optimization", "system prompt", "token estimation", "cost control"]
29711
+ },
29712
+ text: {
29713
+ ko: {
29714
+ domain: "AI \uC5D0\uC774\uC804\uD2B8 & LLM \uC11C\uBE44\uC2A4",
29715
+ title: "\uD504\uB86C\uD504\uD2B8 \uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0 \uAD00\uB9AC\uC640 \uD1A0\uD070 \uC608\uC0B0 \uC81C\uC5B4",
29716
+ summary: "\uCEE8\uD14D\uC2A4\uD2B8 \uC708\uB3C4\uC6B0 \uB0B4 \uD1A0\uD070 \uC18C\uBAA8\uB7C9\uC744 \uC2E4\uC2DC\uAC04 \uCD94\uC801\uD558\uACE0, \uC785\uB825\xB7\uCC38\uC870 \uBB38\uC11C\xB7\uD788\uC2A4\uD1A0\uB9AC\uC758 \uC6B0\uC120\uC21C\uC704\uB97C \uC81C\uC5B4\uD574 \uBE44\uC6A9\uACFC \uC131\uB2A5\uC744 \uCD5C\uC801\uD654\uD569\uB2C8\uB2E4.",
29717
+ overview: "LLM \uAE30\uBC18 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C\uB294 \uBAA8\uB378\uBCC4 \uCD5C\uB300 \uD1A0\uD070 \uC218(Context Window)\uAC00 \uC815\uD574\uC838 \uC788\uC73C\uBA70, \uC785\uB825\uACFC \uCD9C\uB825 \uD1A0\uD070\uC5D0 \uB530\uB77C \uC9C1\uC811\uC801\uC778 \uBE44\uC6A9\uACFC \uC751\uB2F5 \uC9C0\uC5F0\uC774 \uBC1C\uC0DD\uD569\uB2C8\uB2E4. \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8, \uCCA8\uBD80 \uBB38\uC11C, \uC774\uC804 \uB300\uD654 \uAE30\uB85D\uC774 \uC313\uC5EC \uD55C\uB3C4\uB97C \uCD08\uACFC\uD558\uBA74 API \uD638\uCD9C\uC774 \uC2E4\uD328\uD558\uAC70\uB098 \uC55E\uC120 \uB9E5\uB77D\uC774 \uC720\uC2E4\uB429\uB2C8\uB2E4. \uB530\uB77C\uC11C \uAC01 \uC694\uC18C\uC758 \uD1A0\uD070 \uC810\uC720\uC728\uC744 \uC2E4\uC2DC\uAC04\uC73C\uB85C \uC2DC\uAC01\uD654\uD558\uACE0, \uC911\uC694\uB3C4\uC5D0 \uB530\uB77C \uC624\uB798\uB41C \uB300\uD654\uB97C \uC694\uC57D\uD558\uAC70\uB098 \uCCA8\uBD80 \uBB38\uC11C\uB97C \uC120\uD0DD\uC801\uC73C\uB85C \uC798\uB77C\uB0B4\uB294 \uD1A0\uD070 \uAD00\uB9AC \uC815\uCC45\uC744 \uC218\uB9BD\uD574\uC57C \uD569\uB2C8\uB2E4.",
29718
+ concepts: [
29719
+ { name: "\uD1A0\uD070 \uC608\uC0B0 \uBC30\uBD84(Token Budgeting)", description: "\uC804\uCCB4 \uCEE8\uD14D\uC2A4\uD2B8 \uC6A9\uB7C9 \uC911 \uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8 \uACE0\uC815\uBD84, \uAC80\uC0C9 \uBB38\uC11C \uAC00\uBCC0\uBD84, \uB300\uD654 \uD788\uC2A4\uD1A0\uB9AC \uC2AC\uB77C\uC774\uB529 \uC708\uB3C4\uC6B0\uBD84\uC758 \uCD5C\uB300 \uD560\uB2F9\uB7C9\uC744 \uC0AC\uC804\uC5D0 \uADDC\uC815\uD569\uB2C8\uB2E4." },
29720
+ { name: "\uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uCE74\uC6B4\uD305(Tokenizer Feedback)", description: "\uD074\uB77C\uC774\uC5B8\uD2B8 \uC0AC\uC774\uB4DC BPE \uD1A0\uD06C\uB098\uC774\uC800\uB97C \uC0AC\uC6A9\uD574 \uC0AC\uC6A9\uC790\uAC00 \uC785\uB825\uD558\uB294 \uB3C4\uC911 \uC2E4\uC2DC\uAC04\uC73C\uB85C \uD1A0\uD070 \uC218\uC640 \uC608\uC0C1 \uBE44\uC6A9\uC744 \uACC4\uC0B0\uD574 \uC2DC\uAC01\uC801 \uD53C\uB4DC\uBC31\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4." },
29721
+ { name: "\uCEE8\uD14D\uC2A4\uD2B8 \uC555\uCD95 \uBC0F \uC2AC\uB77C\uC774\uB529 \uC708\uB3C4\uC6B0(Sliding Window & Compression)", description: "\uB300\uD654\uAC00 \uAE38\uC5B4\uC9C0\uBA74 \uCD08\uAE30 \uBA54\uC2DC\uC9C0\uB97C \uC694\uC57D\uBCF8\uC73C\uB85C \uB300\uCCB4\uD558\uACE0 \uCD5C\uADFC \uD134\uB9CC \uC6D0\uBB38\uC73C\uB85C \uC720\uC9C0\uD574 \uD55C\uB3C4 \uCD08\uACFC\uB97C \uBC29\uC9C0\uD569\uB2C8\uB2E4." }
29722
+ ],
29723
+ workflow: [
29724
+ { name: "\uC601\uC5ED\uBCC4 \uD1A0\uD070 \uD55C\uB3C4 \uD560\uB2F9\uD558\uAE30", description: "\uBAA8\uB378 \uD55C\uB3C4(\uC608: 8k/128k)\uC5D0 \uB9DE\uCDB0 \uC2DC\uC2A4\uD15C \uC9C0\uC2DC 15%, RAG \uAC80\uC0C9 45%, \uB300\uD654 \uD788\uC2A4\uD1A0\uB9AC 30%, \uCD9C\uB825 \uC5EC\uC720 10%\uC758 \uC608\uC0B0 \uBE44\uC728\uC744 \uC124\uC815\uD569\uB2C8\uB2E4." },
29725
+ { name: "\uC2E4\uC2DC\uAC04 \uC785\uB825 \uBC0F \uCCA8\uBD80 \uD30C\uC77C \uD1A0\uD070 \uC0B0\uCD9C\uD558\uAE30", description: "\uC0AC\uC6A9\uC790\uAC00 \uD14D\uC2A4\uD2B8\uB97C \uC785\uB825\uD558\uAC70\uB098 \uBB38\uC11C\uB97C \uB4DC\uB86D\uD560 \uB54C \uD1A0\uD070 \uC218\uB97C \uACC4\uC0B0\uD574 \uD504\uB85C\uADF8\uB808\uC2A4 \uAC8C\uC774\uC9C0\uC5D0 \uBC18\uC601\uD569\uB2C8\uB2E4." },
29726
+ { name: "\uC784\uACC4\uCE58 \uB3C4\uB2EC \uC2DC \uC790\uB3D9 \uC555\uCD95 \uBC0F \uACBD\uACE0 \uCC98\uB9AC\uD558\uAE30", description: "80% \uB3C4\uB2EC \uC2DC \uACBD\uACE0 \uC0C9\uC0C1 \uC804\uD658, 95% \uB3C4\uB2EC \uC2DC \uC624\uB798\uB41C \uD134 \uC694\uC57D \uC2E4\uD589 \uB610\uB294 \uC804\uC1A1 \uC81C\uD55C\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4." }
29727
+ ],
29728
+ pitfalls: [
29729
+ { name: "\uAE00\uC790 \uC218(Length)\uC640 \uD1A0\uD070 \uC218(Token Count)\uB97C \uB3D9\uC77C\uC2DC\uD558\uAE30", description: "\uD55C\uAE00\uC774\uB098 \uCF54\uB4DC, \uD2B9\uC218\uBB38\uC790\uB294 \uBB38\uC790\uB2F9 2~3\uD1A0\uD070 \uC774\uC0C1\uC744 \uC18C\uBAA8\uD558\uBBC0\uB85C \uB2E8\uC21C \uAE00\uC790 \uC218\uAC00 \uC544\uB2CC \uC2E4\uC81C \uD1A0\uD06C\uB098\uC774\uC800 \uBC14\uC774\uD2B8 \uAE30\uC900\uC73C\uB85C \uACC4\uC0B0\uD574\uC57C \uD569\uB2C8\uB2E4." },
29730
+ { name: "\uCD9C\uB825 \uD1A0\uD070(Max Completion Tokens) \uC5EC\uC720\uBD84\uC744 \uB0A8\uACA8\uB450\uC9C0 \uC54A\uAE30", description: "\uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAF49 \uCC44\uC6CC \uBCF4\uB0B4\uBA74 \uBAA8\uB378\uC774 \uB2F5\uBCC0\uC744 \uD55C\uB450 \uBB38\uC7A5 \uB9CC\uC5D0 \uC798\uB77C\uBC84\uB9AC\uB294 Truncation \uD604\uC0C1\uC774 \uBC1C\uC0DD\uD569\uB2C8\uB2E4." }
29731
+ ],
29732
+ questions: [
29733
+ "\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB7EC \uB300\uC6A9\uB7C9 \uD30C\uC77C\uC744 \uCCA8\uBD80\uD588\uC744 \uB54C, \uC5B4\uB5A4 \uAE30\uC900\uC73C\uB85C \uC6B0\uC120\uC21C\uC704\uB97C \uB9E4\uACA8 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uD3EC\uD568\uD560 \uAC83\uC778\uAC00\uC694?",
29734
+ "\uD1A0\uD070 \uD55C\uB3C4 \uCD08\uACFC \uC2DC \uC774\uC804 \uB300\uD654\uB97C \uC644\uC804 \uC0AD\uC81C\uD560 \uAC83\uC778\uAC00\uC694, \uC544\uB2C8\uBA74 AI \uC694\uC57D\uBCF8\uC73C\uB85C \uCD95\uC57D\uD560 \uAC83\uC778\uAC00\uC694?",
29735
+ "\uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uCD94\uC815\uCE58\uC640 \uC2E4\uC81C API \uACFC\uAE08 \uD1A0\uD070 \uC218 \uAC04\uC758 \uC624\uCC28\uB97C UI\uC5D0\uC11C \uC5B4\uB5BB\uAC8C \uACE0\uC9C0\uD560 \uAC83\uC778\uAC00\uC694?"
29736
+ ],
29737
+ example: "\uC608\uC2DC: \uBB38\uC11C \uBD84\uC11D \uCC57\uBD07\uC5D0\uC11C \uC0AC\uC6A9\uC790\uAC00 4\uAC1C\uC758 PDF\uB97C \uCCA8\uBD80\uD558\uBA74 \uAC01 \uD30C\uC77C\uBCC4 \uD1A0\uD070 \uCE69\uC744 \uD45C\uC2DC\uD558\uACE0, \uCD1D 8,000\uD1A0\uD070 \uC911 6,500\uD1A0\uD070 \uC0AC\uC6A9 \uC2DC \uC8FC\uD669\uC0C9 \uAC8C\uC774\uC9C0\uC640 \uD568\uAED8 [\uBB38\uC11C \uC555\uCD95] \uBC84\uD2BC\uC744 \uB744\uC6CC \uD575\uC2EC \uBC1C\uCDCC\uBB38\uB9CC \uB0A8\uAE30\uB3C4\uB85D \uC720\uB3C4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
29738
+ relatedDesigns: [
29739
+ { id: "ai-prompt-box", reason: "\uBAA8\uB378 \uC2A4\uC704\uCC98\uC640 \uB192\uC774 \uC790\uB3D9 \uC870\uC808\uC744 \uAC16\uCD98 \uC785\uB825\uCC3D\uC73C\uB85C \uD504\uB86C\uD504\uD2B8 \uC804\uC1A1 \uC778\uD130\uB799\uC158\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4." },
29740
+ { id: "ai-context-pill", reason: "\uCCA8\uBD80\uB41C \uCEE8\uD14D\uC2A4\uD2B8 \uD0DC\uADF8 \uCE69\uACFC \uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uC0AC\uC6A9\uB7C9 \uD504\uB85C\uADF8\uB808\uC2A4 \uBC14\uB97C \uC2DC\uAC01\uD654\uD569\uB2C8\uB2E4." }
29741
+ ],
29742
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uCCA8\uBD80 \uBB38\uC11C \uD0DC\uADF8 \uCE69\uACFC \uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uC18C\uBAA8\uC728 \uAC8C\uC774\uC9C0\uB97C \uAC16\uCD98 \uD504\uB86C\uD504\uD2B8 \uC785\uB825 \uCE74\uB4DC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 12px \uBAA8\uC11C\uB9AC\uC640 1px \uD14C\uB450\uB9AC\uC758 \uCE74\uB4DC\uB97C \uAD6C\uC131\uD558\uACE0, \uC0C1\uB2E8\uC5D0\uB294 \uCCA8\uBD80 \uBB38\uC11C \uCE69 \uBAA9\uB85D(X \uC0AD\uC81C \uBC84\uD2BC \uD3EC\uD568), \uD558\uB2E8\uC5D0\uB294 \uCD1D 8000\uD1A0\uD070 \uB300\uBE44 \uC0AC\uC6A9\uB7C9\uC744 \uB098\uD0C0\uB0B4\uB294 \uD504\uB85C\uADF8\uB808\uC2A4 \uBC14\uB97C \uBC30\uCE58\uD574 \uC918."
29743
+ },
29744
+ en: {
29745
+ domain: "AI Agents & LLM Services",
29746
+ title: "Prompt Context Window Management and Token Budget Control",
29747
+ summary: "Track token usage against context window limits in real-time, optimizing allocation across instructions, retrieval, and chat history.",
29748
+ overview: "LLM applications operate within fixed context window ceilings, where input and output tokens directly dictate financial costs and latency. Without deliberate budgeting, accumulated chat histories and file attachments trigger API overflow errors or silent context truncation. Teams must implement explicit token allocations, real-time client-side counting, and automated summarization rules.",
29749
+ concepts: [
29750
+ { name: "Token Budget Allocation", description: "Predefining ceiling ratios for system directives, retrieved documents, and conversational turns within the total window." },
29751
+ { name: "Real-time Tokenizer Feedback", description: "Using client-side tokenizers to compute token load and cost projections as the user types." },
29752
+ { name: "Context Compression & Sliding Window", description: "Collapsing older messages into summaries while preserving recent turns verbatim to maintain coherency without overflow." }
29753
+ ],
29754
+ workflow: [
29755
+ { name: "Define Budget Allocation Quotas", description: "Establish proportional quotas (e.g., 15% instructions, 45% retrieval, 30% history, 10% completion headroom)." },
29756
+ { name: "Calculate Real-time Input & Attachment Tokens", description: "Compute token metrics on text change and file drop, updating visual gauges dynamically." },
29757
+ { name: "Enforce Threshold Warnings & Auto-summaries", description: "Shift gauge alerts at 80% and trigger automated conversation summarization at 95% capacity." }
29758
+ ],
29759
+ pitfalls: [
29760
+ { name: "Equating Character Count with Token Usage", description: "Multilingual text and code consume substantially more tokens per character than English prose; compute using authentic tokenizers." },
29761
+ { name: "Neglecting Output Completion Headroom", description: "Maxing out input context leaves no capacity for model completions, truncating responses mid-sentence." }
29762
+ ],
29763
+ questions: [
29764
+ "How will the system prioritize among multiple large document attachments when context limits are reached?",
29765
+ "Will overflow conditions discard older messages entirely or condense them via background LLM summarization?",
29766
+ "How should discrepancies between client-side estimates and provider billing be communicated?"
29767
+ ],
29768
+ example: "Example: In a document analysis assistant, attached files are tagged with token pills. When utilization hits 6,500 of 8,000 tokens, the gauge shifts to amber and offers a one-click summarization option.",
29769
+ relatedDesigns: [
29770
+ { id: "ai-prompt-box", reason: "Provides an auto-expanding prompt input with model switching controls." },
29771
+ { id: "ai-context-pill", reason: "Visualizes attached document tags and real-time token capacity bars." }
29772
+ ],
29773
+ promptSnippet: "Create a prompt input card with document tag pills and a real-time token gauge in the specified area. Inside a container of width 100% and min-height 180px, build a card with 12px corners and 1px border. Feature removable context tags at the top and a progress bar showing token usage out of 8000 tokens at the bottom."
29774
+ }
29775
+ },
29776
+ sources: [
29777
+ { title: "OpenAI Prompt Engineering Guide", url: "https://platform.openai.com/docs/guides/prompt-engineering" },
29778
+ { title: "Anthropic Context Window Guidance", url: "https://docs.anthropic.com/en/docs/build-with-claude/context-window" }
29779
+ ]
29780
+ },
29781
+ {
29782
+ id: "ai-streaming-response-and-reconnection",
29783
+ aliases: {
29784
+ ko: ["SSE \uC2A4\uD2B8\uB9AC\uBC0D", "\uC2A4\uD2B8\uB9AC\uBC0D \uD14D\uC2A4\uD2B8", "\uC751\uB2F5 \uC911\uB2E8", "\uC6F9\uC18C\uCF13 \uCCAD\uD06C", "\uC2A4\uD2B8\uB9AC\uBC0D \uC5D0\uB7EC \uBCF5\uAD6C"],
29785
+ en: ["SSE streaming", "text streaming", "streaming abort", "chunked transfer", "streaming reconnect"]
29786
+ },
29787
+ useCases: {
29788
+ ko: [
29789
+ "LLM\uC758 \uAE34 \uC0DD\uC131 \uC2DC\uAC04\uC744 \uBCF4\uC644\uD558\uAE30 \uC704\uD574 \uCCAB \uD1A0\uD070 \uC9C0\uC5F0 \uC2DC\uAC04(TTFT)\uC744 \uCD5C\uC18C\uD654\uD558\uACE0 \uD55C \uAE00\uC790\uC529 \uC2E4\uC2DC\uAC04 \uB80C\uB354\uB9C1\uD560 \uB54C",
29790
+ "\uC0DD\uC131 \uC911 \uC0AC\uC6A9\uC790\uAC00 [\uC0DD\uC131 \uC911\uC9C0(Stop)]\uB97C \uB20C\uB7EC \uBD88\uD544\uC694\uD55C \uD1A0\uD070 \uB0AD\uBE44\uC640 \uB300\uAE30\uB97C \uC989\uC2DC \uCC28\uB2E8\uD560 \uB54C",
29791
+ "\uB124\uD2B8\uC6CC\uD06C \uBD88\uC548\uC815\uC73C\uB85C \uCCAD\uD06C \uC804\uC1A1\uC774 \uB04A\uACBC\uC744 \uB54C \uBD80\uBD84 \uC0DD\uC131\uB41C \uD14D\uC2A4\uD2B8\uB97C \uC720\uC9C0\uD558\uACE0 \uC7AC\uC5F0\uACB0\uC744 \uC2DC\uB3C4\uD560 \uB54C",
29792
+ "\uC2A4\uD2B8\uB9AC\uBC0D \uB3C4\uC911 \uB9C8\uD06C\uB2E4\uC6B4 \uD0DC\uADF8(\uCF54\uB4DC \uBE14\uB85D, \uD45C \uB4F1)\uAC00 \uBBF8\uC644\uC131\uC778 \uC0C1\uD0DC\uC5D0\uC11C\uB3C4 \uB808\uC774\uC544\uC6C3 \uAE68\uC9D0 \uC5C6\uC774 \uB80C\uB354\uB9C1\uD560 \uB54C"
29793
+ ],
29794
+ en: [
29795
+ "Minimizing time-to-first-token (TTFT) by rendering text chunks in real-time as tokens arrive",
29796
+ "Empowering users to abort generations immediately to halt token burn and clear the UI",
29797
+ "Recovering from network drops by retaining partial text buffers and retrying connection",
29798
+ "Streaming incomplete markdown tokens without breaking code blocks or table layouts"
29799
+ ]
29800
+ },
29801
+ keywords: {
29802
+ ko: ["SSE", "Server-Sent Events", "\uC2A4\uD2B8\uB9AC\uBC0D", "TTFT", "\uC911\uB2E8 \uBC84\uD2BC", "AbortController", "\uCCAD\uD06C \uB80C\uB354\uB9C1", "\uB9C8\uD06C\uB2E4\uC6B4 \uD30C\uC11C"],
29803
+ en: ["SSE", "Server-Sent Events", "streaming", "TTFT", "stop generation", "AbortController", "chunk rendering", "markdown stream"]
29804
+ },
29805
+ text: {
29806
+ ko: {
29807
+ domain: "AI \uC5D0\uC774\uC804\uD2B8 & LLM \uC11C\uBE44\uC2A4",
29808
+ title: "SSE \uC2A4\uD2B8\uB9AC\uBC0D \uC751\uB2F5 \uB80C\uB354\uB9C1\uACFC \uC5F0\uACB0 \uBCF5\uAD6C \uBC0F \uC870\uAE30 \uC911\uB2E8",
29809
+ summary: "\uC11C\uBC84-\uC13C\uD2B8 \uC774\uBCA4\uD2B8(SSE)\uB85C \uCCAB \uD1A0\uD070 \uC9C0\uC5F0\uC744 \uB2E8\uCD95\uD558\uACE0, AbortController \uAE30\uBC18 \uC0DD\uC131 \uC911\uB2E8\uACFC \uB04A\uAE40 \uBCF5\uAD6C\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4.",
29810
+ overview: "\uC0DD\uC131\uD615 AI \uBAA8\uB378\uC740 \uC804\uCCB4 \uB2F5\uBCC0\uC744 \uC644\uC131\uD558\uAE30\uAE4C\uC9C0 \uC218 \uCD08\uC5D0\uC11C \uC218\uC2ED \uCD08\uAC00 \uC18C\uC694\uB418\uBBC0\uB85C, HTTP \uB2E8\uC77C \uC751\uB2F5 \uB300\uC2E0 Server-Sent Events(SSE)\uB098 \uC6F9\uC18C\uCF13\uC744 \uD1B5\uD55C \uCCAD\uD06C \uC2A4\uD2B8\uB9AC\uBC0D\uC774 \uD544\uC218\uC801\uC785\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uB294 \uCCAB \uAE00\uC790\uAC00 \uBE60\uB974\uAC8C \uCC0D\uD788\uB294 \uAC83\uC744 \uBCF4\uBA70 \uCCB4\uAC10 \uB300\uAE30 \uC2DC\uAC04\uC744 \uC904\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uB610\uD55C \uC6D0\uCE58 \uC54A\uB294 \uBC29\uD5A5\uC73C\uB85C \uB2F5\uBCC0\uC774 \uC0DD\uC131\uB420 \uB54C \uC989\uAC01 \uC911\uB2E8(Abort)\uD560 \uC218 \uC788\uC5B4\uC57C \uD558\uBA70, \uC77C\uC2DC\uC801 \uB124\uD2B8\uC6CC\uD06C \uB2E8\uC808 \uC2DC\uC5D0\uB3C4 \uC774\uBBF8 \uB3C4\uCC29\uD55C \uB0B4\uC6A9\uC744 \uBCF4\uC874\uD558\uACE0 \uC7AC\uC804\uC1A1\uC744 \uC694\uCCAD\uD560 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.",
29811
+ concepts: [
29812
+ { name: "\uCCAB \uD1A0\uD070 \uC2DC\uAC04(Time-to-First-Token, TTFT)", description: "\uC804\uCCB4 \uC0DD\uC131 \uC644\uB8CC\uAC00 \uC544\uB2CC \uCD5C\uCD08 \uCCAD\uD06C\uAC00 \uD074\uB77C\uC774\uC5B8\uD2B8\uC5D0 \uB3C4\uCC29\uD574 \uD654\uBA74\uC5D0 \uB80C\uB354\uB9C1\uB418\uAE30\uAE4C\uC9C0\uC758 \uC18C\uC694 \uC2DC\uAC04\uC73C\uB85C, UX \uB9CC\uC871\uB3C4\uC758 \uD575\uC2EC \uCC99\uB3C4\uC785\uB2C8\uB2E4." },
29813
+ { name: "\uC870\uAE30 \uC911\uB2E8 \uC2E0\uD638(AbortController Signal)", description: "\uC0AC\uC6A9\uC790\uAC00 \uC911\uC9C0 \uBC84\uD2BC\uC744 \uB204\uB974\uBA74 fetch API\uC758 signal\uC744 \uC911\uB2E8\uD574 \uC11C\uBC84\uC758 \uBD88\uD544\uC694\uD55C GPU \uC5F0\uC0B0\uACFC \uD1A0\uD070 \uACFC\uAE08\uC744 \uC989\uC2DC \uCC28\uB2E8\uD569\uB2C8\uB2E4." },
29814
+ { name: "\uBD88\uC644\uC804 \uB9C8\uD06C\uB2E4\uC6B4 \uBC84\uD37C\uB9C1(Fault-Tolerant Markdown Parsing)", description: "\uCF54\uB4DC \uBE14\uB85D\uC758 \uB2EB\uB294 \uBC31\uD2F1(```)\uC774\uB098 \uBCFC\uB4DC \uD0DC\uADF8(**)\uAC00 \uC544\uC9C1 \uC2A4\uD2B8\uB9AC\uBC0D\uB418\uC9C0 \uC54A\uC558\uC744 \uB54C\uB3C4 \uD30C\uC11C\uAC00 \uD06C\uB798\uC2DC \uC5C6\uC774 \uC810\uC9C4\uC801\uC73C\uB85C \uB80C\uB354\uB9C1\uD558\uB3C4\uB85D \uCC98\uB9AC\uD569\uB2C8\uB2E4." }
29815
+ ],
29816
+ workflow: [
29817
+ { name: "SSE \uC5F0\uACB0 \uC218\uB9BD \uBC0F \uC0C1\uD0DC \uCD08\uAE30\uD654\uD558\uAE30", description: "\uC694\uCCAD \uC2DC AbortController\uB97C \uB4F1\uB85D\uD558\uACE0, UI\uC5D0 \uD384\uC2A4 \uCEE4\uC11C\uC640 [\uC751\uB2F5 \uC911\uB2E8] \uBC84\uD2BC\uC744 \uD65C\uC131\uD654\uD569\uB2C8\uB2E4." },
29818
+ { name: "\uCCAD\uD06C \uC218\uC2E0 \uBC0F \uC810\uC9C4\uC801 \uD14D\uC2A4\uD2B8 \uCD94\uAC00\uD558\uAE30", description: "\uB3C4\uCC29\uD558\uB294 \uD14D\uC2A4\uD2B8 \uCCAD\uD06C\uB97C \uB204\uC801 \uBC84\uD37C\uC5D0 \uCD94\uAC00\uD558\uACE0, \uB80C\uB354\uB7EC\uB97C \uD1B5\uD574 \uBD80\uB4DC\uB7EC\uC6B4 \uD0C0\uC774\uD551 \uBAA8\uC158\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4." },
29819
+ { name: "\uC644\uB8CC \uC2E0\uD638 \uC218\uC2E0 \uB610\uB294 \uC911\uB2E8 \uC774\uBCA4\uD2B8 \uCC98\uB9AC\uD558\uAE30", description: "[DONE] \uD1A0\uD070 \uC218\uC2E0 \uC2DC \uCEE4\uC11C\uB97C \uC228\uAE30\uACE0 [\uB2E4\uC2DC \uC0DD\uC131]\uC73C\uB85C \uC804\uD658\uD558\uBA70, \uC0AC\uC6A9\uC790 \uC911\uB2E8 \uC2DC \uC5F0\uACB0\uC744 \uB2EB\uACE0 \uBD80\uBD84 \uBC84\uD37C\uB97C \uD655\uC815\uD569\uB2C8\uB2E4." }
29820
+ ],
29821
+ pitfalls: [
29822
+ { name: "\uCCAD\uD06C\uB9C8\uB2E4 \uBB34\uAC70\uC6B4 \uC804\uCCB4 \uB9AC\uB80C\uB354\uB9C1 \uBC1C\uC0DD\uC2DC\uD0A4\uAE30", description: "\uB9E4 \uD1A0\uD070\uB9C8\uB2E4 \uBCF5\uC7A1\uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uD2B8\uB9AC\uB97C \uB2E4\uC2DC \uADF8\uB9AC\uBA74 \uBE0C\uB77C\uC6B0\uC800 \uBA54\uC778 \uC2A4\uB808\uB4DC\uAC00 \uC815\uC9C0\uD558\uBBC0\uB85C \uAC00\uBCBC\uC6B4 \uD14D\uC2A4\uD2B8 \uB178\uB4DC \uC5C5\uB370\uC774\uD2B8\uB098 requestAnimationFrame \uBC30\uCE6D\uC744 \uC801\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4." },
29823
+ { name: "\uD074\uB77C\uC774\uC5B8\uD2B8 \uC911\uB2E8 \uC2DC \uC11C\uBC84 \uC138\uC158\uC744 \uBC29\uCE58\uD558\uAE30", description: "\uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C\uB9CC \uC911\uB2E8\uD558\uACE0 \uBC31\uC5D4\uB4DC LLM \uD638\uCD9C\uC744 \uCDE8\uC18C\uD558\uC9C0 \uC54A\uC73C\uBA74 \uBC31\uC5D4\uB4DC\uC5D0\uC11C \uBC31\uADF8\uB77C\uC6B4\uB4DC \uD1A0\uD070 \uBE44\uC6A9\uC774 \uACC4\uC18D \uBC1C\uC0DD\uD569\uB2C8\uB2E4." }
29824
+ ],
29825
+ questions: [
29826
+ "\uC2A4\uD2B8\uB9AC\uBC0D \uB3C4\uC911 \uC77C\uC2DC\uC801 \uB124\uD2B8\uC6CC\uD06C \uC624\uB958\uAC00 \uB098\uBA74 \uC5B4\uB514\uC11C\uBD80\uD130 \uC7AC\uC5F0\uACB0\uC744 \uC2DC\uB3C4\uD560 \uAC83\uC778\uAC00\uC694?",
29827
+ "\uC911\uB2E8(Abort)\uB41C \uBD88\uC644\uC804\uD55C \uC751\uB2F5\uB3C4 \uB300\uD654 \uAE30\uB85D\uC5D0 \uC800\uC7A5\uD574 \uB2E4\uC74C \uD504\uB86C\uD504\uD2B8\uC758 \uCEE8\uD14D\uC2A4\uD2B8\uB85C \uB118\uAE38 \uAC83\uC778\uAC00\uC694?",
29828
+ "\uCF54\uB4DC \uBE14\uB85D \uB0B4\uBD80\uAC00 \uC2A4\uD2B8\uB9AC\uBC0D\uB418\uB294 \uB3C4\uC911 \uC0AC\uC6A9\uC790\uAC00 [\uCF54\uB4DC \uBCF5\uC0AC]\uB97C \uB204\uB974\uBA74 \uC5B4\uB5BB\uAC8C \uB3D9\uC791\uD574\uC57C \uD558\uB098\uC694?"
29829
+ ],
29830
+ example: "\uC608\uC2DC: \uCF54\uB4DC \uC0DD\uC131 AI\uC5D0\uC11C \uC0AC\uC6A9\uC790\uAC00 \uD504\uB86C\uD504\uD2B8\uB97C \uBCF4\uB0B4\uBA74 30ms \uAC04\uACA9\uC73C\uB85C \uCF54\uB4DC\uAC00 \uC2A4\uD2B8\uB9AC\uBC0D\uB418\uBA70, \uC6D0\uCE58 \uC54A\uB294 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB85C \uC791\uC131\uB418\uAE30 \uC2DC\uC791\uD560 \uB54C [\uC751\uB2F5 \uC911\uB2E8] \uBC84\uD2BC\uC744 \uB20C\uB7EC 150\uC790 \uC2DC\uC810\uC5D0 \uC989\uC2DC \uBA48\uCD94\uACE0 \uD504\uB86C\uD504\uD2B8\uB97C \uC218\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
29831
+ relatedDesigns: [
29832
+ { id: "ai-streaming-text", reason: "\uC2E4\uC2DC\uAC04 \uD0C0\uC774\uD551 \uD6A8\uACFC\uC640 \uD384\uC2A4 \uCEE4\uC11C, \uC751\uB2F5 \uC911\uC9C0 \uBC84\uD2BC\uC758 \uC2DC\uAC01\uC801 \uC778\uD130\uB799\uC158\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4." },
29833
+ { id: "ai-code-runner", reason: "\uC2A4\uD2B8\uB9AC\uBC0D\uB41C \uCF54\uB4DC\uC758 \uC2E0\uD0DD\uC2A4 \uD558\uC774\uB77C\uC774\uD305\uACFC \uBBF8\uB9AC\uBCF4\uAE30 \uD0ED \uC804\uD658\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4." }
29834
+ ],
29835
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uAE5C\uBE61\uC774\uB294 \uD384\uC2A4 \uCEE4\uC11C\uC640 [\uC751\uB2F5 \uC911\uC9C0] \uC81C\uC5B4\uAC00 \uD3EC\uD568\uB41C \uC2E4\uC2DC\uAC04 \uC2A4\uD2B8\uB9AC\uBC0D \uD14D\uC2A4\uD2B8 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108\uC5D0\uC11C 30ms \uAC04\uACA9\uC73C\uB85C \uAE00\uC790\uAC00 \uCD9C\uB825\uB418\uBA70 \uD074\uB9AD \uC2DC \uC989\uC2DC \uD0C0\uC774\uBA38\uB97C \uC815\uC9C0\uD558\uB294 \uC911\uC9C0 \uBC84\uD2BC\uC744 \uC81C\uACF5\uD574 \uC918."
29836
+ },
29837
+ en: {
29838
+ domain: "AI Agents & LLM Services",
29839
+ title: "SSE Streaming Response Rendering, Connection Recovery, and Early Abort",
29840
+ summary: "Stream tokens via SSE to slash TTFT, supporting AbortController-driven stops and resilient partial rendering.",
29841
+ overview: "Because LLM completions can span several seconds, chunked streaming over Server-Sent Events (SSE) or WebSockets is indispensable for minimizing perceived latency. Real-time token streaming creates responsive feedback while enabling users to abort suboptimal answers early. The architecture must handle incomplete markdown tokens and gracefully recover from dropped sockets.",
29842
+ concepts: [
29843
+ { name: "Time-to-First-Token (TTFT)", description: "The elapsed time until the initial text chunk renders in the browser, representing the primary benchmark of perceived system responsiveness." },
29844
+ { name: "AbortController Signal", description: "Transmitting cancellation signals to terminate the upstream LLM invocation and arrest downstream GPU billing." },
29845
+ { name: "Fault-tolerant Markdown Streaming", description: "Parsing incomplete markdown chunks (such as unclosed code fences) incrementally without crashing the DOM renderer." }
29846
+ ],
29847
+ workflow: [
29848
+ { name: "Establish SSE Stream & Abort Handles", description: "Initiate HTTP streaming with an attached AbortSignal, activating the stop button and typing cursor." },
29849
+ { name: "Accumulate Chunks & Batch Render", description: "Buffer incoming tokens and apply requestAnimationFrame updates for smooth typographic expansion." },
29850
+ { name: "Handle Completion or Abort Interrupts", description: "Finalize output on [DONE] signals, or cleanly sever the connection upon user abort while preserving partial buffers." }
29851
+ ],
29852
+ pitfalls: [
29853
+ { name: "Triggering Full Tree Re-renders Per Token", description: "Re-evaluating entire virtual DOM trees for every arriving token stalls the browser UI thread; batch DOM mutations." },
29854
+ { name: "Orphaning Upstream Server Generation on Abort", description: "Halting the client socket without signaling the backend API allows costly LLM compute to run to completion." }
29855
+ ],
29856
+ questions: [
29857
+ "How will dropped socket connections resume without duplicate token generation?",
29858
+ "Should truncated or aborted turns be committed into persistent session history?",
29859
+ "What state should one-click copy buttons present while a code block is actively streaming?"
29860
+ ],
29861
+ example: "Example: In an AI coding assistant, code blocks stream at 30ms intervals with a pulsing caret. When the developer spots an obsolete dependency, clicking Stop immediately halts generation at 150 characters.",
29862
+ relatedDesigns: [
29863
+ { id: "ai-streaming-text", reason: "Implements a pulsing cursor streaming effect with start and stop controls." },
29864
+ { id: "ai-code-runner", reason: "Renders streaming code with syntax highlighting and a live preview tab." }
29865
+ ],
29866
+ promptSnippet: "Create a streaming text component with a pulsing caret and stop button in the specified area. Inside a container of width 100% and min-height 180px, stream text at 30ms intervals and provide a button to immediately halt the stream on click."
29867
+ }
29868
+ },
29869
+ sources: [
29870
+ { title: "MDN Server-Sent Events Guide", url: "https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events" },
29871
+ { title: "W3C Fetch AbortController Standard", url: "https://fetch.spec.whatwg.org/#abortcontroller-interface" }
29872
+ ]
29873
+ },
29874
+ {
29875
+ id: "ai-tool-calling-and-human-approval",
29876
+ aliases: {
29877
+ ko: ["\uD568\uC218 \uD638\uCD9C", "Function Calling", "\uC5D0\uC774\uC804\uD2B8 \uB3C4\uAD6C", "\uD734\uBA3C\uC778\uB354\uB8E8\uD504", "\uC704\uD5D8 \uBA85\uB839 \uC2B9\uC778", "\uB3C4\uAD6C \uC2E4\uD589 \uAC00\uB4DC\uB808\uC77C"],
29878
+ en: ["tool calling", "function calling", "agent tools", "human-in-the-loop", "action approval", "guardrail validation"]
29879
+ },
29880
+ useCases: {
29881
+ ko: [
29882
+ "AI \uC5D0\uC774\uC804\uD2B8\uAC00 \uC678\uBD80 \uAC80\uC0C9, \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC870\uD68C, API \uD638\uCD9C\uC744 \uC9C1\uC811 \uC218\uD589\uD560 \uC218 \uC788\uB3C4\uB85D \uB3C4\uAD6C\uB97C \uC5F0\uACB0\uD560 \uB54C",
29883
+ "\uD30C\uC77C \uC0AD\uC81C, \uACB0\uC81C \uC2E4\uD589, \uC774\uBA54\uC77C \uBC1C\uC1A1 \uB4F1 \uBE44\uAC00\uC5ED\uC801 \uC704\uD5D8 \uC791\uC5C5 \uC804 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC2B9\uC778\uC744 \uC694\uCCAD\uD560 \uB54C",
29884
+ "\uB3C4\uAD6C \uC2E4\uD589 \uC778\uC790(JSON Arguments)\uC640 \uBC18\uD658 \uACB0\uACFC\uB97C \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC2DC\uAC01\uC801\uC73C\uB85C \uD22C\uBA85\uD558\uAC8C \uACF5\uAC1C\uD560 \uB54C",
29885
+ "\uB3C4\uAD6C \uC2E4\uD589 \uC2E4\uD328\uB098 \uD0C0\uC784\uC544\uC6C3 \uC2DC \uC5D0\uC774\uC804\uD2B8\uAC00 \uC2A4\uC2A4\uB85C \uB300\uCCB4 \uB3C4\uAD6C\uB97C \uCC3E\uAC70\uB098 \uC7AC\uC2DC\uB3C4\uD558\uB3C4\uB85D \uAD6C\uC131\uD560 \uB54C"
29886
+ ],
29887
+ en: [
29888
+ "Equipping AI agents with tools for external search, database queries, and API integrations",
29889
+ "Requiring explicit human approval before irreversible actions like file deletions or payment execution",
29890
+ "Transparently displaying structured JSON tool arguments and return payloads in the interface",
29891
+ "Enabling fallback tools or automated retries when a tool invocation times out or errors"
29892
+ ]
29893
+ },
29894
+ keywords: {
29895
+ ko: ["\uB3C4\uAD6C \uD638\uCD9C", "Function Calling", "\uC5D0\uC774\uC804\uD2B8", "Human-in-the-loop", "\uC2B9\uC778 \uBAA8\uB2EC", "\uAC00\uB4DC\uB808\uC77C", "JSON \uC778\uC790", "\uAD8C\uD55C \uAD00\uB9AC"],
29896
+ en: ["tool call", "function calling", "agent", "human in the loop", "approval card", "guardrail", "json arguments", "permissions"]
29897
+ },
29898
+ text: {
29899
+ ko: {
29900
+ domain: "AI \uC5D0\uC774\uC804\uD2B8 & LLM \uC11C\uBE44\uC2A4",
29901
+ title: "Function Calling \uB3C4\uAD6C \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uC158\uACFC \uC704\uD5D8 \uC791\uC5C5 \uC778\uAC04 \uC2B9\uC778(Human-in-the-Loop)",
29902
+ summary: "\uB3C4\uAD6C \uD638\uCD9C \uC785\uCD9C\uB825\uC744 \uC2DC\uAC01\uD654\uD558\uACE0, \uBE44\uAC00\uC5ED\uC801\uC778 \uBA85\uB839 \uC2E4\uD589 \uC804 \uC778\uAC04 \uC2B9\uC778(Human-in-the-Loop) \uAC00\uB4DC\uB808\uC77C\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4.",
29903
+ overview: "\uCD5C\uC2E0 \uC790\uC728 \uC5D0\uC774\uC804\uD2B8\uB294 \uC0AC\uC6A9\uC790\uC758 \uC758\uB3C4\uB97C \uBD84\uC11D\uD574 \uC6F9 \uAC80\uC0C9, \uACC4\uC0B0\uAE30, \uD130\uBBF8\uB110 \uC2E4\uD589, DB \uC218\uC815 \uB4F1\uC758 \uB3C4\uAD6C\uB97C \uC5F0\uACC4 \uD638\uCD9C\uD569\uB2C8\uB2E4. \uADF8\uB7EC\uB098 \uBAA8\uB378\uC774 \uC798\uBABB\uB41C \uC778\uC790\uB97C \uB123\uAC70\uB098 \uD30C\uC77C \uC2DC\uC2A4\uD15C \uC0AD\uC81C, \uACB0\uC81C \uB4F1 \uBE44\uAC00\uC5ED\uC801 \uBD80\uC791\uC6A9\uC774 \uC788\uB294 \uBA85\uB839\uC744 \uC790\uC758\uC801\uC73C\uB85C \uC2E4\uD589\uD558\uBA74 \uCE58\uBA85\uC801\uC778 \uD53C\uD574\uB97C \uCD08\uB798\uD569\uB2C8\uB2E4. \uB530\uB77C\uC11C \uB3C4\uAD6C \uD638\uCD9C\uC758 \uC9C4\uD589 \uC0C1\uD0DC\uB97C \uBA85\uD655\uD788 \uBCF4\uC5EC\uC8FC\uACE0, \uACE0\uC704\uD5D8 \uC791\uC5C5\uC740 Human-in-the-loop \uB2E8\uACC4\uB85C \uACA9\uB9AC\uD574 \uC0AC\uC6A9\uC790\uC758 \uBA85\uC2DC\uC801 [\uC2B9\uC778] \uC5C6\uC774\uB294 \uC2E4\uD589\uB418\uC9C0 \uC54A\uB3C4\uB85D \uAC15\uC81C\uD574\uC57C \uD569\uB2C8\uB2E4.",
29904
+ concepts: [
29905
+ { name: "\uB3C4\uAD6C \uC2A4\uD0A4\uB9C8 \uBC0F \uC778\uC790 \uD30C\uC2F1(Tool Schema & JSON Arguments)", description: "\uBAA8\uB378\uC774 \uD638\uCD9C\uD560 \uD568\uC218\uC758 \uC774\uB984, \uC124\uBA85, \uB9E4\uAC1C\uBCC0\uC218 \uC2A4\uD0A4\uB9C8\uB97C \uC815\uC758\uD558\uACE0 \uBC18\uD658\uB41C JSON \uC778\uC790\uC758 \uC720\uD6A8\uC131\uC744 \uB7F0\uD0C0\uC784\uC5D0\uC11C \uAC80\uC99D\uD569\uB2C8\uB2E4." },
29906
+ { name: "\uC704\uD5D8\uB3C4 \uC218\uC900 \uBD84\uB958(Risk Severity Tiering)", description: "\uB2E8\uC21C \uC870\uD68C(Low), \uB370\uC774\uD130 \uBCC0\uACBD(Medium), \uC0AD\uC81C/\uACB0\uC81C/\uC678\uBD80 \uC804\uC1A1(High)\uC73C\uB85C \uC791\uC5C5\uC744 \uBD84\uB958\uD574 High \uB4F1\uAE09\uC5D0\uB9CC \uC2B9\uC778 \uC778\uD130\uB799\uC158\uC744 \uD544\uC218\uB85C \uC694\uAD6C\uD569\uB2C8\uB2E4." },
29907
+ { name: "\uD734\uBA3C \uC778 \uB354 \uB8E8\uD504(Human-in-the-Loop, HITL)", description: "\uC5D0\uC774\uC804\uD2B8 \uC2E4\uD589 \uB8E8\uD504\uB97C \uC77C\uC2DC \uC911\uC9C0\uD558\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA85\uB839 \uD30C\uB77C\uBBF8\uD130\uC640 \uC608\uC0C1 \uC601\uD5A5\uC744 \uC81C\uC2DC\uD55C \uB4A4 [\uC2B9\uC778/\uAC70\uC808] \uC785\uB825\uC744 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4." }
29908
+ ],
29909
+ workflow: [
29910
+ { name: "\uBAA8\uB378\uC758 Tool Call \uC694\uCCAD \uC218\uC2E0 \uBC0F \uAC80\uC99D\uD558\uAE30", description: "\uBAA8\uB378\uC774 \uC0DD\uC131\uD55C function_call \uB370\uC774\uD130\uB97C \uD30C\uC2F1\uD574 \uB3C4\uAD6C \uBA85\uC138 \uBC0F \uC778\uC790 \uC720\uD6A8\uC131\uC744 \uD655\uC778\uD569\uB2C8\uB2E4." },
29911
+ { name: "\uC791\uC5C5 \uC704\uD5D8\uB3C4 \uD3C9\uAC00 \uBC0F \uC2B9\uC778 \uCE74\uB4DC \uB80C\uB354\uB9C1\uD558\uAE30", description: "\uACE0\uC704\uD5D8 \uC791\uC5C5\uC77C \uACBD\uC6B0 \uC989\uC2DC \uC2E4\uD589\uD558\uC9C0 \uC54A\uACE0 \uC2B9\uC778 \uB300\uAE30 \uC0C1\uD0DC\uB85C \uC804\uD658\uD574 \uACBD\uACE0 \uCE74\uB4DC\uC640 \uBC84\uD2BC\uC744 \uB178\uCD9C\uD569\uB2C8\uB2E4." },
29912
+ { name: "\uC0AC\uC6A9\uC790 \uC2B9\uC778 \uC2DC \uC2E4\uD589 \uBC0F \uACB0\uACFC \uBC18\uD658\uD558\uAE30", description: "\uC0AC\uC6A9\uC790\uAC00 \uC2B9\uC778\uD558\uBA74 \uC2E4\uC81C \uD568\uC218\uB97C \uD638\uCD9C\uD574 \uACB0\uACFC\uB97C \uC5D0\uC774\uC804\uD2B8 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uC8FC\uC785\uD558\uACE0, \uAC70\uC808 \uC2DC \uCDE8\uC18C \uBA54\uC2DC\uC9C0\uB97C \uC804\uB2EC\uD569\uB2C8\uB2E4." }
29913
+ ],
29914
+ pitfalls: [
29915
+ { name: "\uC2B9\uC778 \uBAA8\uB2EC \uC5C6\uC774 \uC178(Shell)\uC774\uB098 \uD30C\uC77C \uC4F0\uAE30 \uAD8C\uD55C \uD5C8\uC6A9\uD558\uAE30", description: "\uD504\uB86C\uD504\uD2B8 \uC778\uC81D\uC158 \uACF5\uACA9\uC5D0 \uB178\uCD9C\uB420 \uACBD\uC6B0 \uC2DC\uC2A4\uD15C \uD30C\uC77C\uC774 \uC0AD\uC81C\uB418\uAC70\uB098 \uC545\uC131 \uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uC2E4\uD589\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4." },
29916
+ { name: "\uB3C4\uAD6C \uC2E4\uD589 \uC2E4\uD328 \uC2DC \uBB34\uD55C \uC7AC\uC2DC\uB3C4 \uB8E8\uD504\uC5D0 \uBE60\uC9C0\uAE30", description: "\uC5D0\uB7EC \uC751\uB2F5\uC744 \uBC1B\uC740 \uBAA8\uB378\uC774 \uB3D9\uC77C\uD55C \uC2E4\uD328 \uBA85\uB839\uC744 \uBC18\uBCF5 \uD638\uCD9C\uD574 \uD06C\uB808\uB527\uC744 \uACE0\uAC08\uC2DC\uD0A4\uB294 \uBB38\uC81C\uB97C \uBC29\uC9C0\uD558\uAE30 \uC704\uD574 \uCD5C\uB300 \uC7AC\uC2DC\uB3C4 \uD69F\uC218\uB97C \uC81C\uD55C\uD574\uC57C \uD569\uB2C8\uB2E4." }
29917
+ ],
29918
+ questions: [
29919
+ "\uC5B4\uB5A4 \uC791\uC5C5(\uC608: \uD30C\uC77C \uC0AD\uC81C, \uC678\uBD80 API \uBC1C\uC1A1)\uC744 \uBC18\uB4DC\uC2DC \uC0AC\uC6A9\uC790\uC758 \uC2B9\uC778\uC744 \uAC70\uCCD0\uC57C \uD558\uB294 \uACE0\uC704\uD5D8\uAD70\uC73C\uB85C \uC9C0\uC815\uD560 \uAC83\uC778\uAC00\uC694?",
29920
+ "\uC0AC\uC6A9\uC790\uAC00 \uC2B9\uC778\uC744 \uAC70\uC808\uD588\uC744 \uB54C, \uC5D0\uC774\uC804\uD2B8\uAC00 \uB2E4\uB978 \uB300\uC548\uC744 \uC81C\uC2DC\uD558\uB3C4\uB85D \uD504\uB86C\uD504\uD2B8\uB97C \uC5B4\uB5BB\uAC8C \uC720\uB3C4\uD560 \uAC83\uC778\uAC00\uC694?",
29921
+ "\uBC31\uADF8\uB77C\uC6B4\uB4DC\uC5D0\uC11C \uC2E4\uD589\uB418\uB294 \uAE34 \uB3C4\uAD6C(\uC608: \uC6F9 \uD06C\uB864\uB9C1)\uC758 \uC9C4\uD589\uB960\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC5B4\uB5BB\uAC8C \uBCF4\uACE0\uD560 \uAC83\uC778\uAC00\uC694?"
29922
+ ],
29923
+ example: '\uC608\uC2DC: \uCF54\uB529 \uC5D0\uC774\uC804\uD2B8\uAC00 \uCE90\uC2DC \uB514\uB809\uD130\uB9AC \uC815\uB9AC \uBA85\uB839("rm -rf ./temp_cache")\uC744 \uB0B4\uB838\uC744 \uB54C, \uBE68\uAC04\uC0C9 [High] \uC704\uD5D8\uB3C4 \uBC30\uC9C0\uC640 \uC601\uD5A5\uBC1B\uB294 \uD30C\uC77C \uBAA9\uB85D\uC744 \uB2F4\uC740 \uC2B9\uC778 \uCE74\uB4DC\uB97C \uB744\uC6CC \uC0AC\uC6A9\uC790\uAC00 [\uC2B9\uC778\uD558\uC5EC \uC2E4\uD589]\uC744 \uD074\uB9AD\uD560 \uB54C\uB9CC \uC2E4\uC81C \uBA85\uB839\uC774 \uC2E4\uD589\uB418\uB3C4\uB85D \uC81C\uC5B4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.',
29924
+ relatedDesigns: [
29925
+ { id: "ai-tool-call-card", reason: "\uC5D0\uC774\uC804\uD2B8\uAC00 \uD638\uCD9C\uD55C \uB3C4\uAD6C\uBA85, \uD30C\uB77C\uBBF8\uD130 JSON, \uC2E4\uD589 \uC0C1\uD0DC \uC2A4\uD53C\uB108\uB97C \uB2E8\uACC4\uBCC4\uB85C \uC2DC\uAC01\uD654\uD569\uB2C8\uB2E4." },
29926
+ { id: "ai-human-in-the-loop", reason: "\uACE0\uC704\uD5D8 \uBA85\uB839 \uC2E4\uD589 \uC804 \uC601\uD5A5\uB3C4 \uC694\uC57D\uACFC \uC2B9\uC778/\uAC70\uC808 \uC561\uC158\uC744 \uC81C\uC5B4\uD558\uB294 \uAC00\uB4DC\uB808\uC77C UI\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4." }
29927
+ ],
29928
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uACE0\uC704\uD5D8 \uC791\uC5C5 \uC804 \uC0AC\uC6A9\uC790 \uC2B9\uC778\uC744 \uC694\uAD6C\uD558\uB294 Human-in-the-loop \uAC00\uB4DC\uB808\uC77C \uCE74\uB4DC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 \uACBD\uACE0 \uC544\uC774\uCF58, \uC704\uD5D8\uB3C4 [High] \uBC30\uC9C0, \uC2E4\uD589 \uC608\uC815 \uBA85\uB839 \uBC0F \uC601\uD5A5 \uD30C\uC77C \uBAA9\uB85D, \uADF8\uB9AC\uACE0 [\uC2B9\uC778\uD558\uC5EC \uC2E4\uD589]\uACFC [\uAC70\uC808\uD558\uAE30] \uBC84\uD2BC\uC744 \uBC30\uCE58\uD574 \uC918."
29929
+ },
29930
+ en: {
29931
+ domain: "AI Agents & LLM Services",
29932
+ title: "Function Calling Tool Orchestration and Human-in-the-Loop Approval",
29933
+ summary: "Visualize agent tool invocations while gating irreversible actions behind human-in-the-loop approval guardrails.",
29934
+ overview: "Autonomous agents leverage function calling to interact with search engines, databases, and system utilities. However, unconstrained tool access creates severe vulnerabilities when models emit erroneous arguments or execute destructive system operations. Robust architectures classify action risk levels and isolate high-severity operations behind interactive human checkpoints.",
29935
+ concepts: [
29936
+ { name: "Tool Schema & Parameter Validation", description: "Defining JSON schemas for available tools and validating model-generated arguments before execution." },
29937
+ { name: "Risk Severity Tiering", description: "Categorizing tools into read-only (Low), mutation (Medium), and destructive/financial (High) tiers." },
29938
+ { name: "Human-in-the-Loop (HITL)", description: "Suspending agent execution loops to solicit explicit approval or cancellation from the user for high-risk operations." }
29939
+ ],
29940
+ workflow: [
29941
+ { name: "Parse Tool Call Directives", description: "Inspect model output for tool invocations and validate argument integrity against schemas." },
29942
+ { name: "Evaluate Risk & Trigger Approval UI", description: "If flagged as high risk, intercept execution and render an interactive approval modal detailing projected impacts." },
29943
+ { name: "Execute on Approval or Inject Refusal", description: "On human approval, run the function and stream results; on rejection, feed a structured cancellation notice back to the agent." }
29944
+ ],
29945
+ pitfalls: [
29946
+ { name: "Permitting Unrestricted Shell Access Without Approvals", description: "Prompt injection vectors can compromise system hosts via automated script execution; enforce strict human verification." },
29947
+ { name: "Unbounded Tool Retry Spirals", description: "Failing invocations can trap agents in repetitive error loops, rapidly draining API allowances without human intervention." }
29948
+ ],
29949
+ questions: [
29950
+ "Which specific operations (e.g., file deletes, webhook calls) strictly mandate human sign-off?",
29951
+ "How should the agent recover when a user explicitly rejects a proposed tool invocation?",
29952
+ "What visual telemetry should communicate progress for long-running asynchronous tools?"
29953
+ ],
29954
+ example: 'Example: An autonomous coding agent proposing "rm -rf ./temp_cache" triggers an amber warning card with a red [High] badge. The command remains dormant until the user explicitly clicks [Approve & Execute].',
29955
+ relatedDesigns: [
29956
+ { id: "ai-tool-call-card", reason: "Displays tool names, JSON arguments, and execution spinner indicators." },
29957
+ { id: "ai-human-in-the-loop", reason: "Implements human approval guardrails with risk badges and confirmation buttons." }
29958
+ ],
29959
+ promptSnippet: "Create a Human-in-the-loop approval guardrail card in the specified area. Inside a container of width 100% and min-height 180px, render a warning card displaying a [High] risk badge, command details, and dual [Approve & Execute] and [Reject] buttons."
29960
+ }
29961
+ },
29962
+ sources: [
29963
+ { title: "OpenAI Function Calling Guide", url: "https://platform.openai.com/docs/guides/function-calling" },
29964
+ { title: "Anthropic Tool Use Documentation", url: "https://docs.anthropic.com/en/docs/build-with-claude/tool-use" }
29965
+ ]
29966
+ },
29967
+ {
29968
+ id: "ai-rag-retrieval-and-source-attribution",
29969
+ aliases: {
29970
+ ko: ["RAG", "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131", "\uCD9C\uCC98 \uC778\uC6A9", "\uD560\uB8E8\uC2DC\uB124\uC774\uC158 \uBC29\uC9C0", "\uADFC\uAC70 \uC81C\uC2DC", "\uBB38\uC11C \uC784\uBCA0\uB529"],
29971
+ en: ["RAG", "retrieval-augmented generation", "source attribution", "citation chips", "hallucination reduction", "document embeddings"]
29972
+ },
29973
+ useCases: {
29974
+ ko: [
29975
+ "\uAE30\uC5C5 \uC0AC\uB0B4 \uBB38\uC11C\uB098 \uCD5C\uC2E0 \uC9C0\uC2DD\uC744 \uAC80\uC0C9\uD574 AI \uB2F5\uBCC0\uC758 \uADFC\uAC70\uB85C \uD65C\uC6A9\uD558\uACE0 \uC2E0\uB8B0\uB3C4\uB97C \uB192\uC774\uACE0\uC790 \uD560 \uB54C",
29976
+ "\uC0DD\uC131\uB41C \uB2F5\uBCC0 \uBB38\uC7A5\uB9C8\uB2E4 \uC778\uB77C\uC778 \uCD9C\uCC98 \uBC88\uD638([1], [2])\uB97C \uB2EC\uC544 \uD638\uBC84 \uC2DC \uC6D0\uBB38 \uC2A4\uB2C8\uD3AB\uC744 \uAC80\uC99D\uD558\uAC8C \uD560 \uB54C",
29977
+ "AI\uAC00 \uC9C0\uC5B4\uB0B8 \uAC70\uC9D3 \uC815\uBCF4(\uD560\uB8E8\uC2DC\uB124\uC774\uC158)\uB97C \uC904\uC774\uAE30 \uC704\uD574 \uB2F5\uBCC0 \uC791\uC131 \uC804 \uCD94\uB860(Thinking) \uB2E8\uACC4\uB97C \uB178\uCD9C\uD560 \uB54C",
29978
+ "\uAC80\uC0C9\uB41C \uBB38\uC11C \uCCAD\uD06C(Chunk) \uC911 \uC2E4\uC81C \uB2F5\uBCC0\uC5D0 \uAE30\uC5EC\uD55C \uD575\uC2EC \uBB38\uB2E8\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD22C\uBA85\uD558\uAC8C \uBCF4\uC5EC\uC904 \uB54C"
29979
+ ],
29980
+ en: [
29981
+ "Grounding AI completions in proprietary documents or fresh knowledge bases to build trust",
29982
+ "Attaching inline citation badges ([1], [2]) that reveal source snippets and URLs on hover",
29983
+ "Mitigating model hallucinations by exposing step-by-step thinking processes to users",
29984
+ "Displaying the exact document chunks that informed the generated answer"
29985
+ ]
29986
+ },
29987
+ keywords: {
29988
+ ko: ["RAG", "\uAC80\uC0C9 \uC99D\uAC15", "\uCD9C\uCC98 \uC778\uC6A9", "\uD560\uB8E8\uC2DC\uB124\uC774\uC158", "\uCD94\uB860 \uACFC\uC815", "CoT", "\uC2E0\uB8B0\uB3C4", "\uC784\uBCA0\uB529"],
29989
+ en: ["RAG", "retrieval augmented generation", "citations", "hallucination", "thinking process", "chain of thought", "attribution"]
29990
+ },
29991
+ text: {
29992
+ ko: {
29993
+ domain: "AI \uC5D0\uC774\uC804\uD2B8 & LLM \uC11C\uBE44\uC2A4",
29994
+ title: "RAG \uAC80\uC0C9 \uC99D\uAC15\uACFC \uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9 \uBC0F \uD560\uB8E8\uC2DC\uB124\uC774\uC158 \uAC00\uB4DC\uB808\uC77C",
29995
+ summary: "\uAC80\uC0C9 \uC99D\uAC15(RAG) \uC9C0\uC2DD\uC744 \uBC14\uD0D5\uC73C\uB85C \uBB38\uC7A5\uBCC4 \uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9\uACFC \uC0AC\uACE0 \uACFC\uC815(Thinking)\uC744 \uC81C\uACF5\uD574 \uD560\uB8E8\uC2DC\uB124\uC774\uC158\uC744 \uC5B5\uC81C\uD569\uB2C8\uB2E4.",
29996
+ overview: "LLM\uC758 \uAC00\uC7A5 \uD070 \uD55C\uACC4\uB294 \uD559\uC2B5 \uC2DC\uC810 \uC774\uD6C4\uC758 \uCD5C\uC2E0 \uC815\uBCF4\uB97C \uC54C\uC9C0 \uBABB\uD558\uACE0 \uADF8\uB7F4\uB4EF\uD55C \uAC70\uC9D3\uB9D0\uC744 \uC9C0\uC5B4\uB0B4\uB294 \uD560\uB8E8\uC2DC\uB124\uC774\uC158(Hallucination)\uC785\uB2C8\uB2E4. \uC774\uB97C \uADF9\uBCF5\uD558\uAE30 \uC704\uD574 \uC0AC\uC6A9\uC790 \uC9C8\uBB38\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C \uBCA1\uD130 DB\uC5D0\uC11C \uAC80\uC0C9\uD574 \uCEE8\uD14D\uC2A4\uD2B8\uB85C \uC81C\uACF5\uD558\uB294 RAG \uAE30\uBC95\uC774 \uB110\uB9AC \uC0AC\uC6A9\uB429\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uB192\uC740 \uC2E0\uB8B0\uB97C \uC8FC\uB824\uBA74 \uB2F5\uBCC0 \uBB38\uC7A5\uB9C8\uB2E4 \uCD9C\uCC98 \uBC88\uD638 \uCE69\uC744 \uB2EC\uC544 \uB9C8\uC6B0\uC2A4 \uD638\uBC84 \uC2DC \uC6D0\uBB38 \uC81C\uBAA9\uACFC \uBC1C\uCDCC\uBB38\uC744 \uD655\uC778\uD558\uAC8C \uD558\uACE0, \uBCF5\uC7A1\uD55C \uB2F5\uBCC0\uC740 AI\uC758 \uC0AC\uACE0 \uACFC\uC815(Thinking)\uC744 \uD3BC\uCCD0\uBCFC \uC218 \uC788\uAC8C \uD574\uC57C \uD569\uB2C8\uB2E4.",
29997
+ concepts: [
29998
+ { name: "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131(RAG, Retrieval-Augmented Generation)", description: "\uC678\uBD80 \uC9C0\uC2DD \uBCA0\uC774\uC2A4\uC5D0\uC11C \uAD00\uB828 \uD14D\uC2A4\uD2B8 \uCCAD\uD06C\uB97C \uAC80\uC0C9\uD574 LLM\uC758 \uD504\uB86C\uD504\uD2B8 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uC8FC\uC785\uD568\uC73C\uB85C\uC368 \uC815\uD655\uD55C \uADFC\uAC70 \uAE30\uBC18 \uB2F5\uBCC0\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4." },
29999
+ { name: "\uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9(Inline Attribution)", description: "\uC0DD\uC131\uB41C \uD14D\uC2A4\uD2B8 \uBCF8\uBB38 \uB0B4\uC5D0 [1], [2] \uAC19\uC740 \uAC01\uC8FC \uD615\uD0DC\uC758 \uCE69\uC744 \uBC30\uCE58\uD558\uACE0, \uC0C1\uD638\uC791\uC6A9 \uC2DC \uC6D0\uBB38 \uB9C1\uD06C\uC640 \uBC1C\uCDCC\uBB38\uC744 \uD31D\uC624\uBC84\uB85C \uC81C\uACF5\uD569\uB2C8\uB2E4." },
30000
+ { name: "\uC0AC\uACE0 \uACFC\uC815 \uD22C\uBA85\uC131(Chain-of-Thought Transparency)", description: "\uBAA8\uB378\uC774 \uCD5C\uC885 \uB2F5\uBCC0\uC744 \uB0B4\uB193\uAE30 \uC804 \uAC70\uCE5C \uBD84\uC11D\xB7\uAC80\uC0C9\xB7\uAC80\uC99D \uB2E8\uACC4\uB97C \uC544\uCF54\uB514\uC5B8 \uD615\uD0DC\uB85C \uB178\uCD9C\uD574 \uB2F5\uBCC0\uC758 \uB17C\uB9AC\uC801 \uD0C0\uB2F9\uC131\uC744 \uC0AC\uC6A9\uC790\uAC00 \uC9C1\uC811 \uAC80\uD1A0\uD558\uAC8C \uD569\uB2C8\uB2E4." }
30001
+ ],
30002
+ workflow: [
30003
+ { name: "\uC9C8\uBB38 \uC784\uBCA0\uB529 \uBC0F \uAD00\uB828 \uCCAD\uD06C \uAC80\uC0C9\uD558\uAE30", description: "\uC0AC\uC6A9\uC790 \uC9C8\uBB38\uACFC \uC720\uC0AC\uD55C \uBB38\uC11C \uCCAD\uD06C \uC0C1\uC704 3~5\uAC1C\uB97C \uBCA1\uD130 DB\uC5D0\uC11C \uC870\uD68C\uD574 \uBA54\uD0C0\uB370\uC774\uD130(URL, \uC81C\uBAA9)\uC640 \uD568\uAED8 \uC900\uBE44\uD569\uB2C8\uB2E4." },
30004
+ { name: "\uADFC\uAC70 \uAE30\uBC18 \uB2F5\uBCC0 \uBC0F \uC778\uC6A9 \uD0DC\uADF8 \uC0DD\uC131\uD558\uAE30", description: "\uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8\uC5D0 \uC81C\uACF5\uB41C \uBB38\uC11C\uB9CC\uC744 \uAE30\uBC18\uC73C\uB85C \uB2F5\uBCC0\uD558\uACE0 \uC778\uC6A9 \uBC88\uD638\uB97C \uBD99\uC774\uB3C4\uB85D \uC9C0\uC2DC\uD569\uB2C8\uB2E4." },
30005
+ { name: "\uC778\uB77C\uC778 \uCE69 \uBC0F \uD638\uBC84 \uD31D\uC624\uBC84 \uCE74\uB4DC \uBC14\uC778\uB529\uD558\uAE30", description: "\uB80C\uB354\uB9C1 \uC2DC [1] \uD0DC\uADF8\uB97C \uAC10\uC9C0\uD574 \uCD9C\uCC98 \uD31D\uC624\uBC84 \uCEF4\uD3EC\uB10C\uD2B8\uB85C \uCE58\uD658\uD558\uACE0 \uC6D0\uBB38 \uD30C\uBE44\uCF58 \uBC0F \uBC1C\uCDCC\uBB38\uC744 \uC5F0\uACB0\uD569\uB2C8\uB2E4." }
30006
+ ],
30007
+ pitfalls: [
30008
+ { name: "\uAC80\uC0C9\uB41C \uCCAD\uD06C\uAC00 \uC9C8\uBB38\uACFC \uBB34\uAD00\uD55C\uB370\uB3C4 \uC5B5\uC9C0\uB85C \uB2F5\uBCC0\uC5D0 \uB07C\uC6CC \uB9DE\uCD94\uAE30", description: '\uC720\uC0AC\uB3C4 \uC810\uC218\uAC00 \uB0AE\uC740 \uAC80\uC0C9 \uACB0\uACFC\uB294 \uACFC\uAC10\uD788 \uBC84\uB9AC\uACE0 "\uC81C\uACF5\uB41C \uBB38\uC11C\uC5D0\uC11C \uAD00\uB828 \uC815\uBCF4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4"\uB77C\uACE0 \uC194\uC9C1\uD788 \uB2F5\uBCC0\uD558\uB3C4\uB85D \uAC00\uB4DC\uB808\uC77C\uC744 \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.' },
30009
+ { name: "\uD074\uB9AD\uD574\uB3C4 \uC774\uB3D9\uD560 \uC218 \uC5C6\uB294 \uAC00\uC9DC \uCD9C\uCC98 URL \uB9C1\uD06C \uB0A8\uAE30\uAE30", description: "\uCD9C\uCC98 \uCE69\uC5D0 \uC2E4\uC81C \uC720\uD6A8\uD55C URL\uC774\uB098 \uBB38\uC11C \uBBF8\uB9AC\uBCF4\uAE30\uAC00 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC73C\uBA74 \uC11C\uBE44\uC2A4 \uC2E0\uB8B0\uB3C4\uAC00 \uAE09\uACA9\uD788 \uD558\uB77D\uD569\uB2C8\uB2E4." }
30010
+ ],
30011
+ questions: [
30012
+ "\uC0AC\uC6A9\uC790\uAC00 \uC778\uC6A9 \uCE69\uC744 \uD074\uB9AD\uD588\uC744 \uB54C \uC678\uBD80 \uC6F9\uD398\uC774\uC9C0\uB85C \uC774\uB3D9\uD558\uB098\uC694, \uC544\uB2C8\uBA74 \uC11C\uBE44\uC2A4 \uB0B4 \uBB38\uC11C \uBDF0\uC5B4\uB85C \uC5F0\uACB0\uD558\uB098\uC694?",
30013
+ "\uAC80\uC0C9\uB41C \uBB38\uC11C \uB0B4\uC6A9\uACFC LLM \uC790\uCCB4 \uC9C0\uC2DD\uC774 \uC0C1\uCDA9\uD560 \uB54C \uC5B4\uB5A4 \uC815\uBCF4\uB97C \uC6B0\uC120\uD558\uC5EC \uB2F5\uBCC0\uD560 \uAC83\uC778\uAC00\uC694?",
30014
+ "AI \uC0AC\uACE0 \uACFC\uC815(Thinking Process)\uC744 \uAE30\uBCF8\uC801\uC73C\uB85C \uD3BC\uCCD0\uB458 \uAC83\uC778\uAC00\uC694, \uC811\uC5B4\uB450\uACE0 \uC0AC\uC6A9\uC790\uAC00 \uC6D0\uD560 \uB54C\uB9CC \uBCF4\uAC8C \uD560 \uAC83\uC778\uAC00\uC694?"
30015
+ ],
30016
+ example: '\uC608\uC2DC: \uAE30\uC220 \uBB38\uC11C Q&A\uC5D0\uC11C React 19 \uBCC0\uACBD\uC810\uC744 \uC9C8\uBB38\uD558\uBA74, \uBCF8\uBB38 \uB05D\uC5D0 [1], [2] \uCE69\uC744 \uD45C\uC2DC\uD558\uACE0 [1]\uC5D0 \uB9C8\uC6B0\uC2A4\uB97C \uC62C\uB838\uC744 \uB54C "React 19 \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uAC00\uC774\uB4DC" \uC81C\uBAA9\uACFC react.dev URL \uBC0F \uD575\uC2EC \uBC1C\uCDCC\uBB38\uC744 \uB2F4\uC740 \uCE74\uB4DC\uAC00 \uBD80\uB4DC\uB7FD\uAC8C \uB098\uD0C0\uB0A9\uB2C8\uB2E4.',
30017
+ relatedDesigns: [
30018
+ { id: "ai-source-citation", reason: "\uD14D\uC2A4\uD2B8 \uC18D \uC778\uB77C\uC778 \uCD9C\uCC98 \uBC88\uD638\uC640 \uB9C8\uC6B0\uC2A4 \uD638\uBC84 \uC2DC \uB098\uD0C0\uB098\uB294 \uC6D0\uBB38 \uC694\uC57D \uD31D\uC624\uBC84\uB97C \uAD6C\uD604\uD569\uB2C8\uB2E4." },
30019
+ { id: "ai-thinking-accordion", reason: "AI\uC758 \uCD94\uB860 \uACFC\uC815\uACFC \uACBD\uACFC \uC2DC\uAC04, \uB2E8\uACC4\uBCC4 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uB97C \uB2F4\uC740 \uC811\uC774\uC2DD \uC544\uCF54\uB514\uC5B8\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4." }
30020
+ ],
30021
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9 \uCE69\uACFC \uD638\uBC84 \uBBF8\uB9AC\uBCF4\uAE30 \uCE74\uB4DC\uB97C \uAC16\uCD98 AI \uB2F5\uBCC0 UI\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 \uB2F5\uBCC0 \uD14D\uC2A4\uD2B8\uC640 [1] \uC778\uC6A9 \uCE69\uC744 \uBC30\uCE58\uD558\uACE0, \uD638\uBC84 \uC2DC 240px \uB108\uBE44\uC758 \uCD9C\uCC98 \uCE74\uB4DC(\uC81C\uBAA9, URL, 2\uC904 \uBC1C\uCDCC\uBB38)\uAC00 150ms \uD398\uC774\uB4DC\uC778\uC73C\uB85C \uB098\uD0C0\uB098\uAC8C \uD574 \uC918."
30022
+ },
30023
+ en: {
30024
+ domain: "AI Agents & LLM Services",
30025
+ title: "RAG Retrieval Augmentation, Inline Source Attribution, and Hallucination Guardrails",
30026
+ summary: "Ground AI answers in retrieved documents with inline citation badges and collapsible thinking timelines to suppress hallucinations.",
30027
+ overview: "A primary hurdle in generative AI adoption is hallucination\u2014the confident assertion of fabricated claims. Retrieval-Augmented Generation (RAG) resolves this by fetching relevant document chunks from vector databases to anchor responses in verified truth. To cultivate user trust, answers should furnish inline reference badges that reveal underlying sources on hover alongside transparent reasoning logs.",
30028
+ concepts: [
30029
+ { name: "Retrieval-Augmented Generation (RAG)", description: "Injecting queried knowledge base chunks into the prompt context to ensure strictly factual, evidence-backed answers." },
30030
+ { name: "Inline Attribution Badges", description: "Embedding interactive reference markers ([1], [2]) directly within prose to anchor assertions to verifiable documents." },
30031
+ { name: "Chain-of-Thought Transparency", description: "Exposing intermediate reasoning and search steps inside an accordion so users can evaluate logical integrity." }
30032
+ ],
30033
+ workflow: [
30034
+ { name: "Query Vector Stores for Context Chunks", description: "Retrieve top matching document snippets with associated metadata (title, URL, timestamps)." },
30035
+ { name: "Synthesize Answers with Citation Footnotes", description: "Instruct the model to reference source indices corresponding to cited propositions." },
30036
+ { name: "Bind Interactive Citation Popovers", description: "Map citation tokens to rich hover cards displaying site favicons, page titles, and snippet excerpts." }
30037
+ ],
30038
+ pitfalls: [
30039
+ { name: "Forcing Responses When Retrieval Confidence Is Poor", description: "Failing to implement similarity score floors prompts models to hallucinate answers instead of reporting missing data." },
30040
+ { name: "Dangling Citations Without Navigable Sources", description: "Displaying dead reference numbers with unverified links severely damages platform credibility." }
30041
+ ],
30042
+ questions: [
30043
+ "Should citation clicks navigate externally or open an internal split-pane viewer?",
30044
+ "How will conflicting facts between enterprise documents and model priors be arbitrated?",
30045
+ "Should the thinking process accordion mount open by default or remain collapsed?"
30046
+ ],
30047
+ example: 'Example: In a technical documentation assistant, answers append [1] markers. Hovering marker [1] reveals a 240px card with title "React 19 Migration Guide", domain "react.dev", and excerpt text.',
30048
+ relatedDesigns: [
30049
+ { id: "ai-source-citation", reason: "Provides inline citation chips with hoverable source preview cards." },
30050
+ { id: "ai-thinking-accordion", reason: "Renders collapsible reasoning logs with elapsed time badges." }
30051
+ ],
30052
+ promptSnippet: "Create an AI answer layout with inline citation chips and hover preview cards in the specified area. Inside a container of width 100% and min-height 180px, render text with a [1] badge that triggers a 240px source preview popover on hover."
30053
+ }
30054
+ },
30055
+ sources: [
30056
+ { title: "Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", url: "https://arxiv.org/abs/2005.11401" },
30057
+ { title: "Pinecone RAG Architecture Guide", url: "https://www.pinecone.io/learn/retrieval-augmented-generation/" }
30058
+ ]
30059
+ },
30060
+ {
30061
+ id: "ai-agent-state-memory-and-branching",
30062
+ aliases: {
30063
+ ko: ["\uB300\uD654 \uC138\uC158 \uC0C1\uD0DC", "\uC751\uB2F5 \uBC84\uC804 \uBD84\uAE30", "\uB300\uD654 \uBE0C\uB79C\uCE58", "\uC5D0\uC774\uC804\uD2B8 \uBA54\uBAA8\uB9AC", "\uC2AC\uB798\uC2DC \uBA85\uB839\uC5B4", "\uB300\uD654 \uB864\uBC31"],
30064
+ en: ["conversation state", "response branching", "message history branches", "agent memory", "slash commands", "session rollback"]
30065
+ },
30066
+ useCases: {
30067
+ ko: [
30068
+ "\uB3D9\uC77C\uD55C \uC9C8\uBB38\uC5D0 \uB300\uD574 \uC5EC\uB7EC \uBC88 \uB2E4\uC2DC \uC0DD\uC131(Regenerate)\uD55C \uB2F5\uBCC0\uB4E4\uC744 \uBC84\uB9AC\uC9C0 \uC54A\uACE0 \uBC84\uC804\uBCC4\uB85C \uD0D0\uC0C9\uD560 \uB54C",
30069
+ "\uB300\uD654 \uB3C4\uC911 \uD2B9\uC815 \uC2DC\uC810\uC73C\uB85C \uB3CC\uC544\uAC00 \uC0C8\uB85C\uC6B4 \uB300\uD654 \uC904\uAE30\uB97C \uBED7\uC5B4\uB098\uAC00\uB294 \uBD84\uAE30(Forking/Branching)\uB97C \uAD6C\uD604\uD560 \uB54C",
30070
+ "\uC2AC\uB798\uC2DC(/) \uBA85\uB839\uC5B4\uB85C \uC0AC\uC804\uC5D0 \uC815\uC758\uB41C \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF\uC744 \uBE60\uB974\uAC8C \uBD88\uB7EC\uC640 \uC138\uC158\uC5D0 \uC801\uC6A9\uD560 \uB54C",
30071
+ "\uC138\uC158\uC774 \uAE38\uC5B4\uC9C8 \uB54C \uC0AC\uC6A9\uC790\uC758 \uD575\uC2EC \uC120\uD638\uB3C4\uC640 \uACFC\uAC70 \uC791\uC5C5 \uB9E5\uB77D\uC744 \uC7A5\uAE30 \uBA54\uBAA8\uB9AC\uB85C \uC694\uC57D \uBCF4\uAD00\uD560 \uB54C"
30072
+ ],
30073
+ en: [
30074
+ "Retaining multiple regenerated answer versions rather than discarding past responses",
30075
+ "Branching conversation threads from earlier turns to explore alternative paths",
30076
+ "Invoking preset prompt templates via slash commands directly into active sessions",
30077
+ "Summarizing user preferences and ongoing task state into persistent agent memory"
30078
+ ]
30079
+ },
30080
+ keywords: {
30081
+ ko: ["\uC138\uC158 \uC0C1\uD0DC", "\uC751\uB2F5 \uBD84\uAE30", "\uBC84\uC804 \uC2A4\uC704\uCC98", "\uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC", "\uC7A5\uAE30 \uBA54\uBAA8\uB9AC", "\uB864\uBC31", "\uC7AC\uC0DD\uC131 \uD788\uC2A4\uD1A0\uB9AC"],
30082
+ en: ["session state", "response branching", "version switcher", "slash commands", "long-term memory", "rollback", "regeneration history"]
30083
+ },
30084
+ text: {
30085
+ ko: {
30086
+ domain: "AI \uC5D0\uC774\uC804\uD2B8 & LLM \uC11C\uBE44\uC2A4",
30087
+ title: "\uC5D0\uC774\uC804\uD2B8 \uB300\uD654 \uC138\uC158 \uC0C1\uD0DC \uAD00\uB9AC\uC640 \uC751\uB2F5 \uBC84\uC804 \uBD84\uAE30 \uBC0F \uB864\uBC31",
30088
+ summary: "\uBA40\uD2F0\uD134 \uC138\uC158 \uC0C1\uD0DC\uB97C \uBCF4\uC874\uD558\uACE0, \uC7AC\uC0DD\uC131\uB41C \uC5EC\uB7EC \uC751\uB2F5 \uBC84\uC804 \uAC04\uC758 \uD0D0\uC0C9\uACFC \uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC \uD15C\uD50C\uB9BF\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4.",
30089
+ overview: "\uB300\uD654\uD615 AI \uC11C\uBE44\uC2A4\uC5D0\uC11C \uC0AC\uC6A9\uC790\uB294 \uB9C8\uC74C\uC5D0 \uB4E4\uC9C0 \uC54A\uB294 \uB2F5\uBCC0\uC744 \uB2E4\uC2DC \uC0DD\uC131(Retry)\uD558\uAC70\uB098, \uC774\uC804 \uD134\uC73C\uB85C \uB3CC\uC544\uAC00 \uB2E4\uB978 \uC9C8\uBB38\uC744 \uB358\uC9C0\uB294 \uC77C\uC774 \uD754\uD569\uB2C8\uB2E4. \uC774\uC804 \uB2F5\uBCC0\uC744 \uB36E\uC5B4\uC368\uBC84\uB9AC\uBA74 \uACFC\uAC70\uC758 \uC720\uC6A9\uD55C \uC815\uBCF4\uB97C \uC601\uAD6C\uD788 \uC783\uAC8C \uB429\uB2C8\uB2E4. \uB610\uD55C \uBC18\uBCF5\uC801\uC778 \uC791\uC5C5\uC744 \uB2E8\uCD95\uD558\uAE30 \uC704\uD574 \uC2AC\uB798\uC2DC(/) \uCEE4\uB9E8\uB4DC\uB85C \uC790\uC8FC \uC4F0\uB294 \uD15C\uD50C\uB9BF\uC744 \uD638\uCD9C\uD560 \uC218 \uC788\uC5B4\uC57C \uD558\uBA70, \uC7A5\uAE30 \uC138\uC158\uC5D0\uC11C\uB3C4 \uC0AC\uC6A9\uC790\uC758 \uC120\uD638 \uC2A4\uD0C0\uC77C\uACFC \uC791\uC5C5 \uC0C1\uD0DC\uB97C \uBA54\uBAA8\uB9AC\uB85C \uC720\uC9C0\uD574\uC57C \uD569\uB2C8\uB2E4.",
30090
+ concepts: [
30091
+ { name: "\uD2B8\uB9AC \uAE30\uBC18 \uB300\uD654 \uC0C1\uD0DC(Tree-structured Conversation State)", description: "\uB2E8\uC21C \uC120\uD615 \uBC30\uC5F4\uC774 \uC544\uB2CC \uBD80\uBAA8-\uC790\uC2DD \uB178\uB4DC\uB85C \uBA54\uC2DC\uC9C0\uB97C \uC800\uC7A5\uD574 \uD55C \uC9C8\uBB38\uC5D0\uC11C \uC5EC\uB7EC \uB2F5\uBCC0 \uBE0C\uB79C\uCE58\uAC00 \uBD84\uAE30\uD560 \uC218 \uC788\uB3C4\uB85D \uB370\uC774\uD130 \uAD6C\uC870\uB97C \uC124\uACC4\uD569\uB2C8\uB2E4." },
30092
+ { name: "\uBC84\uC804 \uB124\uBE44\uAC8C\uC774\uC158(Version Pagination)", description: "\uB3D9\uC77C \uB178\uB4DC\uC5D0\uC11C \uBD84\uAE30\uB41C \uC5EC\uB7EC \uB2F5\uBCC0 \uBC84\uC804\uC744 < 1 / 3 > \uD615\uD0DC\uC758 \uCEE8\uD2B8\uB864\uB85C \uB118\uACA8\uBCF4\uBA70 \uD65C\uC131 \uBE0C\uB79C\uCE58\uB97C \uC804\uD658\uD569\uB2C8\uB2E4." },
30093
+ { name: "\uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC \uD15C\uD50C\uB9BF(Slash Command Prompt Ingestion)", description: "\uC785\uB825\uCC3D\uC5D0\uC11C / \uD0A4\uB85C \uD2B8\uB9AC\uAC70\uB418\uB294 \uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8\uB97C \uD1B5\uD574 \uC77C\uAD00\uB41C \uACE0\uD488\uC9C8 \uC2DC\uC2A4\uD15C \uC9C0\uC2DC \uD504\uB86C\uD504\uD2B8\uB97C \uC8FC\uC785\uD569\uB2C8\uB2E4." }
30094
+ ],
30095
+ workflow: [
30096
+ { name: "\uC7AC\uC0DD\uC131 \uC694\uCCAD \uC2DC \uC2E0\uADDC \uB178\uB4DC \uCD94\uAC00\uD558\uAE30", description: "\uAE30\uC874 \uB2F5\uBCC0\uC744 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uACE0 \uBD80\uBAA8 \uC9C8\uBB38 \uB178\uB4DC\uC758 \uC790\uC2DD \uBC30\uC5F4\uC5D0 \uC0C8\uB85C\uC6B4 \uB2F5\uBCC0 \uBC84\uC804\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4." },
30097
+ { name: "\uBC84\uC804 \uC2A4\uC704\uCC98 \uCEE8\uD2B8\uB864 \uB80C\uB354\uB9C1\uD558\uAE30", description: "\uB2F5\uBCC0 \uCE74\uB4DC \uD558\uB2E8\uC5D0 \uC774\uC804/\uB2E4\uC74C \uD654\uC0B4\uD45C\uC640 \uD604\uC7AC \uBC84\uC804 \uC778\uB371\uC2A4\uB97C \uD45C\uC2DC\uD574 \uC2AC\uB77C\uC774\uB4DC \uC804\uD658\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4." },
30098
+ { name: "\uC2AC\uB798\uC2DC \uCEE4\uB9E8\uB4DC\uB85C \uD504\uB86C\uD504\uD2B8 \uC790\uB3D9 \uC644\uC131\uD558\uAE30", description: "\uC0AC\uC6A9\uC790\uAC00 /\uB97C \uC785\uB825\uD558\uBA74 \uCD94\uCC9C \uBA85\uB839 \uD31D\uC624\uBC84\uB97C \uC5F4\uACE0 \uC120\uD0DD \uC2DC \uD574\uB2F9 \uD15C\uD50C\uB9BF\uC73C\uB85C \uCE58\uD658\uD569\uB2C8\uB2E4." }
30099
+ ],
30100
+ pitfalls: [
30101
+ { name: "\uC0C8 \uBC84\uC804 \uC0DD\uC131 \uC2DC \uC774\uC804 \uBC84\uC804\uC744 \uD30C\uAD34\uC801\uC73C\uB85C \uB36E\uC5B4\uC4F0\uAE30", description: "\uC0AC\uC6A9\uC790\uAC00 \uC774\uC804 \uBC84\uC804\uC758 \uCF54\uB4DC\uAC00 \uB354 \uB9C8\uC74C\uC5D0 \uB4E4\uC5C8\uC744 \uB54C \uB418\uB3CC\uC544\uAC08 \uC218 \uC5C6\uC73C\uBA74 \uD070 \uBD88\uB9CC\uC744 \uC57C\uAE30\uD569\uB2C8\uB2E4." },
30102
+ { name: "\uAE4A\uC740 \uBD84\uAE30 \uD2B8\uB9AC\uB85C \uC778\uD55C \uC138\uC158 \uC0C1\uD0DC \uBCF5\uC7A1\uB3C4 \uD3ED\uC99D", description: "\uBB34\uC81C\uD55C \uBD84\uAE30 \uC2DC \uD074\uB77C\uC774\uC5B8\uD2B8 \uBA54\uBAA8\uB9AC\uC640 DB \uAD00\uACC4\uAC00 \uBCF5\uC7A1\uD574\uC9C0\uBBC0\uB85C \uB178\uB4DC \uAE4A\uC774 \uC81C\uD55C\uC774\uB098 \uBA85\uC2DC\uC801 \uAC00\uC9C0\uCE58\uAE30(Prune) \uC815\uCC45\uC744 \uB450\uC5B4\uC57C \uD569\uB2C8\uB2E4." }
30103
+ ],
30104
+ questions: [
30105
+ "\uC0AC\uC6A9\uC790\uAC00 \uD2B9\uC815 \uC774\uC804 \uBC84\uC804\uC73C\uB85C \uC804\uD658\uD588\uC744 \uB54C, \uADF8 \uC774\uD6C4\uC5D0 \uC774\uC5B4\uC9C0\uB294 \uD6C4\uC18D \uB300\uD654\uB4E4\uB3C4 \uD574\uB2F9 \uBC84\uC804\uC5D0 \uB9DE\uCDB0 \uB3D9\uAE30\uD654\uB418\uB098\uC694?",
30106
+ "\uC2AC\uB798\uC2DC \uBA85\uB839\uC5B4 \uBAA9\uB85D\uC744 \uC0AC\uC6A9\uC790\uAC00 \uC9C1\uC811 \uCEE4\uC2A4\uD140\uC73C\uB85C \uCD94\uAC00\uD558\uACE0 \uD3B8\uC9D1\uD560 \uC218 \uC788\uB098\uC694?",
30107
+ "\uBE0C\uB77C\uC6B0\uC800\uB97C \uC0C8\uB85C\uACE0\uCE68\uD558\uAC70\uB098 \uC138\uC158\uC744 \uB098\uAC14\uB2E4 \uC640\uB3C4 \uC0DD\uC131\uB41C \uBAA8\uB4E0 \uBC84\uC804 \uD788\uC2A4\uD1A0\uB9AC\uAC00 \uC720\uC9C0\uB418\uB098\uC694?"
30108
+ ],
30109
+ example: "\uC608\uC2DC: \uB3D9\uC77C\uD55C \uCF54\uB4DC \uB9AC\uD329\uD1A0\uB9C1 \uC694\uCCAD\uC5D0 \uB300\uD574 \uAC04\uACB0\uD615, \uC0C1\uC138\uD615, \uD45C \uD615\uC2DD\uC758 3\uAC00\uC9C0 \uBC84\uC804\uC744 \uC0DD\uC131\uD55C \uB4A4, \uB2F5\uBCC0 \uCE74\uB4DC \uD558\uB2E8\uC758 < 1 / 3 > \uBC84\uD2BC\uC73C\uB85C \uC790\uC720\uB86D\uAC8C \uB118\uACA8\uBCF4\uBA70 \uAC00\uC7A5 \uC801\uD569\uD55C \uBC84\uC804\uC744 \uCC44\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.",
30110
+ relatedDesigns: [
30111
+ { id: "ai-message-branch", reason: "\uC7AC\uC0DD\uC131\uB41C \uB2F5\uBCC0 \uBC84\uC804\uB4E4\uC744 \uC774\uC804/\uB2E4\uC74C \uD654\uC0B4\uD45C\uB85C \uB118\uACA8\uBCF4\uB294 \uBE0C\uB79C\uCE58 \uC2A4\uC704\uCC98\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4." },
30112
+ { id: "ai-slash-command", reason: "\uC2AC\uB798\uC2DC(/) \uBB38\uC790\uB85C \uC790\uC8FC \uC4F0\uB294 \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF\uC744 \uBE60\uB974\uAC8C \uBD88\uB7EC\uC624\uB294 \uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8\uB97C \uAD6C\uC131\uD569\uB2C8\uB2E4." }
30113
+ ],
30114
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 < 1 / 3 > \uD615\uD0DC\uC758 \uBC84\uC804 \uB124\uBE44\uAC8C\uC774\uC158\uC744 \uAC16\uCD98 AI \uC751\uB2F5 \uBC84\uC804 \uBD84\uAE30 \uCE74\uB4DC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uB108\uBE44 100%, \uCD5C\uC18C \uB192\uC774 180px \uCEE8\uD14C\uC774\uB108 \uC548\uC5D0 \uB2F5\uBCC0 \uB0B4\uC6A9\uACFC \uC774\uC804/\uB2E4\uC74C \uBC84\uD2BC\uC744 \uBC30\uCE58\uD558\uACE0, \uC0C8 \uBC84\uC804 \uC0DD\uC131 \uD074\uB9AD \uC2DC \uC2E0\uADDC \uBC84\uC804\uC774 \uBC30\uC5F4\uC5D0 \uCD94\uAC00\uB418\uBA70 \uC989\uC2DC \uC774\uB3D9\uD558\uAC8C \uD574 \uC918."
30115
+ },
30116
+ en: {
30117
+ domain: "AI Agents & LLM Services",
30118
+ title: "Agent Conversation Session State, Response Branching, and Rollback",
30119
+ summary: "Manage multi-turn conversation states with non-destructive response version branching and slash command palettes.",
30120
+ overview: "Users routinely regenerate AI answers or backstep to fork alternative lines of inquiry. Overwriting previous responses discards viable solutions permanently. Structuring session histories as trees preserves parallel branches, navigated via version switchers, while slash command palettes facilitate rapid ingestion of standard prompt templates.",
30121
+ concepts: [
30122
+ { name: "Tree-structured Session State", description: "Representing conversations as parent-child nodes rather than flat lists to support multiple branching response variants." },
30123
+ { name: "Response Version Pagination", description: "Navigating parallel response alternatives using < 1 / 3 > controls to switch the active branch." },
30124
+ { name: "Slash Command Palette Ingestion", description: 'Surfacing command popovers on "/" keypress to insert structured prompt templates seamlessly.' }
30125
+ ],
30126
+ workflow: [
30127
+ { name: "Append New Node on Regeneration", description: "Record newly generated responses as sibling nodes beneath the parent prompt rather than mutating existing records." },
30128
+ { name: "Render Branch Pagination Controls", description: "Display previous/next selectors and version tallies at the base of message bubbles to toggle states." },
30129
+ { name: "Trigger Slash Palette Autocompletion", description: 'Open a floating command selector when "/" is typed, substituting prompts upon selection.' }
30130
+ ],
30131
+ pitfalls: [
30132
+ { name: "Destructively Overwriting Prior Generations", description: "Eliminating earlier generations frustrates users seeking snippets from previous completions; retain versions in memory." },
30133
+ { name: "Unbounded Tree Memory Growth", description: "Unchecked branching inflates client memory and serialization complexity; establish pragmatic pruning boundaries." }
30134
+ ],
30135
+ questions: [
30136
+ "Does navigating to an earlier sibling version automatically switch the downstream conversational context?",
30137
+ "Can users configure custom personal slash command macros?",
30138
+ "Does session persistence retain full branch histories across page reloads?"
30139
+ ],
30140
+ example: "Example: A developer requests three refactoring variants (concise, detailed, tabular) and navigates among them using < 1 / 3 > controls before deciding which variant to keep.",
30141
+ relatedDesigns: [
30142
+ { id: "ai-message-branch", reason: "Enables navigating across multiple response generations with version pagination." },
30143
+ { id: "ai-slash-command", reason: "Provides a slash command menu to autocomplete common prompt instructions." }
30144
+ ],
30145
+ promptSnippet: "Create a response branch switcher card with < 1 / 3 > version navigation in the specified area. Inside a container of width 100% and min-height 180px, render message content and pagination controls to switch between regenerated responses."
30146
+ }
30147
+ },
30148
+ sources: [
30149
+ { title: "LangChain Chat History & Memory Concepts", url: "https://python.langchain.com/docs/concepts/chat_history/" },
30150
+ { title: "Vercel AI SDK Core Concepts", url: "https://sdk.vercel.ai/docs/concepts" }
30151
+ ]
30152
+ }
30153
+ ];
30154
+
30155
+ // ../../packages/catalog/src/domain-knowledge.ts
30156
+ var DOMAIN_KNOWLEDGE = [
30157
+ ...EDUCATION_KNOWLEDGE,
30158
+ ...COMMUNITY_KNOWLEDGE,
30159
+ ...COMMERCE_KNOWLEDGE,
30160
+ ...BOOKING_KNOWLEDGE,
30161
+ ...SUBSCRIPTION_KNOWLEDGE,
30162
+ ...COLLABORATION_KNOWLEDGE,
30163
+ ...SUPPORT_KNOWLEDGE,
30164
+ ...ACCOUNT_KNOWLEDGE,
30165
+ ...NOTIFICATION_KNOWLEDGE,
30166
+ ...PUBLISHING_KNOWLEDGE,
30167
+ ...MEDIA_KNOWLEDGE,
30168
+ ...MARKETPLACE_KNOWLEDGE,
30169
+ ...EVENT_KNOWLEDGE,
30170
+ ...RECRUITING_KNOWLEDGE,
30171
+ ...ANALYTICS_KNOWLEDGE,
30172
+ ...SECURITY_KNOWLEDGE,
30173
+ ...LOGISTICS_KNOWLEDGE,
30174
+ ...FINTECH_KNOWLEDGE,
30175
+ ...HEALTHCARE_KNOWLEDGE,
30176
+ ...AUTOMATION_KNOWLEDGE,
30177
+ ...AI_KNOWLEDGE
30178
+ ];
30179
+
30180
+ // ../../packages/catalog/src/domain-knowledge/search-vocabulary.ts
30181
+ var KNOWLEDGE_SYNONYMS = [
30182
+ ["education", "\uAD50\uC721", "\uAD50\uC721\uC11C\uBE44\uC2A4", "\uAD50\uC721 \uC11C\uBE44\uC2A4", "\uAD50\uC721 \uD50C\uB7AB\uD3FC", "\uAD50\uC721\uD50C\uB7AB\uD3FC", "lms", "learning management system", "\uD559\uC2B5 \uAD00\uB9AC \uC2DC\uC2A4\uD15C", "\uD559\uC2B5\uAD00\uB9AC\uC2DC\uC2A4\uD15C", "\uC774\uB7EC\uB2DD", "e-learning", "elearning"],
30183
+ ["course", "courses", "lesson", "lessons", "\uAC15\uC758", "\uC218\uC5C5", "\uAC15\uC88C", "\uB808\uC2A8", "\uC628\uB77C\uC778 \uAC15\uC758", "\uC628\uB77C\uC778\uAC15\uC758", "online course", "online courses"],
30184
+ ["learning", "\uD559\uC2B5"],
30185
+ ["quiz", "quizzes", "\uD034\uC988"],
30186
+ ["assignment", "assignments", "homework", "\uACFC\uC81C"],
30187
+ ["submission", "submissions", "submit", "\uC81C\uCD9C"],
30188
+ ["resubmission", "resubmit", "\uC7AC\uC81C\uCD9C", "\uB2E4\uC2DC \uC81C\uCD9C"],
30189
+ ["latework", "late submission", "late work", "\uC9C0\uAC01 \uC81C\uCD9C", "\uC9C0\uAC01\uC81C\uCD9C", "\uAE30\uD55C \uD6C4 \uC81C\uCD9C"],
30190
+ ["retry", "retries", "\uC7AC\uC2DC\uB3C4", "\uB2E4\uC2DC \uD480\uAE30"],
30191
+ ["feedback", "\uD53C\uB4DC\uBC31"],
30192
+ ["assessment", "\uD3C9\uAC00"],
30193
+ ["progress", "\uC9C4\uB3C4", "\uC9C4\uD589\uB960"],
30194
+ ["completion", "\uC644\uB8CC", "\uC218\uB8CC"],
30195
+ ["deadline", "deadlines", "\uB9C8\uAC10"],
30196
+ ["draft", "drafts", "\uCD08\uC548"],
30197
+ ["ratio", "\uBE44\uC728", "percentage", "percent"],
30198
+ ["community", "communities", "forum", "forums", "\uCEE4\uBBA4\uB2C8\uD2F0", "\uAC8C\uC2DC\uD310", "\uD3EC\uB7FC"],
30199
+ ["post", "posts", "\uAC8C\uC2DC\uBB3C", "\uAC8C\uC2DC\uAE00"],
30200
+ ["comment", "comments", "\uB313\uAE00"],
30201
+ ["visibility", "\uACF5\uAC1C \uBC94\uC704", "\uACF5\uAC1C\uBC94\uC704"],
30202
+ ["permission", "permissions", "\uAD8C\uD55C", "\uC811\uADFC \uAD8C\uD55C", "\uC811\uADFC\uAD8C\uD55C", "access control", "\uC811\uADFC \uC81C\uC5B4", "\uC811\uADFC\uC81C\uC5B4"],
30203
+ ["memberonly", "members only", "members-only", "member only", "\uD68C\uC6D0 \uC804\uC6A9", "\uD68C\uC6D0\uC804\uC6A9", "\uD68C\uC6D0\uB9CC", "private group", "\uBE44\uACF5\uAC1C \uADF8\uB8F9", "\uADF8\uB8F9 \uC804\uC6A9"],
30204
+ ["report", "reports", "\uC2E0\uACE0"],
30205
+ ["moderation", "\uC6B4\uC601", "\uBAA8\uB354\uB808\uC774\uC158", "\uC2E0\uACE0 \uCC98\uB9AC", "\uC2E0\uACE0\uCC98\uB9AC", "\uC2E0\uACE0 \uAC80\uD1A0"],
30206
+ ["hide", "hidden", "hiding", "\uC228\uAE40", "\uC228\uAE30\uAE30"],
30207
+ ["restore", "restoration", "\uBCF5\uAD6C", "\uBCF5\uC6D0"],
30208
+ ["lock", "locking", "locked", "\uC7A0\uAE08"],
30209
+ ["changelog", "\uBCC0\uACBD \uAE30\uB85D"],
30210
+ ["commerce", "ecommerce", "e-commerce", "\uCEE4\uBA38\uC2A4", "\uC774\uCEE4\uBA38\uC2A4", "\uC1FC\uD551\uBAB0", "\uC628\uB77C\uC778 \uC2A4\uD1A0\uC5B4", "\uC628\uB77C\uC778\uC2A4\uD1A0\uC5B4", "online store", "online shop"],
30211
+ ["order", "orders", "\uC8FC\uBB38", "\uC8FC\uBB38\uC11C", "\uC8FC\uBB38 \uAD00\uB9AC", "\uC8FC\uBB38\uAD00\uB9AC", "order management"],
30212
+ ["inventory", "stock", "\uC7AC\uACE0", "\uD488\uC808", "out of stock", "stockout", "\uC7AC\uACE0 \uCC28\uAC10", "\uC7AC\uACE0\uCC28\uAC10"],
30213
+ ["cart", "shopping cart", "\uC7A5\uBC14\uAD6C\uB2C8"],
30214
+ ["checkout", "\uCCB4\uD06C\uC544\uC6C3", "\uC8FC\uBB38 \uACB0\uC81C", "\uC8FC\uBB38\uACB0\uC81C"],
30215
+ ["refund", "refunds", "\uD658\uBD88", "\uBD80\uBD84 \uD658\uBD88", "\uBD80\uBD84\uD658\uBD88", "partial refund", "\uBC18\uD488"],
30216
+ ["fulfillment", "shipping", "shipment", "\uBC30\uC1A1", "\uCD9C\uACE0"],
30217
+ ["booking", "bookings", "reservation", "reservations", "\uC608\uC57D", "\uC608\uC57D \uC11C\uBE44\uC2A4", "\uC608\uC57D\uC11C\uBE44\uC2A4", "\uC608\uC57D \uC2DC\uC2A4\uD15C", "\uC608\uC57D\uC2DC\uC2A4\uD15C", "booking system"],
30218
+ ["schedule", "scheduling", "appointment", "appointments", "\uC77C\uC815", "\uC2A4\uCF00\uC904", "\uC77C\uC815 \uC608\uC57D", "\uC77C\uC815\uC608\uC57D"],
30219
+ ["timeslot", "time slot", "time slots", "timeslots", "\uC2DC\uAC04\uB300", "\uD0C0\uC784\uC2AC\uB86F"],
30220
+ ["capacity", "\uC815\uC6D0", "\uC794\uC5EC\uC11D"],
30221
+ ["waitlist", "waiting list", "\uB300\uAE30\uC5F4", "\uC608\uC57D \uB300\uAE30", "\uC608\uC57D\uB300\uAE30"],
30222
+ ["noshow", "no-show", "no show", "\uB178\uC1FC", "\uBBF8\uBC29\uBB38"],
30223
+ ["reschedule", "rescheduling", "\uC608\uC57D \uBCC0\uACBD", "\uC608\uC57D\uBCC0\uACBD", "\uC77C\uC815 \uBCC0\uACBD", "\uC77C\uC815\uBCC0\uACBD"],
30224
+ ["subscription", "subscriptions", "saas", "\uAD6C\uB3C5", "\uAD6C\uB3C5 \uC11C\uBE44\uC2A4", "\uAD6C\uB3C5\uC11C\uBE44\uC2A4", "\uC815\uAE30 \uACB0\uC81C", "\uC815\uAE30\uACB0\uC81C", "recurring billing"],
30225
+ ["pricing", "plan", "plans", "tier", "tiers", "\uC694\uAE08\uC81C", "\uD50C\uB79C", "\uAD6C\uB3C5 \uD50C\uB79C", "\uAD6C\uB3C5\uD50C\uB79C", "saas \uC694\uAE08\uC81C"],
30226
+ ["entitlement", "entitlements", "quota", "\uD50C\uB79C \uAD8C\uD55C", "\uD50C\uB79C\uAD8C\uD55C", "\uC0AC\uC6A9 \uD55C\uB3C4", "\uC0AC\uC6A9\uD55C\uB3C4"],
30227
+ ["billingcycle", "billing cycle", "\uACB0\uC81C \uC8FC\uAE30", "\uACB0\uC81C\uC8FC\uAE30", "\uC5C5\uADF8\uB808\uC774\uB4DC", "\uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC", "upgrade", "downgrade", "proration", "\uC77C\uD560 \uACC4\uC0B0", "\uC77C\uD560\uACC4\uC0B0"],
30228
+ ["trial", "free trial", "\uBB34\uB8CC \uCCB4\uD5D8", "\uBB34\uB8CC\uCCB4\uD5D8", "\uCCB4\uD5D8\uD310"],
30229
+ ["graceperiod", "grace period", "\uC720\uC608 \uAE30\uAC04", "\uC720\uC608\uAE30\uAC04", "\uD574\uC9C0 \uC608\uC57D", "\uD574\uC9C0\uC608\uC57D", "cancel at period end"],
30230
+ ["collaboration", "workspace", "work management", "project management", "\uD611\uC5C5", "\uD611\uC5C5 \uD234", "\uD611\uC5C5\uD234", "\uC5C5\uBB34 \uAD00\uB9AC", "\uC5C5\uBB34\uAD00\uB9AC", "\uD504\uB85C\uC81D\uD2B8 \uAD00\uB9AC", "\uD504\uB85C\uC81D\uD2B8\uAD00\uB9AC", "\uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4"],
30231
+ ["task", "tasks", "\uD0DC\uC2A4\uD06C", "\uD560 \uC77C", "\uD560\uC77C", "\uC791\uC5C5 \uBC30\uC815", "\uC791\uC5C5\uBC30\uC815"],
30232
+ ["kanban", "kanban board", "kanban task board", "\uCE78\uBC18", "\uCE78\uBC18 \uBCF4\uB4DC", "\uCE78\uBC18\uBCF4\uB4DC"],
30233
+ ["sharingscope", "sharing scope", "\uACF5\uC720 \uBC94\uC704", "\uACF5\uC720\uBC94\uC704"],
30234
+ ["activityhistory", "activity history", "\uD65C\uB3D9 \uAE30\uB85D", "\uD65C\uB3D9\uAE30\uB85D", "\uBCC0\uACBD \uC774\uB825", "\uBCC0\uACBD\uC774\uB825"],
30235
+ ["customersupport", "customer support", "helpdesk", "help desk", "\uACE0\uAC1D\uC9C0\uC6D0", "\uACE0\uAC1D \uC9C0\uC6D0", "\uACE0\uAC1D\uC13C\uD130", "\uACE0\uAC1D \uC13C\uD130", "\uD5EC\uD504\uB370\uC2A4\uD06C"],
30236
+ ["ticket", "tickets", "ticketing", "inquiry", "inquiries", "\uD2F0\uCF13", "1:1 \uBB38\uC758", "1:1\uBB38\uC758", "\uBB38\uC758 \uC811\uC218", "\uBB38\uC758\uC811\uC218", "\uC0C1\uB2F4 \uD2F0\uCF13"],
30237
+ ["reopen", "reopening", "\uC7AC\uC624\uD508", "\uB2E4\uC2DC \uC5F4\uAE30"],
30238
+ ["authentication", "auth", "signin", "sign-in", "sign in", "login", "log in", "\uB85C\uADF8\uC778", "\uD68C\uC6D0\uAC00\uC785", "\uD68C\uC6D0 \uAC00\uC785", "\uC774\uBA54\uC77C \uC778\uC99D", "\uC774\uBA54\uC77C\uC778\uC99D"],
30239
+ ["oauth", "social login", "\uC18C\uC15C \uB85C\uADF8\uC778", "\uC18C\uC15C\uB85C\uADF8\uC778", "\uACC4\uC815 \uC5F0\uB3D9", "\uACC4\uC815\uC5F0\uB3D9"],
30240
+ ["passwordreset", "password reset", "\uBE44\uBC00\uBC88\uD638 \uC7AC\uC124\uC815", "\uBE44\uBC00\uBC88\uD638\uC7AC\uC124\uC815"],
30241
+ ["accountdeletion", "account deletion", "\uD68C\uC6D0 \uD0C8\uD1F4", "\uD68C\uC6D0\uD0C8\uD1F4", "\uD0C8\uD1F4 \uC720\uC608", "\uD0C8\uD1F4\uC720\uC608", "\uAC1C\uC778\uC815\uBCF4 \uD30C\uAE30"],
30242
+ ["notificationcenter", "notification center", "in-app inbox", "\uC54C\uB9BC\uD568", "\uC54C\uB9BC \uC13C\uD130", "\uC54C\uB9BC\uC13C\uD130", "\uC778\uC571 \uC54C\uB9BC", "\uC778\uC571\uC54C\uB9BC"],
30243
+ ["pushnotification", "push notification", "push notifications", "\uD478\uC2DC \uC54C\uB9BC", "\uD478\uC2DC\uC54C\uB9BC", "\uC774\uBA54\uC77C \uC54C\uB9BC", "\uC774\uBA54\uC77C\uC54C\uB9BC"],
30244
+ ["notificationpreferences", "notification preferences", "\uC218\uC2E0 \uC124\uC815", "\uC218\uC2E0\uC124\uC815", "\uC54C\uB9BC \uC124\uC815", "\uC54C\uB9BC\uC124\uC815", "\uBC29\uD574 \uAE08\uC9C0", "\uBC29\uD574\uAE08\uC9C0", "quiet hours"],
30245
+ ["markallread", "mark all read", "read state", "\uC77D\uC74C \uCC98\uB9AC", "\uC77D\uC74C\uCC98\uB9AC", "\uBAA8\uB450 \uC77D\uC74C", "\uBAA8\uB450\uC77D\uC74C", "\uBC30\uC9C0 \uCE74\uC6B4\uD2B8", "\uC911\uBCF5 \uBC1C\uC1A1 \uBC29\uC9C0"],
30246
+ ["cms", "content management system", "content publishing", "\uCF58\uD150\uCE20 \uBC1C\uD589", "\uCF58\uD150\uCE20\uBC1C\uD589", "\uBE14\uB85C\uADF8 \uC5D0\uB514\uD130"],
30247
+ ["scheduledpublishing", "scheduled publishing", "\uC608\uC57D \uBC1C\uD589", "\uC608\uC57D\uBC1C\uD589", "\uAC8C\uC2DC \uB0B4\uB9BC", "\uAC8C\uC2DC\uB0B4\uB9BC", "unpublish"],
30248
+ ["versionrestore", "version history", "version restore", "\uBC84\uC804 \uAD00\uB9AC", "\uBC84\uC804\uAD00\uB9AC", "\uBC84\uC804 \uBCF5\uC6D0", "\uBC84\uC804\uBCF5\uC6D0"],
30249
+ ["slugredirect", "slug", "url slug", "\uC2AC\uB7EC\uADF8", "\uB9AC\uB2E4\uC774\uB809\uD2B8"],
30250
+ ["fileupload", "file upload", "media management", "\uD30C\uC77C \uC5C5\uB85C\uB4DC", "\uD30C\uC77C\uC5C5\uB85C\uB4DC", "\uBBF8\uB514\uC5B4 \uAD00\uB9AC", "\uBBF8\uB514\uC5B4\uAD00\uB9AC", "\uBA40\uD2F0\uD30C\uD2B8 \uC5C5\uB85C\uB4DC"],
30251
+ ["transcoding", "thumbnail generation", "\uC378\uB124\uC77C \uC0DD\uC131", "\uC378\uB124\uC77C\uC0DD\uC131", "\uC778\uCF54\uB529", "\uBCC0\uD658 \uB300\uAE30", "\uBCC0\uD658\uB300\uAE30", "async media processing"],
30252
+ ["signedurl", "signed url", "presigned url", "\uC11C\uBA85\uB41C url", "\uACE0\uC544 \uD30C\uC77C", "\uACE0\uC544\uD30C\uC77C", "orphan cleanup"],
30253
+ ["marketplace", "two-sided marketplace", "\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4", "\uC624\uD508\uB9C8\uCF13", "\uD310\uB9E4\uC790 \uC815\uC0B0", "\uD310\uB9E4\uC790\uC815\uC0B0", "seller payout", "seller payouts"],
30254
+ ["escrow", "\uC5D0\uC2A4\uD06C\uB85C", "\uAD6C\uB9E4 \uD655\uC815", "\uAD6C\uB9E4\uD655\uC815", "\uC815\uC0B0 \uBCF4\uB958", "\uC815\uC0B0\uBCF4\uB958", "payout hold"],
30255
+ ["platformfee", "platform fee", "\uC911\uAC1C \uC218\uC218\uB8CC", "\uC911\uAC1C\uC218\uC218\uB8CC", "\uCC28\uAC10 \uC815\uC0B0", "\uCC28\uAC10\uC815\uC0B0", "payout deduction"],
30256
+ ["eventregistration", "event registration", "conference ticketing", "\uCC38\uAC00 \uC2E0\uCCAD", "\uCC38\uAC00\uC2E0\uCCAD", "\uCEE8\uD37C\uB7F0\uC2A4 \uB4F1\uB85D", "\uD2F0\uCF13 \uBC1C\uAD8C", "\uD2F0\uCF13\uBC1C\uAD8C"],
30257
+ ["earlybird", "early bird", "\uC5BC\uB9AC\uBC84\uB4DC", "\uCC38\uAC00\uAD8C \uC591\uB3C4", "\uCC38\uAC00\uAD8C\uC591\uB3C4", "ticket transfer"],
30258
+ ["qrcheckin", "check-in", "checkin", "qr check-in", "\uD604\uC7A5 \uCCB4\uD06C\uC778", "\uD604\uC7A5\uCCB4\uD06C\uC778", "qr \uCCB4\uD06C\uC778", "\uC911\uBCF5 \uC785\uC7A5 \uBC29\uC9C0"],
30259
+ ["recruiting", "applicant tracking", "applicant tracking system", "ats", "\uCC44\uC6A9", "\uCC44\uC6A9 \uC0AC\uC774\uD2B8", "\uCC44\uC6A9\uC0AC\uC774\uD2B8", "\uC9C0\uC6D0 \uAD00\uB9AC", "\uC9C0\uC6D0\uAD00\uB9AC", "\uCC44\uC6A9 \uACF5\uACE0", "\uCC44\uC6A9\uACF5\uACE0", "\uC785\uC0AC \uC9C0\uC6D0", "\uC785\uC0AC\uC9C0\uC6D0"],
30260
+ ["pipelinestage", "pipeline stage", "job application stages", "\uC804\uD615 \uB2E8\uACC4", "\uC804\uD615\uB2E8\uACC4", "\uC11C\uB958 \uC804\uD615", "\uC11C\uB958\uC804\uD615"],
30261
+ ["scorecard", "scorecards", "interview scorecards", "\uBA74\uC811 \uD3C9\uAC00\uD45C", "\uBA74\uC811\uD3C9\uAC00\uD45C", "\uD3C9\uAC00\uD45C", "\uD569\uACA9 \uD1B5\uBCF4", "\uD569\uACA9\uD1B5\uBCF4"],
30262
+ ["analytics", "analytics dashboard", "\uC9C0\uD45C \uB300\uC2DC\uBCF4\uB4DC", "\uC9C0\uD45C\uB300\uC2DC\uBCF4\uB4DC", "\uB370\uC774\uD130 \uBD84\uC11D", "\uB370\uC774\uD130\uBD84\uC11D", "\uD1B5\uACC4 \uC9D1\uACC4"],
30263
+ ["kpi", "kpis", "metrics and kpis", "\uC804\uC8FC \uB300\uBE44", "\uC9D1\uACC4 \uC9C0\uC5F0", "\uC9D1\uACC4\uC9C0\uC5F0", "data freshness", "\uACB0\uCE21\uCE58"],
30264
+ ["csvexport", "csv export", "csv download", "data export", "\uB370\uC774\uD130 \uB0B4\uBCF4\uB0B4\uAE30", "\uB370\uC774\uD130\uB0B4\uBCF4\uB0B4\uAE30", "csv \uB2E4\uC6B4\uB85C\uB4DC"],
30265
+ ["rbac", "role-based access control", "\uC5ED\uD560 \uAE30\uBC18 \uAD8C\uD55C", "\uC5ED\uD560\uAE30\uBC18\uAD8C\uD55C", "\uAD8C\uD55C \uAC10\uC0AC", "\uAD8C\uD55C\uAC10\uC0AC"],
30266
+ ["auditlog", "audit log", "audit logs", "\uAC10\uC0AC \uB85C\uADF8", "\uAC10\uC0AC\uB85C\uADF8", "\uBCF4\uC548 \uAC10\uC0AC", "\uBCF4\uC548\uAC10\uC0AC"],
30267
+ ["apikey", "api key", "api keys", "webhook secret", "api \uD0A4", "\uC6F9\uD6C5 \uC2DC\uD06C\uB9BF", "\uC2DC\uD06C\uB9BF \uAD50\uCCB4"],
30268
+ ["logistics", "warehouse fulfillment", "\uBB3C\uB958", "\uBC30\uB2EC", "\uD480\uD544\uBA3C\uD2B8", "\uCC3D\uACE0 \uCD9C\uACE0", "\uD569\uD3EC\uC7A5", "\uBD84\uB9AC\uBC30\uC1A1"],
30269
+ ["deliveryproof", "proof of delivery", "last-mile", "\uC218\uB839 \uD655\uC778", "\uBC30\uCC28", "\uC1A1\uC7A5", "\uD68C\uC218 \uC1A1\uC7A5"],
30270
+ ["fintech", "\uD540\uD14C\uD06C", "\uC1A1\uAE08", "\uC608\uCE58\uAE08 \uC9C0\uAC11", "\uD3EC\uC778\uD2B8 \uC9C0\uAC11", "\uBCF5\uC2DD \uC6D0\uC7A5", "\uACC4\uC88C \uC774\uCCB4", "\uACC4\uC88C\uC774\uCCB4"],
30271
+ ["idempotency", "idempotency key", "\uBA71\uB4F1\uC131", "\uC911\uBCF5 \uCD9C\uAE08 \uBC29\uC9C0", "\uC790\uB3D9\uC774\uCCB4", "direct debit"],
30272
+ ["healthcare", "clinic", "\uD5EC\uC2A4\uCF00\uC5B4", "\uC9C4\uB8CC", "\uAC74\uAC15\uAE30\uB85D", "\uC0AC\uC804 \uBB38\uC9C4\uD45C", "\uBB38\uC9C4\uD45C", "\uCC98\uBC29\uC804", "\uBCF5\uC57D \uC54C\uB9BC"],
30273
+ ["formautomation", "workflow automation", "\uC124\uBB38", "\uD3FC \uBE4C\uB354", "\uC870\uAC74\uBD80 \uBD84\uAE30", "\uC6CC\uD06C\uD50C\uB85C \uC790\uB3D9\uD654", "\uBC30\uCE58 \uAC00\uC838\uC624\uAE30"]
30274
+ ];
30275
+ var KNOWLEDGE_STOP_WORDS = [
30276
+ "\uC11C\uBE44\uC2A4",
30277
+ "\uC0AC\uC774\uD2B8",
30278
+ "\uD50C\uB7AB\uD3FC",
30279
+ "\uB9CC\uB4E4\uACE0",
30280
+ "\uB9CC\uB4E4\uB824\uACE0",
30281
+ "\uB9CC\uB4E4\uB824\uB294",
30282
+ "\uC2F6\uC5B4",
30283
+ "\uC2F6\uC5B4\uC694",
30284
+ "\uC2F6\uB2E4",
30285
+ "\uC2F6\uC740\uB370",
30286
+ "\uC54C\uB824\uC918",
30287
+ "\uC54C\uACE0",
30288
+ "\uB300\uD55C",
30289
+ "\uAD00\uB828",
30290
+ "\uD544\uC694\uD55C",
30291
+ "\uC9C0\uC2DD",
30292
+ "\uC5B4\uB5BB\uAC8C",
30293
+ "\uD560",
30294
+ "\uC218",
30295
+ "\uC788\uB294",
30296
+ "\uBCFC",
30297
+ "service",
30298
+ "website",
30299
+ "platform",
30300
+ "build",
30301
+ "building",
30302
+ "would",
30303
+ "like",
30304
+ "need",
30305
+ "about",
30306
+ "how"
30307
+ ];
30308
+
30309
+ // ../../packages/catalog/src/search-ranking.ts
30310
+ var normalizeSearchText = (text2) => text2.normalize("NFKC").trim().toLowerCase();
30311
+ function createSearchTokenizer(synonyms, extraStopWords = []) {
30312
+ const stopWords = /* @__PURE__ */ new Set([
30313
+ ..."a an the to of in on at with for and or i my want please make create implement design effect this that me it is as can you add show using \uB514\uC790\uC778 \uD6A8\uACFC \uAD6C\uD604 \uAD6C\uD604\uD574 \uAD6C\uD604\uD574\uC918 \uB9CC\uB4E4\uC5B4 \uB9CC\uB4E4\uC5B4\uC918 \uD574\uC918 \uC8FC\uC138\uC694 \uC918 \uC774 \uAC00 \uC740 \uB294 \uC744 \uB97C \uC5D0 \uC5D0\uC11C \uC73C\uB85C \uCC98\uB7FC \uB54C \uD558\uBA74 \uB418\uAC8C \uD558\uAC8C \uC0B4\uC9DD".split(" "),
30314
+ ...extraStopWords
30315
+ ]);
30316
+ const escapeRegex = (text2) => text2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
30317
+ const aliases = synonyms.flatMap((group) => group.map((alias) => ({ alias: normalizeSearchText(alias), canonical: group[0] }))).sort((a, b) => b.alias.length - a.alias.length);
30318
+ const aliasMap = new Map(aliases.map(({ alias, canonical }) => [alias, canonical]));
30319
+ const aliasPattern = new RegExp(aliases.map(({ alias }) => /[a-z]/.test(alias) ? `(?<![a-z0-9])${escapeRegex(alias)}(?![a-z0-9])` : escapeRegex(alias)).join("|"), "gu");
30320
+ return (text2) => {
30321
+ const canonical = normalizeSearchText(text2).replace(aliasPattern, (match) => ` ${aliasMap.get(match)} `);
30322
+ return [...new Set(canonical.split(/[^\p{L}\p{N}.%-]+/u).filter((token) => token && !stopWords.has(token)))];
30323
+ };
30324
+ }
30325
+ function createSearchEntries(fields, tokenize) {
30326
+ return fields.flatMap(([field, values]) => values.map((value) => ({
30327
+ field,
30328
+ value,
30329
+ normalizedValue: normalizeSearchText(value),
30330
+ tokens: new Set(tokenize(value))
30331
+ })));
30332
+ }
30333
+ function rankSearchEntries(entries4, queryTokens, weights4, exact, exactBonus = 100) {
30334
+ if (!queryTokens.length && !exact) return null;
30335
+ const matchedOn = [];
30336
+ const best = /* @__PURE__ */ new Map();
30337
+ for (const entry of entries4) {
30338
+ const matched = queryTokens.filter((token) => entry.tokens.has(token));
30339
+ if (!matched.length) continue;
30340
+ for (const token of matched) best.set(token, Math.max(best.get(token) ?? 0, weights4[entry.field]));
30341
+ if (!matchedOn.some((match) => match.field === entry.field)) matchedOn.push({ field: entry.field, value: entry.value });
30342
+ }
30343
+ if (!exact && best.size < Math.max(1, Math.ceil(queryTokens.length * 0.6))) return null;
30344
+ let score = [...best.values()].reduce((sum, weight) => sum + weight, 0);
30345
+ score += queryTokens.length ? Math.round(20 * best.size / queryTokens.length) : 0;
30346
+ if (exact) {
30347
+ score += exactBonus;
29559
30348
  if (!matchedOn.some((match) => match.field === exact.field)) matchedOn.unshift({ field: exact.field, value: exact.value });
29560
30349
  }
29561
- return { score, matchedOn: matchedOn.slice(0, 4) };
30350
+ return { score, matchedOn: matchedOn.slice(0, 4) };
30351
+ }
30352
+
30353
+ // ../../packages/catalog/src/domain-knowledge-search.ts
30354
+ var tokens = createSearchTokenizer(KNOWLEDGE_SYNONYMS, KNOWLEDGE_STOP_WORDS);
30355
+ var weights = {
30356
+ domain: 35,
30357
+ title: 30,
30358
+ alias: 28,
30359
+ keyword: 20,
30360
+ useCase: 18,
30361
+ summary: 12,
30362
+ concept: 10,
30363
+ workflow: 8,
30364
+ pitfall: 8,
30365
+ question: 6,
30366
+ example: 3
30367
+ };
30368
+ var index = /* @__PURE__ */ new Map();
30369
+ function entries(item) {
30370
+ const cached = index.get(item);
30371
+ if (cached) return cached;
30372
+ const texts = [item.text.ko, item.text.en];
30373
+ const fields = [
30374
+ ["domain", texts.map((text2) => text2.domain)],
30375
+ ["title", [item.id, ...texts.map((text2) => text2.title)]],
30376
+ ["alias", [...item.aliases.ko, ...item.aliases.en]],
30377
+ ["keyword", [...item.keywords.ko, ...item.keywords.en]],
30378
+ ["useCase", [...item.useCases.ko, ...item.useCases.en]],
30379
+ ["summary", texts.flatMap((text2) => [text2.summary, text2.overview])],
30380
+ ...["concept", "workflow", "pitfall"].map((field) => [field, texts.flatMap((text2) => (field === "concept" ? text2.concepts : field === "workflow" ? text2.workflow : text2.pitfalls).flatMap((point) => [point.name, point.description]))]),
30381
+ ["question", texts.flatMap((text2) => text2.questions)],
30382
+ ["example", texts.map((text2) => text2.example)]
30383
+ ];
30384
+ const result2 = createSearchEntries(fields, tokens);
30385
+ index.set(item, result2);
30386
+ return result2;
30387
+ }
30388
+ function rankDomainKnowledge(query = "") {
30389
+ if (!query.trim()) return DOMAIN_KNOWLEDGE.map((item) => ({ item, score: 0, matchedOn: [] }));
30390
+ const queryTokens = tokens(query);
30391
+ const normalizedQuery = normalizeSearchText(query);
30392
+ const results = [];
30393
+ for (const item of DOMAIN_KNOWLEDGE) {
30394
+ const allEntries = entries(item);
30395
+ const exact = allEntries.find((entry) => entry.normalizedValue === normalizedQuery);
30396
+ const result2 = rankSearchEntries(allEntries, queryTokens, weights, exact, exact?.field === "domain" || exact?.field === "title" ? 150 : 100);
30397
+ if (result2) results.push({ item, ...result2 });
30398
+ }
30399
+ return results.sort((a, b) => b.score - a.score);
30400
+ }
30401
+
30402
+ // ../../packages/catalog/src/glossary-links.ts
30403
+ var GLOSSARY_CATEGORIES = ["ui", "engineering", "workflow"];
30404
+ var GLOSSARY_LINK_META = [
30405
+ // UI (8)
30406
+ {
30407
+ id: "skeleton-loading",
30408
+ name: { ko: "\uC2A4\uCF08\uB808\uD1A4 \uB85C\uB529", en: "Skeleton Loading" },
30409
+ category: "ui",
30410
+ relatedTechniqueIds: ["stable-skeleton-content", "skeleton-shimmer"],
30411
+ relatedDomainIds: ["file-upload-processing-and-access-control", "analytics-metric-aggregation-and-export"]
30412
+ },
30413
+ {
30414
+ id: "empty-state",
30415
+ name: { ko: "\uBE48 \uC0C1\uD0DC", en: "Empty State" },
30416
+ category: "ui",
30417
+ relatedTechniqueIds: ["recoverable-search-empty-state"],
30418
+ relatedDomainIds: ["workspace-task-assignment-and-status", "analytics-metric-aggregation-and-export"]
30419
+ },
30420
+ {
30421
+ id: "inline-validation",
30422
+ name: { ko: "\uC778\uB77C\uC778 \uC720\uD6A8\uC131 \uAC80\uC99D", en: "Inline Validation" },
30423
+ category: "ui",
30424
+ relatedTechniqueIds: ["inline-email-validation", "linked-form-error-summary", "character-budget-feedback"],
30425
+ relatedDomainIds: ["account-auth-recovery-and-deletion", "automation-form-branching-validation-and-partial-save"]
30426
+ },
30427
+ {
30428
+ id: "progressive-disclosure",
30429
+ name: { ko: "\uC810\uC9C4\uC801 \uACF5\uAC1C", en: "Progressive Disclosure" },
30430
+ category: "ui",
30431
+ relatedTechniqueIds: ["smooth-accordion", "inline-footnote-disclosure", "ly-expandable-data-rows"],
30432
+ relatedDomainIds: ["automation-form-branching-validation-and-partial-save", "support-faq-self-service-and-deflection"]
30433
+ },
30434
+ {
30435
+ id: "toast-and-snackbar",
30436
+ name: { ko: "\uD1A0\uC2A4\uD2B8\uC640 \uC2A4\uB0B5\uBC14", en: "Toast and Snackbar" },
30437
+ category: "ui",
30438
+ relatedTechniqueIds: ["toast-slide-stack", "undo-delete-snackbar", "dismissible-inline-banner"],
30439
+ relatedDomainIds: ["notification-channels-preferences-and-read-state"]
30440
+ },
30441
+ {
30442
+ id: "command-palette",
30443
+ name: { ko: "\uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8", en: "Command Palette" },
30444
+ category: "ui",
30445
+ relatedTechniqueIds: ["ly-command-palette", "ai-slash-command", "manual-search-combobox"],
30446
+ relatedDomainIds: ["workspace-task-assignment-and-status", "support-canned-response-and-merge-tickets"]
30447
+ },
30448
+ {
30449
+ id: "focus-trap",
30450
+ name: { ko: "\uD3EC\uCEE4\uC2A4 \uD2B8\uB7A9", en: "Focus Trap" },
30451
+ category: "ui",
30452
+ relatedTechniqueIds: ["lay-bottom-sheet-modal", "spotlight-focus", "spring-bounce-modal"],
30453
+ relatedDomainIds: ["account-mfa-stepup-and-backup-codes"]
30454
+ },
30455
+ {
30456
+ id: "virtual-scrolling",
30457
+ name: { ko: "\uAC00\uC0C1 \uC2A4\uD06C\uB864", en: "Virtual Scrolling" },
30458
+ category: "ui",
30459
+ relatedTechniqueIds: ["ly-fixed-row-virtual-scroll", "ly-prepend-scroll-anchor"],
30460
+ relatedDomainIds: ["notification-chat-room-delivery-and-recall", "analytics-metric-aggregation-and-export"]
30461
+ },
30462
+ // Engineering (8)
30463
+ {
30464
+ id: "debounce",
30465
+ name: { ko: "\uB514\uBC14\uC6B4\uC2A4", en: "Debounce" },
30466
+ category: "engineering",
30467
+ relatedTechniqueIds: ["manual-search-combobox", "recoverable-search-empty-state", "search-match-highlight"],
30468
+ relatedDomainIds: ["support-faq-self-service-and-deflection"]
30469
+ },
30470
+ {
30471
+ id: "optimistic-update",
30472
+ name: { ko: "\uB099\uAD00\uC801 \uC5C5\uB370\uC774\uD2B8", en: "Optimistic Update" },
30473
+ category: "engineering",
30474
+ relatedTechniqueIds: ["toggle-reaction-picker", "heart-like-burst", "dirty-note-save-state"],
30475
+ relatedDomainIds: ["community-comment-thread-mention-and-reaction", "workspace-task-assignment-and-status"]
30476
+ },
30477
+ {
30478
+ id: "idempotency",
30479
+ name: { ko: "\uBA71\uB4F1\uC131", en: "Idempotency" },
30480
+ category: "engineering",
30481
+ relatedTechniqueIds: [],
30482
+ relatedDomainIds: [
30483
+ "fintech-wallet-ledger-idempotency-and-hold",
30484
+ "automation-webhook-retry-dead-letter-and-replay",
30485
+ "notification-channels-preferences-and-read-state"
30486
+ ]
30487
+ },
30488
+ {
30489
+ id: "role-based-access-control",
30490
+ name: { ko: "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4 (RBAC)", en: "Role-Based Access Control (RBAC)" },
30491
+ category: "engineering",
30492
+ relatedTechniqueIds: ["ly-workspace-switcher", "ly-column-visibility-table"],
30493
+ relatedDomainIds: [
30494
+ "security-rbac-role-assignment-and-least-privilege",
30495
+ "community-post-visibility-and-moderation",
30496
+ "account-organization-switch-and-membership"
30497
+ ]
30498
+ },
30499
+ {
30500
+ id: "server-sent-events",
30501
+ name: { ko: "\uC11C\uBC84 \uC804\uC1A1 \uC774\uBCA4\uD2B8 (SSE)", en: "Server-Sent Events (SSE)" },
30502
+ category: "engineering",
30503
+ relatedTechniqueIds: ["ai-streaming-text", "ui-ai-streaming-pulse"],
30504
+ relatedDomainIds: ["ai-streaming-response-and-reconnection", "notification-chat-room-delivery-and-recall"]
30505
+ },
30506
+ {
30507
+ id: "retrieval-augmented-generation",
30508
+ name: { ko: "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131 (RAG)", en: "Retrieval-Augmented Generation (RAG)" },
30509
+ category: "engineering",
30510
+ relatedTechniqueIds: ["ai-source-citation", "ai-context-pill"],
30511
+ relatedDomainIds: ["ai-rag-retrieval-and-source-attribution", "ai-prompt-context-and-token-budget"]
30512
+ },
30513
+ {
30514
+ id: "dead-letter-queue",
30515
+ name: { ko: "\uB370\uB4DC \uB808\uD130 \uD050 (DLQ)", en: "Dead-Letter Queue (DLQ)" },
30516
+ category: "engineering",
30517
+ relatedTechniqueIds: ["ly-collapsible-run-log"],
30518
+ relatedDomainIds: ["automation-webhook-retry-dead-letter-and-replay", "subscription-invoice-tax-and-payment-retry"]
30519
+ },
30520
+ {
30521
+ id: "audit-log",
30522
+ name: { ko: "\uAC10\uC0AC \uB85C\uADF8", en: "Audit Log" },
30523
+ category: "engineering",
30524
+ relatedTechniqueIds: ["ly-activity-timeline", "ly-context-code-diff"],
30525
+ relatedDomainIds: ["security-audit-log-retention-and-tamper-evidence", "file-version-replacement-and-download-audit"]
30526
+ },
30527
+ // Workflow (8)
30528
+ {
30529
+ id: "human-in-the-loop",
30530
+ name: { ko: "\uC778\uAC04 \uAC1C\uC785 \uC2B9\uC778 (HITL)", en: "Human-in-the-Loop (HITL)" },
30531
+ category: "workflow",
30532
+ relatedTechniqueIds: ["ai-human-in-the-loop", "ai-tool-call-card"],
30533
+ relatedDomainIds: ["ai-tool-calling-and-human-approval", "security-approval-maker-checker-and-breakglass"]
30534
+ },
30535
+ {
30536
+ id: "service-level-agreement",
30537
+ name: { ko: "\uC11C\uBE44\uC2A4 \uC218\uC900 \uD611\uC57D (SLA)", en: "Service-Level Agreement (SLA)" },
30538
+ category: "workflow",
30539
+ relatedTechniqueIds: ["ly-sortable-data-table", "faceted-filter-chips"],
30540
+ relatedDomainIds: ["support-sla-priority-and-escalation", "support-ticket-routing-and-resolution"]
30541
+ },
30542
+ {
30543
+ id: "know-your-customer",
30544
+ name: { ko: "\uACE0\uAC1D \uD655\uC778 \uC808\uCC28 (KYC)", en: "Know Your Customer (KYC)" },
30545
+ category: "workflow",
30546
+ relatedTechniqueIds: ["onboarding-progress-checklist", "linked-form-error-summary"],
30547
+ relatedDomainIds: ["fintech-limit-tier-kyc-and-aml-review", "marketplace-seller-onboarding-kyc-and-payout-account"]
30548
+ },
30549
+ {
30550
+ id: "user-onboarding",
30551
+ name: { ko: "\uC0AC\uC6A9\uC790 \uC628\uBCF4\uB529", en: "User Onboarding" },
30552
+ category: "workflow",
30553
+ relatedTechniqueIds: ["onboarding-progress-checklist", "horizontal-milestone-rail"],
30554
+ relatedDomainIds: ["marketplace-seller-onboarding-kyc-and-payout-account", "coding-lesson-objectives-and-practice"]
30555
+ },
30556
+ {
30557
+ id: "escrow-settlement",
30558
+ name: { ko: "\uC5D0\uC2A4\uD06C\uB85C \uC815\uC0B0", en: "Escrow Settlement" },
30559
+ category: "workflow",
30560
+ relatedTechniqueIds: ["hold-to-confirm-ring", "horizontal-milestone-rail"],
30561
+ relatedDomainIds: ["marketplace-escrow-settlement-and-dispute", "marketplace-quote-custom-offer-and-milestone"]
30562
+ },
30563
+ {
30564
+ id: "proration",
30565
+ name: { ko: "\uC77C\uD560 \uACC4\uC0B0", en: "Proration" },
30566
+ category: "workflow",
30567
+ relatedTechniqueIds: ["billing-cycle-pricing-card"],
30568
+ relatedDomainIds: ["subscription-plan-entitlement-and-billing", "subscription-seat-license-and-member-change"]
30569
+ },
30570
+ {
30571
+ id: "grace-period",
30572
+ name: { ko: "\uC720\uC608 \uAE30\uAC04", en: "Grace Period" },
30573
+ category: "workflow",
30574
+ relatedTechniqueIds: ["dismissible-inline-banner", "sticky-announcement-banner"],
30575
+ relatedDomainIds: [
30576
+ "subscription-plan-entitlement-and-billing",
30577
+ "account-auth-recovery-and-deletion",
30578
+ "security-api-key-webhook-and-secret-rotation"
30579
+ ]
30580
+ },
30581
+ {
30582
+ id: "maker-checker-approval",
30583
+ name: { ko: "\uC774\uC911 \uC2B9\uC778 (\uBA54\uC774\uCEE4-\uCCB4\uCEE4)", en: "Dual-Control Approval (Maker-Checker)" },
30584
+ category: "workflow",
30585
+ relatedTechniqueIds: ["inline-delete-confirmation", "ly-activity-timeline"],
30586
+ relatedDomainIds: [
30587
+ "security-approval-maker-checker-and-breakglass",
30588
+ "workspace-approval-stage-and-signoff",
30589
+ "recruiting-offer-approval-and-expiration"
30590
+ ]
30591
+ }
30592
+ ];
30593
+
30594
+ // ../../packages/catalog/src/glossary/ui.ts
30595
+ var UI_GLOSSARY_DATA = {
30596
+ "skeleton-loading": {
30597
+ aliases: {
30598
+ ko: ["\uC2A4\uCF08\uB808\uD1A4 UI", "\uBF08\uB300 \uD654\uBA74", "\uB85C\uB529 \uD50C\uB808\uC774\uC2A4\uD640\uB354", "\uC790\uB9AC \uC720\uC9C0 \uB85C\uB529", "\uB85C\uB529 \uC911 \uD68C\uC0C9 \uBC15\uC2A4"],
30599
+ en: ["skeleton screen", "skeleton placeholder", "loading placeholder", "shimmer skeleton", "content placeholder"]
30600
+ },
30601
+ text: {
30602
+ ko: {
30603
+ definition: "\uB370\uC774\uD130\uAC00 \uB3C4\uCC29\uD558\uAE30 \uC804 \uCD5C\uC885 \uCE74\uB4DC\uB098 \uBAA9\uB85D\uACFC \uAC19\uC740 \uD06C\uAE30\xB7\uBC30\uCE58\uC758 \uBE48 \uBF08\uB300 \uBC15\uC2A4\uB97C \uBA3C\uC800 \uBCF4\uC5EC \uC8FC\uC5B4 \uD654\uBA74\uC774 \uAC11\uC790\uAE30 \uBC00\uB9AC\uC9C0 \uC54A\uAC8C \uD558\uB294 \uB85C\uB529 \uD328\uD134\uC785\uB2C8\uB2E4.",
30604
+ example: "\uC0C1\uD488 \uBAA9\uB85D\uC744 \uBD88\uB7EC\uC624\uB294 \uB3D9\uC548 \uC378\uB124\uC77C \uC0AC\uAC01\uD615\uACFC \uB450 \uC904\uC9DC\uB9AC \uD68C\uC0C9 \uB9C9\uB300\uB97C \uC2E4\uC81C \uCE74\uB4DC \uB192\uC774 \uADF8\uB300\uB85C \uBA3C\uC800 \uB744\uC6CC \uB450\uACE0, \uB370\uC774\uD130\uAC00 \uC624\uBA74 \uAC19\uC740 \uC790\uB9AC\uC5D0\uC11C \uCF58\uD150\uCE20\uB85C \uBC14\uAFC9\uB2C8\uB2E4. UI \uB370\uBAA8\uB294 \uD615\uD0DC \uC804\uD658 \uC2DC\uC5F0\uC774\uBA70 \uC2E4\uC81C \uB124\uD2B8\uC6CC\uD06C \uC694\uCCAD\uC744 \uC218\uD589\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30605
+ promptSnippet: "\uB370\uC774\uD130 \uB85C\uB529 \uC911\uC5D0\uB294 \uCD5C\uC885 \uCF58\uD150\uCE20\uC640 \uB3D9\uC77C\uD55C \uB192\uC774\xB7\uACA9\uC790 \uBE44\uC728\uC744 \uAC00\uC9C4 \uC2A4\uCF08\uB808\uD1A4 \uD50C\uB808\uC774\uC2A4\uD640\uB354\uB97C \uBA3C\uC800 \uB80C\uB354\uB9C1\uD558\uACE0, aria-busy\uC640 \uBD80\uB4DC\uB7EC\uC6B4 \uBD88\uD22C\uBA85\uB3C4 \uB610\uB294 \uC2DC\uBA38 \uC804\uD658\uC73C\uB85C \uB808\uC774\uC544\uC6C3 \uBC00\uB9BC(CLS) \uC5C6\uC774 \uC2E4\uC81C \uCF58\uD150\uCE20\uB85C \uAD50\uCCB4\uD574 \uC918. prefers-reduced-motion\uC5D0\uC11C\uB294 \uC560\uB2C8\uBA54\uC774\uC158\uC744 \uBA48\uCDB0 \uC918."
30606
+ },
30607
+ en: {
30608
+ definition: "A loading pattern that renders low-fidelity wireframe blocks matching the final layout dimensions before data arrives, preventing sudden layout shifts.",
30609
+ example: "While a product feed fetches, show an avatar circle and two text bars inside the exact final card height, then swap them for real items in place. UI demos illustrate the visual transition without performing real network fetches.",
30610
+ promptSnippet: 'While content is loading, render skeleton placeholders matching the exact height and grid proportions of the final layout with aria-busy="true", then swap in loaded content without layout shift while respecting prefers-reduced-motion.'
30611
+ }
30612
+ }
30613
+ },
30614
+ "empty-state": {
30615
+ aliases: {
30616
+ ko: ["\uBE48 \uD654\uBA74", "\uACB0\uACFC \uC5C6\uC74C \uD654\uBA74", "\uB370\uC774\uD130 \uC5C6\uC74C \uC548\uB0B4", "\uCD08\uAE30 \uBE48 \uC0C1\uD0DC", "\uAC80\uC0C9 \uACB0\uACFC \uC5C6\uC744 \uB54C"],
30617
+ en: ["no results state", "zero state", "blank slate", "no data screen", "empty list fallback"]
30618
+ },
30619
+ text: {
30620
+ ko: {
30621
+ definition: "\uC544\uC9C1 \uC0DD\uC131\uB41C \uD56D\uBAA9\uC774 \uC5C6\uAC70\uB098 \uAC80\uC0C9\xB7\uD544\uD130 \uC870\uAC74\uC5D0 \uB9DE\uB294 \uACB0\uACFC\uAC00 0\uAC74\uC77C \uB54C, \uC774\uC720\uC640 \uB2E4\uC74C \uD589\uB3D9\uC744 \uC548\uB0B4\uD574 \uC0AC\uC6A9\uC790\uAC00 \uB9C9\uD788\uC9C0 \uC54A\uAC8C \uB3D5\uB294 UI \uC0C1\uD0DC\uC785\uB2C8\uB2E4.",
30622
+ example: '\uAC80\uC0C9\uC5B4\uC5D0 \uB9DE\uB294 \uB178\uD2B8\uAC00 \uC5C6\uC744 \uB54C \uBE48 \uC5EC\uBC31\uB9CC \uB0A8\uAE30\uB294 \uB300\uC2E0 "\uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" \uBB38\uAD6C\uC640 [\uAC80\uC0C9\uC5B4 \uC9C0\uC6B0\uAE30] \uBC84\uD2BC\uC744 \uD568\uAED8 \uB450\uC5B4 \uBC14\uB85C \uC804\uCCB4 \uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.',
30623
+ promptSnippet: "\uBAA9\uB85D\uC774\uB098 \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uBE44\uC5B4 \uC788\uC744 \uB54C \uB2E8\uC21C\uD788 \uBE48 \uD654\uBA74\uC744 \uB450\uC9C0 \uB9D0\uACE0, \uCC98\uC74C \uC0DD\uC131 \uC804\uC778\uC9C0 \uD544\uD130/\uAC80\uC0C9 \uACB0\uACFC 0\uAC74\uC778\uC9C0 \uC6D0\uC778\uC744 \uD55C \uC904\uB85C \uC54C\uB9B0 \uB4A4 [\uAC80\uC0C9 \uCD08\uAE30\uD654] \uB610\uB294 [\uC0C8 \uD56D\uBAA9 \uB9CC\uB4E4\uAE30] \uAC19\uC740 \uBCF5\uAD6C \uBC84\uD2BC\uC744 \uBC14\uB85C \uC81C\uACF5\uD574 \uC918."
30624
+ },
30625
+ en: {
30626
+ definition: "A dedicated UI state shown when a collection has no items yet or a search/filter returns zero matches, explaining why and offering a clear next action.",
30627
+ example: 'When a search finds no matching notes, show a concise "No matching results" message paired with a [Clear search] button that restores the list and returns focus to the search input.',
30628
+ promptSnippet: "Provide a purposeful empty state that distinguishes first-time creation from zero search/filter results, displays a concise status message, and includes a primary recovery action such as resetting filters or creating the first item."
30629
+ }
30630
+ }
30631
+ },
30632
+ "inline-validation": {
30633
+ aliases: {
30634
+ ko: ["\uC2E4\uC2DC\uAC04 \uC785\uB825 \uAC80\uC0AC", "\uC785\uB825\uCC3D \uC624\uB958 \uD45C\uC2DC", "\uC778\uB77C\uC778 \uC5D0\uB7EC", "\uC785\uB825 \uC544\uB798 \uBE68\uAC04 \uC548\uB0B4", "\uD3FC \uC989\uC2DC \uAC80\uC99D"],
30635
+ en: ["inline form validation", "field-level validation", "live field error", "input error feedback"]
30636
+ },
30637
+ text: {
30638
+ ko: {
30639
+ definition: "\uD3FC \uC804\uCCB4\uB97C \uC81C\uCD9C\uD558\uAE30 \uC804\uC774\uB098 \uAC01 \uC785\uB825 \uD544\uB4DC\uB97C \uBC97\uC5B4\uB09C \uC9C1\uD6C4, \uD574\uB2F9 \uC785\uB825\uCC3D \uBC14\uB85C \uC544\uB798\uC5D0 \uC624\uB958 \uC6D0\uC778\uACFC \uC218\uC815 \uC870\uAC74\uC744 \uC989\uC2DC \uD45C\uC2DC\uD558\uB294 \uAC80\uC99D \uBC29\uC2DD\uC785\uB2C8\uB2E4.",
30640
+ example: "\uD68C\uC6D0\uAC00\uC785 \uC774\uBA54\uC77C \uC785\uB825\uCC3D\uC5D0\uC11C \uD3EC\uCEE4\uC2A4\uB97C \uC62E\uAE34 \uB4A4 \uD615\uC2DD\uC774 \uD2C0\uB838\uC744 \uB54C\uB9CC \uC785\uB825\uCC3D \uC544\uB798\uC5D0 \uBE68\uAC04 \uC548\uB0B4 \uBB38\uAD6C\uC640 aria-invalid \uC0C1\uD0DC\uB97C \uB744\uC6B0\uACE0, \uC62C\uBC14\uB974\uAC8C \uACE0\uCE58\uBA74 \uBC14\uB85C \uD574\uC81C\uD569\uB2C8\uB2E4. \uC774\uB294 \uD074\uB77C\uC774\uC5B8\uD2B8 \uC785\uB825 \uC548\uB0B4\uC774\uBA70 \uC2E4\uC81C \uC11C\uBC84 \uC911\uBCF5 \uD655\uC778\uC774\uB098 \uBCF4\uC548 \uAC80\uC99D\uC744 \uB300\uCCB4\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30641
+ promptSnippet: "\uC785\uB825 \uD544\uB4DC\uB294 \uCCAB blur \uB610\uB294 \uC81C\uCD9C \uC2DC\uC810\uBD80\uD130 \uC720\uD6A8\uC131\uC744 \uAC80\uC0AC\uD574 \uC624\uB958 \uBB38\uAD6C\uB97C \uC785\uB825\uCC3D \uBC14\uB85C \uC544\uB798\uC5D0 \uD45C\uC2DC\uD558\uACE0 aria-invalid \uBC0F aria-describedby\uB85C \uC5F0\uACB0\uD574 \uC918. \uC218\uC815 \uC911 \uC624\uB958\uAC00 \uD574\uC18C\uB418\uBA74 \uC989\uC2DC \uC815\uC0C1 \uC0C1\uD0DC\uB85C \uBCF5\uAD6C\uD558\uB418, \uD0C0\uC774\uD551 \uCCAB \uAE00\uC790\uBD80\uD130 \uC131\uAE09\uD788 \uACBD\uACE0\uB97C \uB744\uC6B0\uC9C0 \uB9C8."
30642
+ },
30643
+ en: {
30644
+ definition: "Field-level validation that displays error reasons and fix guidance directly beside or beneath the relevant input after blur or submission rather than waiting for a separate error page.",
30645
+ example: "Wait until a user blurs the email field before showing an inline format error linked via aria-describedby, then clear the error immediately once corrected. Client-side checks improve usability and never replace real server-side validation.",
30646
+ promptSnippet: "Validate each input on blur or submit (not prematurely on the first keystroke), render concise error text directly below the field linked with aria-invalid and aria-describedby, and clear it immediately when fixed."
30647
+ }
30648
+ }
30649
+ },
30650
+ "progressive-disclosure": {
30651
+ aliases: {
30652
+ ko: ["\uB2E8\uACC4\uC801 \uC815\uBCF4 \uB178\uCD9C", "\uD544\uC694\uD560 \uB54C \uD3BC\uCE58\uAE30", "\uC544\uCF54\uB514\uC5B8 \uD3BC\uCE68", "\uACE0\uAE09 \uC635\uC158 \uC811\uAE30", "\uC815\uBCF4 \uACC4\uCE35\uD654"],
30653
+ en: ["gradual reveal", "expandable details", "on-demand details", "collapsible details", "layered disclosure"]
30654
+ },
30655
+ text: {
30656
+ ko: {
30657
+ definition: "\uCC98\uC74C\uC5D0\uB294 \uD575\uC2EC \uC815\uBCF4\uC640 \uAE30\uBCF8 \uC870\uC791\uB9CC \uAC04\uACB0\uD558\uAC8C \uBCF4\uC5EC \uC8FC\uACE0, \uC138\uBD80 \uC124\uBA85\xB7\uACE0\uAE09 \uC124\uC815\xB7\uBD80\uC18D \uD56D\uBAA9\uC740 \uC0AC\uC6A9\uC790\uAC00 \uC694\uCCAD\uD560 \uB54C \uD3BC\uCCD0 \uBCF4\uC5EC \uC8FC\uB294 \uC815\uBCF4 \uC124\uACC4 \uC6D0\uCE59\uC785\uB2C8\uB2E4.",
30658
+ example: "\uC8FC\uBB38 \uD45C\uC5D0\uC11C\uB294 \uC8FC\uBB38\uBC88\uD638\uC640 \uC0C1\uD0DC\uB9CC \uAE30\uBCF8 \uD589\uC5D0 \uD45C\uC2DC\uD558\uACE0, \uC0C1\uC138 \uD589 \uD655\uC7A5 \uBC84\uD2BC\uC744 \uB20C\uB800\uC744 \uB54C\uB9CC \uBC30\uC1A1\uC9C0\xB7\uACB0\uC81C \uC218\uB2E8\xB7\uCC98\uB9AC \uC774\uB825\uC744 \uC544\uB798\uB85C \uD3BC\uCCD0 \uD654\uBA74 \uBCF5\uC7A1\uB3C4\uB97C \uB0AE\uCDA5\uB2C8\uB2E4.",
30659
+ promptSnippet: "\uCD08\uAE30 \uD654\uBA74\uC5D0\uB294 \uD575\uC2EC \uC815\uBCF4\uC640 \uC8FC\uC694 \uC561\uC158\uB9CC \uB178\uCD9C\uD558\uACE0, \uBD80\uAC00 \uC124\uBA85\uC774\uB098 \uACE0\uAE09 \uC635\uC158\uC740 native button \uD1A0\uAE00(aria-expanded, aria-controls)\uB85C \uD544\uC694\uD560 \uB54C\uB9CC \uD3BC\uCCD0\uC9C0\uB3C4\uB85D \uC810\uC9C4\uC801 \uACF5\uAC1C \uAD6C\uC870\uB85C \uAD6C\uC131\uD574 \uC918."
30660
+ },
30661
+ en: {
30662
+ definition: "An interaction principle that shows only essential options upfront and reveals secondary details or advanced settings only when the user asks for them.",
30663
+ example: "Show order ID and status in each summary row, and expand shipping address and item breakdown only when the user toggles the row disclosure button.",
30664
+ promptSnippet: "Keep the default view focused on primary information and reveal secondary details or advanced controls on demand using accessible disclosure toggles (aria-expanded and aria-controls)."
30665
+ }
30666
+ }
30667
+ },
30668
+ "toast-and-snackbar": {
30669
+ aliases: {
30670
+ ko: ["\uD1A0\uC2A4\uD2B8 \uC54C\uB9BC", "\uC2A4\uB0B5\uBC14 \uC54C\uB9BC", "\uC2E4\uD589 \uCDE8\uC18C \uBC30\uB108", "\uC7A0\uAE50 \uB728\uB294 \uC54C\uB9BC", "\uD558\uB2E8 \uC54C\uB9BC \uBC14"],
30671
+ en: ["toast notification", "snackbar", "undo snackbar", "ephemeral notification", "status toast"]
30672
+ },
30673
+ text: {
30674
+ ko: {
30675
+ definition: "\uC0AC\uC6A9\uC790 \uC791\uC5C5\uC758 \uACB0\uACFC\uB098 \uC9E7\uC740 \uC0C1\uD0DC \uBCC0\uD654\uB97C \uD604\uC7AC \uD654\uBA74 \uD750\uB984\uC744 \uB04A\uC9C0 \uC54A\uACE0 \uD654\uBA74 \uBAA8\uC11C\uB9AC\uC5D0 \uC7A0\uAE50 \uB744\uC6CC \uC54C\uB9AC\uAC70\uB098 \uC2E4\uD589 \uCDE8\uC18C \uC561\uC158\uC744 \uC81C\uACF5\uD558\uB294 \uC77C\uC2DC\uC801 \uD53C\uB4DC\uBC31 \uCEF4\uD3EC\uB10C\uD2B8\uC785\uB2C8\uB2E4.",
30676
+ example: '\uBB38\uC11C\uB97C \uBCF4\uAD00\uD568\uC73C\uB85C \uC62E\uAE34 \uC9C1\uD6C4 \uD558\uB2E8\uC5D0 "\uBB38\uC11C 1\uAC74\uC744 \uBCF4\uAD00\uD588\uC2B5\uB2C8\uB2E4 [\uC2E4\uD589 \uCDE8\uC18C]" \uC2A4\uB0B5\uBC14\uB97C \uB744\uC6CC \uC791\uC5C5\uC744 \uD655\uC778\uC2DC\uCF1C \uC8FC\uACE0, \uC2E4\uC218\uD55C \uACBD\uC6B0 \uBC14\uB85C \uB418\uB3CC\uB9B4 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.',
30677
+ promptSnippet: '\uC791\uC5C5 \uC644\uB8CC\uB098 \uB418\uB3CC\uB9AC\uAE30 \uAC00\uB2A5\uD55C \uC0AD\uC81C \uD53C\uB4DC\uBC31\uC740 \uBAA8\uB2EC\uB85C \uD750\uB984\uC744 \uB9C9\uC9C0 \uB9D0\uACE0 role="status"\uB97C \uAC16\uCD98 \uD1A0\uC2A4\uD2B8/\uC2A4\uB0B5\uBC14\uB85C \uD45C\uC2DC\uD574 \uC918. \uC2E4\uD589 \uCDE8\uC18C \uBC84\uD2BC\uC774 \uC788\uB2E4\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uC640 \uCDA9\uBD84\uD55C \uB300\uAE30 \uC2DC\uAC04\uC744 \uBCF4\uC7A5\uD574 \uC918.'
30678
+ },
30679
+ en: {
30680
+ definition: "A non-blocking temporary banner or floating message used to confirm an action or offer an immediate Undo option without interrupting the user\u2019s current flow.",
30681
+ example: 'After archiving a document, display a bottom snackbar saying "Archived 1 document" with an [Undo] button instead of interrupting with a full-screen dialog.',
30682
+ promptSnippet: 'Surface non-blocking action confirmations as a toast or snackbar inside an accessible live region (role="status"), ensuring any Undo action remains keyboard-reachable before dismissal.'
30683
+ }
30684
+ }
30685
+ },
30686
+ "command-palette": {
30687
+ aliases: {
30688
+ ko: ["\uBA85\uB839 \uD314\uB808\uD2B8", "\uBE60\uB978 \uC2E4\uD589\uCC3D", "\uB2E8\uCD95\uD0A4 \uAC80\uC0C9\uCC3D", "Cmd+K \uBA54\uB274", "\uC2AC\uB798\uC2DC \uBA85\uB839\uCC3D"],
30689
+ en: ["quick launcher", "command menu", "Cmd+K palette", "action switcher", "slash command menu"]
30690
+ },
30691
+ text: {
30692
+ ko: {
30693
+ definition: "\uD0A4\uBCF4\uB4DC \uB2E8\uCD95\uD0A4(\uC608: Cmd/Ctrl+K)\uB098 `/` \uC785\uB825\uC73C\uB85C \uC5F4\uC5B4 \uD398\uC774\uC9C0 \uC774\uB3D9, \uAC80\uC0C9, \uAE30\uB2A5 \uC2E4\uD589\uC744 \uB9C8\uC6B0\uC2A4 \uC5C6\uC774 \uBE60\uB974\uAC8C \uCC98\uB9AC\uD558\uB294 \uD1B5\uD569 \uAC80\uC0C9\uD615 \uBA85\uB839\uCC3D\uC785\uB2C8\uB2E4.",
30694
+ example: '\uD611\uC5C5 \uD234\uC5D0\uC11C \uC5B4\uB290 \uD654\uBA74\uC5D0 \uC788\uB4E0 Cmd+K\uB97C \uB20C\uB7EC "\uB2E4\uD06C \uBAA8\uB4DC \uC804\uD658", "\uC0C8 \uBB38\uC11C \uB9CC\uB4E4\uAE30", "\uCD5C\uADFC \uD504\uB85C\uC81D\uD2B8 \uC5F4\uAE30"\uB97C \uBC14\uB85C \uAC80\uC0C9\uD558\uACE0 Enter\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4.',
30695
+ promptSnippet: "Cmd/Ctrl+K\uB85C \uC5EC\uB2EB\uC744 \uC218 \uC788\uB294 \uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8\uB97C \uB9CC\uB4E4\uACE0, \uAC80\uC0C9 \uC785\uB825\uACFC \uBC29\uD5A5\uD0A4(ArrowUp/ArrowDown)\xB7Enter \uC120\uD0DD\xB7Escape \uB2EB\uAE30\xB7\uD3EC\uCEE4\uC2A4 \uBCF5\uADC0\uB97C \uBAA8\uB450 \uD0A4\uBCF4\uB4DC\uB9CC\uC73C\uB85C \uC870\uC791\uD560 \uC218 \uC788\uAC8C \uAD6C\uD604\uD574 \uC918."
30696
+ },
30697
+ en: {
30698
+ definition: "A keyboard-first modal launcher (typically opened via Cmd/Ctrl+K or `/`) that lets users search and trigger navigation, settings, or actions from anywhere.",
30699
+ example: 'Press Cmd+K inside a workspace app to filter commands like "Switch theme" or "Open project" and execute them immediately with Enter.',
30700
+ promptSnippet: "Build a keyboard-accessible command palette triggered by Cmd/Ctrl+K with live query filtering, ArrowUp/ArrowDown item navigation, Enter execution, Escape dismissal, and focus restoration."
30701
+ }
30702
+ }
30703
+ },
30704
+ "focus-trap": {
30705
+ aliases: {
30706
+ ko: ["\uD3EC\uCEE4\uC2A4 \uAC00\uB450\uAE30", "\uBAA8\uB2EC \uD3EC\uCEE4\uC2A4 \uAD00\uB9AC", "\uD0A4\uBCF4\uB4DC \uCD08\uC810 \uACE0\uC815", "\uBAA8\uB2EC \uBC16\uC73C\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uD0C8 \uBC29\uC9C0"],
30707
+ en: ["focus containment", "modal focus lock", "dialog focus management", "keyboard focus trap"]
30708
+ },
30709
+ text: {
30710
+ ko: {
30711
+ definition: "\uBAA8\uB2EC \uB2E4\uC774\uC5BC\uB85C\uADF8\uB098 \uB4DC\uB85C\uC5B4\uAC00 \uC5F4\uB824 \uC788\uB294 \uB3D9\uC548 Tab \uD0A4 \uC774\uB3D9\uC774 \uBC30\uACBD \uD654\uBA74\uC73C\uB85C \uBE60\uC838\uB098\uAC00\uC9C0 \uC54A\uACE0 \uB2E4\uC774\uC5BC\uB85C\uADF8 \uB0B4\uBD80 \uC694\uC18C\uB4E4 \uC0AC\uC774\uC5D0\uC11C\uB9CC \uC21C\uD658\uD558\uB3C4\uB85D \uC81C\uD55C\uD558\uACE0, \uB2EB\uD790 \uB54C \uC6D0\uB798 \uBC84\uD2BC\uC73C\uB85C \uD3EC\uCEE4\uC2A4\uB97C \uB3CC\uB824\uC8FC\uB294 \uC811\uADFC\uC131 \uAE30\uBC95\uC785\uB2C8\uB2E4.",
30712
+ example: "\uC0AD\uC81C \uD655\uC778 \uBAA8\uB2EC\uC744 \uC5F4\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uBAA8\uB2EC \uB0B4\uBD80\uB85C \uB4E4\uC5B4\uC624\uACE0 \uBC30\uACBD \uBC84\uD2BC\uC740 \uBE44\uD65C\uC131\uD654\uB418\uBA70, Escape\uB098 \uB2EB\uAE30\uB97C \uB204\uB974\uBA74 \uCC98\uC74C \uBAA8\uB2EC\uC744 \uC5F4\uC5C8\uB358 \uBC84\uD2BC\uC73C\uB85C \uCD08\uC810\uC774 \uB418\uB3CC\uC544\uAC11\uB2C8\uB2E4.",
30713
+ promptSnippet: "\uBAA8\uB2EC\uC774\uB098 \uC2DC\uD2B8 \uB2E4\uC774\uC5BC\uB85C\uADF8\uB97C \uAD6C\uD604\uD560 \uB54C native <dialog> showModal() \uB610\uB294 \uD3EC\uCEE4\uC2A4 \uD2B8\uB7A9\uC744 \uC801\uC6A9\uD574 Tab \uD0A4\uAC00 \uBC30\uACBD\uC73C\uB85C \uC0C8\uC9C0 \uC54A\uAC8C \uD558\uACE0, Escape\xB7\uB2EB\uAE30 \uBC84\uD2BC \uC9C0\uC6D0\uACFC \uD568\uAED8 \uB2EB\uD78C \uB4A4 \uD2B8\uB9AC\uAC70 \uC694\uC18C\uB85C \uD3EC\uCEE4\uC2A4\uB97C \uBCF5\uADC0\uC2DC\uCF1C \uC918."
30714
+ },
30715
+ en: {
30716
+ definition: "An accessibility pattern that keeps Tab/Shift+Tab keyboard focus inside an active modal dialog or drawer and returns focus to the triggering element when closed.",
30717
+ example: "Opening a confirmation dialog traps keyboard navigation inside the modal controls; pressing Escape closes it and restores focus to the button that opened it.",
30718
+ promptSnippet: "Use native <dialog> showModal() or an explicit focus trap so Tab navigation stays inside the open modal, support Escape and explicit close controls, and restore focus to the original trigger on close."
30719
+ }
30720
+ }
30721
+ },
30722
+ "virtual-scrolling": {
30723
+ aliases: {
30724
+ ko: ["\uBAA9\uB85D \uAC00\uC0C1\uD654", "\uC708\uB3C4\uC789", "\uB300\uC6A9\uB7C9 \uB9AC\uC2A4\uD2B8 \uCD5C\uC801\uD654", "\uBCF4\uC774\uB294 \uC601\uC5ED\uB9CC \uB80C\uB354\uB9C1"],
30725
+ en: ["list virtualization", "windowing", "virtual list", "windowed rendering"]
30726
+ },
30727
+ text: {
30728
+ ko: {
30729
+ definition: "\uC218\uCC9C~\uC218\uB9CC \uAC74\uC758 \uAE34 \uBAA9\uB85D\uC5D0\uC11C \uC804\uCCB4 \uC2A4\uD06C\uB864 \uB192\uC774\uB9CC \uC720\uC9C0\uD55C \uCC44 \uD604\uC7AC \uD654\uBA74 \uBDF0\uD3EC\uD2B8\uC640 \uC57D\uAC04\uC758 \uC5EC\uC720(overscan) \uBC94\uC704\uC5D0 \uB4E4\uC5B4\uC628 \uD589\uB9CC DOM\uC5D0 \uB80C\uB354\uB9C1\uD574 \uC131\uB2A5\uC744 \uC9C0\uD0A4\uB294 \uAE30\uBC95\uC785\uB2C8\uB2E4.",
30730
+ example: "10,000\uAC74\uC758 \uB85C\uADF8 \uBAA9\uB85D\uC744 \uD55C \uBC88\uC5D0 DOM\uC5D0 \uC62C\uB9AC\uB294 \uB300\uC2E0 \uD604\uC7AC \uBCF4\uC774\uB294 15\uD589\uACFC \uC704\uC544\uB798 \uC5EC\uC720 10\uD589\uB9CC \uB9C8\uC6B4\uD2B8\uD574 \uC2A4\uD06C\uB864 \uBC84\uBC85\uC784\uC744 \uC904\uC785\uB2C8\uB2E4.",
30731
+ promptSnippet: "\uD589 \uC218\uAC00 \uB9CE\uC740 \uAE34 \uBAA9\uB85D\uC5D0\uB294 \uC804\uCCB4 \uC2A4\uD06C\uB864 \uB192\uC774\uB97C \uBE48 \uC2A4\uD398\uC774\uC11C\uB85C \uC720\uC9C0\uD558\uBA74\uC11C \uD604\uC7AC \uBDF0\uD3EC\uD2B8 \uC8FC\uBCC0\uACFC overscan \uD589\uB9CC DOM\uC5D0 \uB80C\uB354\uB9C1\uD558\uB294 \uAC00\uC0C1 \uC2A4\uD06C\uB864\uC744 \uC801\uC6A9\uD558\uACE0, aria-setsize\uC640 aria-posinset\uC73C\uB85C \uC804\uCCB4 \uC21C\uBC88\uC744 \uC720\uC9C0\uD574 \uC918."
30732
+ },
30733
+ en: {
30734
+ definition: "A rendering optimization that preserves full scroll height while mounting only the visible rows plus a small overscan buffer in the DOM.",
30735
+ example: "Instead of rendering 10,000 chat or log rows at once, mount only the ~25 rows near the current scroll position while keeping native scrollbar proportions accurate.",
30736
+ promptSnippet: "Virtualize large lists by mounting only visible rows plus an overscan buffer between top/bottom spacer elements, preserving exact scroll height and aria-setsize/aria-posinset semantics."
30737
+ }
30738
+ }
30739
+ }
30740
+ };
30741
+
30742
+ // ../../packages/catalog/src/glossary/engineering.ts
30743
+ var ENGINEERING_GLOSSARY_DATA = {
30744
+ debounce: {
30745
+ aliases: {
30746
+ ko: ["\uB514\uBC14\uC6B4\uC2F1", "\uC785\uB825 \uC9C0\uC5F0 \uD638\uCD9C", "\uD0C0\uC790 \uBA48\uCD98 \uB4A4 \uAC80\uC0C9", "\uC5F0\uC18D \uC785\uB825 \uBB36\uAE30", "API \uD638\uCD9C \uD69F\uC218 \uC904\uC774\uAE30"],
30747
+ en: ["debouncing", "input delay", "trailing debounce", "search input throttling"]
30748
+ },
30749
+ text: {
30750
+ ko: {
30751
+ definition: "\uC5F0\uC18D\uD574\uC11C \uBE60\uB974\uAC8C \uBC1C\uC0DD\uD558\uB294 \uC774\uBCA4\uD2B8\uAC00 \uC77C\uC815 \uC2DC\uAC04 \uB3D9\uC548 \uBA48\uCD98 \uB4A4 \uB9C8\uC9C0\uB9C9 \uD55C \uBC88\uB9CC \uC2E4\uC81C \uD568\uC218\uB97C \uC2E4\uD589\uD558\uB3C4\uB85D \uC9C0\uC5F0\uC2DC\uD0A4\uB294 \uC81C\uC5B4 \uAE30\uBC95\uC785\uB2C8\uB2E4.",
30752
+ example: '\uAC80\uC0C9\uCC3D\uC5D0 "\uC2A4\uCF08\uB808\uD1A4"\uC744 \uC785\uB825\uD558\uB294 \uB3D9\uC548 \uAE00\uC790\uB9C8\uB2E4 \uC11C\uBC84 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uC9C0 \uC54A\uACE0, \uC785\uB825\uC774 250ms \uBA48\uCD98 \uB4A4 \uD55C \uBC88\uB9CC \uAC80\uC0C9 API\uB97C \uD638\uCD9C\uD558\uBA70 \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uB300\uAE30 \uD0C0\uC774\uBA38\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4.',
30753
+ promptSnippet: "\uAC80\uC0C9 \uC785\uB825\uC774\uB098 \uC790\uB3D9 \uC800\uC7A5 \uC774\uBCA4\uD2B8\uC5D0\uB294 \uC785\uB825\uC774 \uC77C\uC815 \uC2DC\uAC04(\uC608: 250ms) \uBA48\uCD98 \uB4A4 \uB9C8\uC9C0\uB9C9 \uAC12\uC73C\uB85C\uB9CC \uC2E4\uD589\uB418\uB3C4\uB85D \uB514\uBC14\uC6B4\uC2A4\uB97C \uC801\uC6A9\uD558\uACE0, \uC774\uC804 \uB300\uAE30 \uD0C0\uC774\uBA38\uC640 \uCDE8\uC18C \uAC00\uB2A5\uD55C \uBE44\uB3D9\uAE30 \uC694\uCCAD\uC740 \uC5B8\uB9C8\uC6B4\uD2B8\uB098 \uC0C8 \uC785\uB825 \uC2DC \uC815\uB9AC\uD574 \uC918."
30754
+ },
30755
+ en: {
30756
+ definition: "A rate-control technique that delays execution until a burst of rapid events settles for a specified quiet window, running only once with the latest input.",
30757
+ example: "Rather than firing an API call on every keystroke while typing a search query, wait 250ms after the last keystroke and cancel pending timers on unmount.",
30758
+ promptSnippet: "Debounce high-frequency handlers like search inputs or autosave (e.g., 250ms quiet window) so only the final value triggers work, and clean up pending timers or stale requests on unmount or newer input."
30759
+ }
30760
+ }
30761
+ },
30762
+ "optimistic-update": {
30763
+ aliases: {
30764
+ ko: ["\uB099\uAD00\uC801 UI", "\uC120\uBC18\uC601 \uD6C4\uB3D9\uAE30\uD654", "\uC11C\uBC84 \uC751\uB2F5 \uC804\uC5D0 \uD654\uBA74 \uBA3C\uC800 \uBC14\uAFB8\uAE30", "\uC989\uC2DC \uBC18\uC601 \uD6C4 \uC2E4\uD328 \uC2DC \uBCF5\uAD6C"],
30765
+ en: ["optimistic UI", "optimistic rendering", "instant UI update with rollback"]
30766
+ },
30767
+ text: {
30768
+ ko: {
30769
+ definition: "\uC11C\uBC84 \uC694\uCCAD\uC774 \uC131\uACF5\uD560 \uAC83\uC774\uB77C\uACE0 \uAC00\uC815\uD574 UI \uC0C1\uD0DC\uB97C \uBA3C\uC800 \uC989\uC2DC \uBC18\uC601\uD558\uACE0, \uC2E4\uC81C \uC694\uCCAD\uC774 \uC2E4\uD328\uD558\uBA74 \uC774\uC804 \uC0C1\uD0DC\uB85C \uB418\uB3CC\uB9AC\uACE0 \uC624\uB958\uB97C \uC548\uB0B4\uD558\uB294 \uAC31\uC2E0 \uD328\uD134\uC785\uB2C8\uB2E4.",
30770
+ example: "\uB313\uAE00 \uC88B\uC544\uC694 \uBC84\uD2BC\uC744 \uB204\uB974\uBA74 \uC989\uC2DC \uD65C\uC131 \uC0C1\uD0DC\uC640 +1\uC744 \uD45C\uC2DC\uD55C \uB4A4 \uC11C\uBC84\uC5D0 \uC800\uC7A5 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0, \uB124\uD2B8\uC6CC\uD06C\uAC00 \uC2E4\uD328\uD558\uBA74 \uC6D0\uB798 \uC22B\uC790\uB85C \uB864\uBC31\uD569\uB2C8\uB2E4. \uC815\uC801 UI \uB370\uBAA8\uB294 \uB85C\uCEEC \uC0C1\uD0DC \uC804\uD658\uB9CC \uC2DC\uC5F0\uD558\uBA70 \uC2E4\uC81C \uC11C\uBC84 \uB864\uBC31\uC744 \uAD6C\uD604\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30771
+ promptSnippet: "\uC88B\uC544\uC694 \uD1A0\uAE00\uC774\uB098 \uC791\uC5C5 \uC0C1\uD0DC \uBCC0\uACBD\uCC98\uB7FC \uCCB4\uAC10 \uC18D\uB3C4\uAC00 \uC911\uC694\uD55C \uC561\uC158\uC5D0\uB294 \uB099\uAD00\uC801 \uC5C5\uB370\uC774\uD2B8\uB97C \uC801\uC6A9\uD574 UI\uB97C \uBA3C\uC800 \uAC31\uC2E0\uD558\uACE0, \uC2E4\uC81C API \uC694\uCCAD\uC774 \uC2E4\uD328\uD558\uBA74 \uC9C1\uC804 \uC2A4\uB0C5\uC0F7\uC73C\uB85C \uB864\uBC31\uD55C \uB4A4 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC624\uB958 \uC548\uB0B4\uB97C \uD45C\uC2DC\uD574 \uC918."
30772
+ },
30773
+ en: {
30774
+ definition: "An update pattern that immediately applies the expected UI change before the server responds, then confirms on success or rolls back with an error if the request fails.",
30775
+ example: "Toggling a heart reaction highlights the button right away while the save request is in flight, rolling back the count if the server rejects it. Static UI demos only toggle local state without real persistence.",
30776
+ promptSnippet: "Apply optimistic updates for responsive interactions like reactions or status toggles by updating local state immediately, keeping a previous snapshot to roll back on API failure, and surfacing a clear error."
30777
+ }
30778
+ }
30779
+ },
30780
+ idempotency: {
30781
+ aliases: {
30782
+ ko: ["\uBA71\uB4F1\uC131 \uD0A4", "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0", "\uC911\uBCF5 \uACB0\uC81C \uB9C9\uAE30", "\uC911\uBCF5 \uC694\uCCAD \uBC29\uC9C0", "\uC7AC\uC2DC\uB3C4 \uC548\uC804\uC131"],
30783
+ en: ["idempotency key", "duplicate request prevention", "prevent double charge", "safe retry"]
30784
+ },
30785
+ text: {
30786
+ ko: {
30787
+ definition: "\uAC19\uC740 \uC694\uCCAD\uC744 \uB124\uD2B8\uC6CC\uD06C \uC7AC\uC2DC\uB3C4\uB098 \uB354\uBE14 \uD074\uB9AD\uC73C\uB85C \uC5EC\uB7EC \uBC88 \uBCF4\uB0B4\uB354\uB77C\uB3C4 \uC11C\uBC84 \uC0C1\uD0DC\uAC00 \uCC98\uC74C \uD55C \uBC88 \uCC98\uB9AC\uB41C \uAC83\uACFC \uB3D9\uC77C\uD558\uAC8C \uC720\uC9C0\uB418\uB294 \uC131\uC9C8\uC785\uB2C8\uB2E4.",
30788
+ example: "\uACB0\uC81C \uC694\uCCAD\uB9C8\uB2E4 \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uACE0\uC720\uD55C Idempotency-Key\uB97C \uD568\uAED8 \uBCF4\uB0B4\uBA74, \uD0C0\uC784\uC544\uC6C3 \uD6C4 \uC7AC\uC804\uC1A1\uD558\uB354\uB77C\uB3C4 \uC11C\uBC84\uAC00 \uC774\uBBF8 \uCC98\uB9AC\uB41C \uB3D9\uC77C \uD0A4\uB97C \uAC10\uC9C0\uD574 \uB450 \uBC88 \uCD9C\uAE08\uD558\uC9C0 \uC54A\uACE0 \uAE30\uC874 \uACB0\uACFC\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. \uC774\uB294 \uC11C\uBC84\xB7\uC6D0\uC7A5 \uC124\uACC4 \uC6D0\uCE59\uC774\uBA70 \uB2E8\uC21C UI \uBC84\uD2BC \uBE44\uD65C\uC131\uD654\uB9CC\uC73C\uB85C\uB294 \uBCF4\uC7A5\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
30789
+ promptSnippet: "\uACB0\uC81C\xB7\uCD9C\uAE08\xB7\uC6F9\uD6C5 \uC7AC\uC2E4\uD589 \uB4F1 \uC911\uBCF5 \uC2E4\uD589\uB418\uBA74 \uC548 \uB418\uB294 \uBCC0\uACBD API\uC5D0\uB294 \uC694\uCCAD\uBCC4 \uACE0\uC720 idempotency key\uB97C \uC800\uC7A5\xB7\uAC80\uC99D\uD574 \uB3D9\uC77C \uD0A4\uC758 \uC7AC\uC2DC\uB3C4\uAC00 \uAE30\uC874 \uCC98\uB9AC \uACB0\uACFC\uB97C \uBC18\uD658\uD558\uB3C4\uB85D \uAD6C\uD604\uD558\uACE0, UI \uBC84\uD2BC \uC81C\uC5B4\uB9CC\uC73C\uB85C \uC911\uBCF5\uC744 \uB9C9\uC73C\uB824 \uD558\uC9C0 \uB9C8."
30790
+ },
30791
+ en: {
30792
+ definition: "A property ensuring that repeating the exact same operation\u2014due to retries, timeouts, or double clicks\u2014produces the same state as executing it once.",
30793
+ example: "Attaching a unique Idempotency-Key per checkout attempt lets the backend recognize retried requests and return the original receipt instead of charging twice. UI button disabling alone cannot guarantee idempotency.",
30794
+ promptSnippet: "Protect critical mutations such as payments, payouts, or webhook replays on the server using unique idempotency keys persisted atomically with the transaction, returning the original outcome on duplicate attempts."
30795
+ }
30796
+ }
30797
+ },
30798
+ "role-based-access-control": {
30799
+ aliases: {
30800
+ ko: ["RBAC", "\uC5ED\uD560 \uAE30\uBC18 \uAD8C\uD55C", "\uAD8C\uD55C \uC81C\uC5B4", "\uAD00\uB9AC\uC790 \uC77C\uBC18 \uC0AC\uC6A9\uC790 \uAD8C\uD55C \uBD84\uB9AC", "\uCD5C\uC18C \uAD8C\uD55C"],
30801
+ en: ["RBAC", "role based access control", "role permissions", "least privilege access"]
30802
+ },
30803
+ text: {
30804
+ ko: {
30805
+ definition: "\uAC1C\uBCC4 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C1\uC811 \uAD8C\uD55C\uC744 \uBD99\uC774\uB294 \uB300\uC2E0 \uAD00\uB9AC\uC790\xB7\uD3B8\uC9D1\uC790\xB7\uC5F4\uB78C\uC790 \uAC19\uC740 \uC5ED\uD560(Role)\uC5D0 \uAD8C\uD55C\uC744 \uBB36\uC5B4 \uBD80\uC5EC\uD558\uACE0, \uC11C\uBC84\uC640 UI\uC5D0\uC11C \uC5ED\uD560\uC5D0 \uB530\uB77C \uC811\uADFC\uC744 \uD1B5\uC81C\uD558\uB294 \uBC29\uC2DD\uC785\uB2C8\uB2E4.",
30806
+ example: "\uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4\uC5D0\uC11C \uC5F4\uB78C\uC790 \uC5ED\uD560\uC740 \uBB38\uC11C\uB97C \uC77D\uC744 \uC218\uB9CC \uC788\uACE0 \uACB0\uC81C \uC124\uC815\uC774\uB098 \uAD6C\uC131\uC6D0 \uC0AD\uC81C API\uB294 \uC11C\uBC84\uC5D0\uC11C 403\uC73C\uB85C \uCC28\uB2E8\uD569\uB2C8\uB2E4. UI\uC5D0\uC11C \uBA54\uB274\uB97C \uC228\uAE30\uB294 \uAC83\uC740 \uBCF4\uC870 \uC218\uB2E8\uC77C \uBFD0 \uC2E4\uC81C \uAD8C\uD55C \uD1B5\uC81C\uB294 \uC11C\uBC84 \uC778\uAC00\uC5D0\uC11C \uAC15\uC81C\uD569\uB2C8\uB2E4.",
30807
+ promptSnippet: "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4(RBAC)\uB97C \uC124\uACC4\uD560 \uB54C \uC5ED\uD560\uBCC4 \uD5C8\uC6A9 \uC561\uC158 \uB9E4\uD2B8\uB9AD\uC2A4\uC640 \uCD5C\uC18C \uAD8C\uD55C \uC6D0\uCE59\uC744 \uC815\uC758\uD558\uACE0, UI \uB178\uCD9C \uC81C\uC5B4\uC640 \uBCC4\uAC1C\uB85C \uBAA8\uB4E0 \uC11C\uBC84 API \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uC5D0\uC11C \uD604\uC7AC \uC870\uC9C1\xB7\uC5ED\uD560 \uAD8C\uD55C\uC744 \uAC80\uC99D\uD574 \uC918. \uB9C8\uC9C0\uB9C9 \uCD5C\uACE0\uAD00\uB9AC\uC790 \uAC15\uB4F1\xB7\uC0AD\uC81C\uB3C4 \uCC28\uB2E8\uD574 \uC918."
30808
+ },
30809
+ en: {
30810
+ definition: "An authorization model that assigns permissions to roles (such as Admin, Editor, Viewer) rather than individual users, enforcing access boundaries across APIs and views.",
30811
+ example: "A Viewer can read workspace documents while billing mutations are rejected with 403 on the backend. Hiding buttons in the UI is only cosmetic; real enforcement lives in server authorization.",
30812
+ promptSnippet: "Implement Role-Based Access Control (RBAC) with explicit role-permission mappings and least-privilege defaults, enforcing checks on every backend endpoint (not just hiding UI controls) and guarding against removing the last admin."
30813
+ }
30814
+ }
30815
+ },
30816
+ "server-sent-events": {
30817
+ aliases: {
30818
+ ko: ["SSE", "\uB2E8\uBC29\uD5A5 \uC11C\uBC84 \uC2A4\uD2B8\uB9AC\uBC0D", "\uC2E4\uC2DC\uAC04 \uD1A0\uD070 \uC2A4\uD2B8\uB9AC\uBC0D", "EventSource \uC2A4\uD2B8\uB9BC"],
30819
+ en: ["SSE", "EventSource", "HTTP streaming", "unidirectional server push"]
30820
+ },
30821
+ text: {
30822
+ ko: {
30823
+ definition: "\uD558\uB098\uC758 HTTP \uC5F0\uACB0\uC744 \uC720\uC9C0\uD55C \uCC44 \uC11C\uBC84\uAC00 \uD074\uB77C\uC774\uC5B8\uD2B8\uB85C \uD14D\uC2A4\uD2B8 \uC774\uBCA4\uD2B8 \uC2A4\uD2B8\uB9BC\uC744 \uB2E8\uBC29\uD5A5\uC73C\uB85C \uC2E4\uC2DC\uAC04 \uBC00\uC5B4\uC8FC\uB294 \uC6F9 \uD45C\uC900 \uAE30\uC220\uC785\uB2C8\uB2E4.",
30824
+ example: "AI \uCC57\uBD07 \uB2F5\uBCC0\uC774 \uC0DD\uC131\uB418\uB294 \uB300\uB85C \uD1A0\uD070 \uC870\uAC01\uC744 \uD654\uBA74\uC5D0 \uD55C \uAE00\uC790\uC529 \uD758\uB824\uBCF4\uB0B4\uAC70\uB098, \uC9C4\uD589 \uC911\uC778 \uC791\uC5C5 \uB85C\uADF8\uB97C \uBE0C\uB77C\uC6B0\uC800\uAC00 \uC911\uB2E8(AbortController) \uBC0F \uC7AC\uC5F0\uACB0\uD560 \uC218 \uC788\uAC8C \uC2A4\uD2B8\uB9AC\uBC0D\uD569\uB2C8\uB2E4.",
30825
+ promptSnippet: "AI \uC751\uB2F5\uC774\uB098 \uC2E4\uC2DC\uAC04 \uC9C4\uD589 \uB85C\uADF8\uB97C \uB2E8\uBC29\uD5A5\uC73C\uB85C \uC2A4\uD2B8\uB9AC\uBC0D\uD560 \uB54C \uC11C\uBC84 \uC804\uC1A1 \uC774\uBCA4\uD2B8(SSE) \uADDC\uACA9\uC744 \uC0AC\uC6A9\uD558\uACE0, \uD074\uB77C\uC774\uC5B8\uD2B8\uC5D0\uB294 \uC911\uC9C0(AbortController), \uC5F0\uACB0 \uB04A\uAE40 \uC548\uB0B4, \uB9C8\uC9C0\uB9C9 \uC218\uC2E0 \uC774\uBCA4\uD2B8 ID \uAE30\uBC18 \uBCF5\uAD6C \uD750\uB984\uC744 \uD568\uAED8 \uAD6C\uD604\uD574 \uC918."
30826
+ },
30827
+ en: {
30828
+ definition: "A web standard allowing a server to push real-time text events over a single long-lived HTTP connection from server to client.",
30829
+ example: "Stream LLM response tokens incrementally as they are generated while supporting user-triggered AbortController cancellation and automatic reconnection.",
30830
+ promptSnippet: "Use Server-Sent Events (SSE) for unidirectional streaming such as LLM token output or live status feeds, pairing it with AbortController cancellation, disconnect banners, and safe reconnect handling."
30831
+ }
30832
+ }
30833
+ },
30834
+ "retrieval-augmented-generation": {
30835
+ aliases: {
30836
+ ko: ["RAG", "\uBB38\uC11C \uAC80\uC0C9 \uAE30\uBC18 \uB2F5\uBCC0", "\uCD9C\uCC98 \uC778\uC6A9 AI", "\uC9C0\uC2DD \uAE30\uBC18 \uAC80\uC0C9 \uC99D\uAC15", "\uD560\uB8E8\uC2DC\uB124\uC774\uC158 \uC904\uC774\uAE30"],
30837
+ en: ["RAG", "retrieval augmented generation", "grounded generation", "citation-backed AI"]
30838
+ },
30839
+ text: {
30840
+ ko: {
30841
+ definition: "\uC5B8\uC5B4 \uBAA8\uB378\uC774 \uD559\uC2B5 \uAE30\uC5B5\uC5D0\uB9CC \uC758\uC874\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC678\uBD80 \uBB38\uC11C\xB7\uC9C0\uC2DD\uBCA0\uC774\uC2A4\uC5D0\uC11C \uAD00\uB828 \uADFC\uAC70\uB97C \uBA3C\uC800 \uAC80\uC0C9\uD574 \uD504\uB86C\uD504\uD2B8 \uBB38\uB9E5\uC5D0 \uC8FC\uC785\uD55C \uB4A4, \uCD9C\uCC98\uC640 \uD568\uAED8 \uB2F5\uBCC0\uC744 \uC0DD\uC131\uD558\uAC8C \uD558\uB294 \uC544\uD0A4\uD14D\uCC98\uC785\uB2C8\uB2E4.",
30842
+ example: "\uC0AC\uB0B4 \uADDC\uC815 \uCC57\uBD07\uC774 \uC9C8\uBB38\uACFC \uAD00\uB828\uB41C \uCD5C\uC2E0 \uBB38\uC11C \uB2E8\uB77D 3\uAC74\uC744 \uBA3C\uC800 \uCC3E\uC544 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uB123\uACE0, \uB2F5\uBCC0 \uBB38\uC7A5 \uB05D\uC5D0 [1], [2] \uC778\uB77C\uC778 \uC778\uC6A9 \uCE69\uC744 \uBD99\uC5EC \uC6D0\uBB38 \uADFC\uAC70\uB97C \uBC14\uB85C \uD655\uC778\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.",
30843
+ promptSnippet: "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131(RAG) \uD750\uB984\uC5D0\uC11C\uB294 \uC0AC\uC6A9\uC790 \uC9C8\uC758\uB85C \uAC80\uC99D\uB41C \uBB38\uC11C\uB97C \uBA3C\uC800 \uAC80\uC0C9\uD574 \uCEE8\uD14D\uC2A4\uD2B8 \uC608\uC0B0 \uC548\uC5D0 \uC8FC\uC785\uD558\uACE0, \uB2F5\uBCC0\uC5D0\uB294 \uC778\uB77C\uC778 \uCD9C\uCC98 \uC778\uC6A9\uACFC \uADFC\uAC70\uAC00 \uBD80\uC871\uD560 \uB54C \uBAA8\uB978\uB2E4\uACE0 \uB2F5\uD558\uB294 \uAC00\uB4DC\uB808\uC77C\uC744 \uD3EC\uD568\uD574 \uC918."
30844
+ },
30845
+ en: {
30846
+ definition: "An AI architecture that retrieves relevant passages from an external knowledge base before generation and injects them into the prompt context so answers stay grounded and citable.",
30847
+ example: "A policy assistant retrieves the top matching handbook excerpts, passes them within the token budget, and renders inline citation chips linking back to each source.",
30848
+ promptSnippet: "Design the Retrieval-Augmented Generation (RAG) pipeline to retrieve relevant documents within the context token budget, attach inline source citations to claims, and fall back safely when no supporting evidence is found."
30849
+ }
30850
+ }
30851
+ },
30852
+ "dead-letter-queue": {
30853
+ aliases: {
30854
+ ko: ["DLQ", "\uC2E4\uD328 \uC791\uC5C5 \uBCF4\uAD00 \uD050", "\uC6F9\uD6C5 \uC2E4\uD328 \uC7AC\uCC98\uB9AC \uD050", "\uC7AC\uC2DC\uB3C4 \uCD08\uACFC \uD050"],
30855
+ en: ["DLQ", "dead letter queue", "failed job queue", "poison message queue"]
30856
+ },
30857
+ text: {
30858
+ ko: {
30859
+ definition: "\uBC31\uADF8\uB77C\uC6B4\uB4DC \uC791\uC5C5\uC774\uB098 \uC6F9\uD6C5 \uC804\uC1A1\uC774 \uC815\uD574\uC9C4 \uC7AC\uC2DC\uB3C4 \uD69F\uC218\uB97C \uBAA8\uB450 \uCD08\uACFC\uD574 \uC2E4\uD328\uD588\uC744 \uB54C \uBA54\uC2DC\uC9C0\uB97C \uBC84\uB9AC\uC9C0 \uC54A\uACE0 \uBCC4\uB3C4 \uD050\uC5D0 \uACA9\uB9AC\uD574 \uC6D0\uC778 \uC870\uC0AC\uC640 \uC218\uB3D9 \uC7AC\uC2E4\uD589\uC744 \uAC00\uB2A5\uD558\uAC8C \uD558\uB294 \uD328\uD134\uC785\uB2C8\uB2E4.",
30860
+ example: "\uACB0\uC81C \uC644\uB8CC \uC6F9\uD6C5\uC774 \uC0C1\uB300 \uC11C\uBC84 \uC7A5\uC560\uB85C 5\uD68C \uC5F0\uC18D \uC2E4\uD328\uD558\uBA74 \uB370\uB4DC \uB808\uD130 \uD050(DLQ)\uB85C \uC774\uB3D9\uC2DC\uCF1C \uC6B4\uC601\uC790\uAC00 \uC624\uB958 \uC6D0\uC778\uC744 \uD655\uC778\uD55C \uB4A4 \uBA71\uB4F1\uC131 \uC788\uAC8C \uB2E4\uC2DC \uC804\uC1A1\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.",
30861
+ promptSnippet: "\uBE44\uB3D9\uAE30 \uC6F9\uD6C5\xB7\uC54C\uB9BC\xB7\uACB0\uC81C \uD6C4\uCC98\uB9AC \uC6CC\uCEE4\uC5D0\uB294 \uC9C0\uC218 \uBC31\uC624\uD504 \uC7AC\uC2DC\uB3C4\uC640 \uD568\uAED8 \uCD5C\uB300 \uC7AC\uC2DC\uB3C4 \uCD08\uACFC \uC2DC \uBA54\uC2DC\uC9C0\uB97C \uACA9\uB9AC\uD558\uB294 \uB370\uB4DC \uB808\uD130 \uD050(DLQ)\uB97C \uB450\uACE0, \uC6B4\uC601\uC790\uAC00 \uC624\uB958 payload\uB97C \uC870\uD68C\uD574 \uBA71\uB4F1\uD558\uAC8C \uC7AC\uC2E4\uD589\uD560 \uC218 \uC788\uAC8C \uD574 \uC918."
30862
+ },
30863
+ en: {
30864
+ definition: "A dedicated holding queue where messages or webhook deliveries are routed after exhausting all retry attempts, preventing silent data loss and enabling inspection and replay.",
30865
+ example: "When an outbound billing webhook fails 5 times due to a partner outage, move the payload to a Dead-Letter Queue (DLQ) so operators can inspect the error and safely replay it later.",
30866
+ promptSnippet: "Configure exponential-backoff retries paired with a Dead-Letter Queue (DLQ) for exhausted jobs or webhooks, exposing failure metadata and an idempotent manual replay action."
30867
+ }
30868
+ }
30869
+ },
30870
+ "audit-log": {
30871
+ aliases: {
30872
+ ko: ["\uBCF4\uC548 \uAC10\uC0AC \uB85C\uADF8", "\uBCC0\uACBD \uC774\uB825 \uAE30\uB85D", "\uAD00\uB9AC\uC790 \uD65C\uB3D9 \uB85C\uADF8", "\uB204\uAC00 \uC5B8\uC81C \uBC14\uAFE8\uB294\uC9C0 \uAE30\uB85D"],
30873
+ en: ["audit trail", "activity audit log", "security event log", "change history log"]
30874
+ },
30875
+ text: {
30876
+ ko: {
30877
+ definition: "\uB204\uAC00\xB7\uC5B8\uC81C\xB7\uC5B4\uB5A4 \uB300\uC0C1\uC5D0\xB7\uBB34\uC2A8 \uBCC0\uACBD\uC774\uB098 \uC5F4\uB78C\uC744 \uC218\uD589\uD588\uB294\uC9C0 \uBCC0\uC870\uD558\uAE30 \uC5B4\uB835\uAC8C \uC2DC\uAC04\uC21C\uC73C\uB85C \uB0A8\uAE30\uB294 \uCD94\uC801 \uAE30\uB85D\uC785\uB2C8\uB2E4.",
30878
+ example: "\uAD00\uB9AC\uC790\uAC00 \uD300\uC6D0\uC758 \uC5ED\uD560\uC744 \uBCC0\uACBD\uD558\uAC70\uB098 API \uD0A4\uB97C \uD3D0\uAE30\uD558\uBA74 \uD589\uC704\uC790, IP, \uB300\uC0C1 \uB9AC\uC18C\uC2A4, \uBCC0\uACBD \uC804\uD6C4 \uC694\uC57D\uC744 \uAC10\uC0AC \uB85C\uADF8\uC5D0 \uB0A8\uAE30\uB418 \uBE44\uBC00\uBC88\uD638\uB098 \uD1A0\uD070 \uC6D0\uBB38\uC740 \uB9C8\uC2A4\uD0B9\uD569\uB2C8\uB2E4.",
30879
+ promptSnippet: "\uAD8C\uD55C \uBCC0\uACBD, API \uD0A4 \uBC1C\uAE09\xB7\uD3D0\uAE30, \uBBFC\uAC10 \uD30C\uC77C \uB2E4\uC6B4\uB85C\uB4DC \uAC19\uC740 \uC911\uC694 \uC774\uBCA4\uD2B8\uB9C8\uB2E4 \uD589\uC704\uC790\xB7\uC2DC\uAC01\xB7\uB300\uC0C1\xB7\uC694\uCCAD \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uAC10\uC0AC \uB85C\uADF8(Audit Log)\uC5D0 \uCD94\uAC00 \uC804\uC6A9\uC73C\uB85C \uAE30\uB85D\uD558\uACE0, \uBE44\uBC00\uAC12\uACFC \uAC1C\uC778\uC815\uBCF4\uB294 \uB9C8\uC2A4\uD0B9\uD574 \uC918."
30880
+ },
30881
+ en: {
30882
+ definition: "An append-only chronological record capturing who performed what action, on which resource, and when\u2014used for security review, compliance, and incident investigation.",
30883
+ example: "Record role changes, API key revocations, and sensitive file downloads with actor, timestamp, and before/after summary while redacting secrets or raw tokens.",
30884
+ promptSnippet: "Emit append-only audit log entries for security- and billing-sensitive events (actor, timestamp, target resource, action outcome) while redacting credentials and sensitive PII."
30885
+ }
30886
+ }
30887
+ }
30888
+ };
30889
+
30890
+ // ../../packages/catalog/src/glossary/workflow.ts
30891
+ var WORKFLOW_GLOSSARY_DATA = {
30892
+ "human-in-the-loop": {
30893
+ aliases: {
30894
+ ko: ["HITL", "\uD734\uBA3C\uC778\uB354\uB8E8\uD504", "\uC0AC\uB78C \uC2B9\uC778 \uB2E8\uACC4", "\uC5D0\uC774\uC804\uD2B8 \uC2E4\uD589 \uC804 \uD655\uC778", "\uC704\uD5D8 \uC791\uC5C5 \uC2B9\uC778"],
30895
+ en: ["HITL", "human in the loop", "human approval guardrail", "manual review gate"]
30896
+ },
30897
+ text: {
30898
+ ko: {
30899
+ definition: "AI \uC5D0\uC774\uC804\uD2B8\uB098 \uC790\uB3D9\uD654 \uC6CC\uD06C\uD50C\uB85C\uAC00 \uB418\uB3CC\uB9AC\uAE30 \uC5B4\uB824\uC6B4 \uC791\uC5C5(\uC0AD\uC81C\xB7\uACB0\uC81C\xB7\uC678\uBD80 \uBC1C\uC1A1 \uB4F1)\uC744 \uC2E4\uD589\uD558\uAE30 \uC9C1\uC804\uC5D0 \uC2E4\uD589\uC744 \uBA48\uCD94\uACE0 \uC0AC\uB78C\uC758 \uBA85\uC2DC\uC801 \uC2B9\uC778 \uB610\uB294 \uAC70\uC808\uC744 \uC694\uAD6C\uD558\uB294 \uC548\uC804 \uC808\uCC28\uC785\uB2C8\uB2E4.",
30900
+ example: "AI \uBE44\uC11C\uAC00 \uACE0\uAC1D\uC5D0\uAC8C \uD658\uBD88 \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD558\uAC70\uB098 DB \uD14C\uC774\uBE14\uC744 \uC218\uC815\uD558\uAE30 \uC804\uC5D0 \uC601\uD5A5 \uBC94\uC704\uC640 \uC2E4\uD589 \uD30C\uB77C\uBBF8\uD130\uB97C \uCE74\uB4DC\uB85C \uBCF4\uC5EC \uC8FC\uACE0 [\uC2B9\uC778] \uBC84\uD2BC\uC744 \uB204\uB978 \uACBD\uC6B0\uC5D0\uB9CC \uC2E4\uC81C \uB3C4\uAD6C\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.",
30901
+ promptSnippet: "AI \uC5D0\uC774\uC804\uD2B8\uB098 \uC790\uB3D9\uD654 \uD30C\uC774\uD504\uB77C\uC778\uC5D0\uC11C \uD30C\uAD34\uC801\xB7\uAE08\uC804\uC801\xB7\uC678\uBD80 \uC804\uD30C \uC791\uC5C5\uC740 \uC790\uB3D9 \uC2E4\uD589\uD558\uC9C0 \uB9D0\uACE0 \uC778\uAC04 \uAC1C\uC785 \uC2B9\uC778(HITL) \uAC8C\uC774\uD2B8\uB97C \uB450\uC5B4 \uB300\uC0C1\uACFC \uD30C\uB77C\uBBF8\uD130 \uC694\uC57D\uC744 \uBCF4\uC5EC \uC900 \uB4A4 \uBA85\uC2DC\uC801 \uC2B9\uC778 \uD6C4\uC5D0\uB9CC \uC9C4\uD589\uB418\uAC8C \uD574 \uC918."
30902
+ },
30903
+ en: {
30904
+ definition: "A workflow guardrail that pauses an AI agent or automation before high-impact or irreversible actions, requiring explicit human approval or rejection to proceed.",
30905
+ example: "Before an agent sends external emails or deletes records, pause execution and surface the exact tool parameters and impact summary for a user to approve or reject.",
30906
+ promptSnippet: "Gate irreversible, financial, or external-facing automated actions behind a Human-in-the-Loop (HITL) approval step that displays exact parameters and risk context before execution."
30907
+ }
30908
+ }
30909
+ },
30910
+ "service-level-agreement": {
30911
+ aliases: {
30912
+ ko: ["SLA", "\uC751\uB300 \uBAA9\uD45C \uC2DC\uAC04", "\uCC98\uB9AC \uAE30\uD55C \uC57D\uC18D", "\uC9C0\uC6D0 \uD2F0\uCF13 \uB9C8\uAC10 \uAE30\uD55C", "SLA \uD0C0\uC774\uBA38"],
30913
+ en: ["SLA", "response time target", "resolution target", "support SLA timer"]
30914
+ },
30915
+ text: {
30916
+ ko: {
30917
+ definition: "\uACE0\uAC1D\uC9C0\uC6D0\xB7\uC6B4\uC601 \uC870\uC9C1\uC774 \uBB38\uC758\uB098 \uC7A5\uC560\uC5D0 \uCCAB \uC751\uB2F5\xB7\uD574\uACB0\uC744 \uC644\uB8CC\uD558\uAE30\uB85C \uC57D\uC18D\uD55C \uBAA9\uD45C \uC2DC\uAC04\uACFC \uC601\uC5C5\uC2DC\uAC04 \uACC4\uC0B0\xB7\uC784\uBC15 \uACBD\uACE0\xB7\uC5D0\uC2A4\uCEEC\uB808\uC774\uC158 \uAE30\uC900\uC785\uB2C8\uB2E4.",
30918
+ example: "\uAE34\uAE09 \uBB38\uC758\uB294 \uCCAB \uC751\uB2F5 1\uC2DC\uAC04 \uC774\uB0B4 SLA\uB97C \uC801\uC6A9\uD558\uACE0, \uACE0\uAC1D \uB2F5\uBCC0\uC744 \uAE30\uB2E4\uB9AC\uB294 \uB3D9\uC548\uC5D0\uB294 \uD0C0\uC774\uBA38\uB97C \uC77C\uC2DC\uC815\uC9C0\uD558\uBA70, \uB9C8\uAC10 15\uBD84 \uC804\uC5D0\uB294 \uB2F4\uB2F9 \uD300\uC5D0 \uACBD\uACE0\uB97C \uBCF4\uB0C5\uB2C8\uB2E4.",
30919
+ promptSnippet: "\uBB38\uC758 \uD050\uB098 \uC6B4\uC601 \uC6CC\uD06C\uD50C\uB85C\uC5D0 \uC11C\uBE44\uC2A4 \uC218\uC900 \uD611\uC57D(SLA) \uAE30\uC900\uC744 \uBC18\uC601\uD560 \uB54C \uC6B0\uC120\uC21C\uC704\uBCC4 \uBAA9\uD45C \uC2DC\uAC04, \uC601\uC5C5\uC2DC\uAC04 \uAE30\uC900 \uD0C0\uC774\uBA38, \uACE0\uAC1D \uB300\uAE30 \uC911 \uC77C\uC2DC\uC815\uC9C0 \uC870\uAC74, \uC784\uBC15\xB7\uCD08\uACFC \uC2DC \uC5D0\uC2A4\uCEEC\uB808\uC774\uC158 \uADDC\uCE59\uC744 \uBA85\uD655\uD788 \uBD84\uB9AC\uD574 \uC124\uACC4\uD574 \uC918."
30920
+ },
30921
+ en: {
30922
+ definition: "A formal commitment defining target first-response and resolution times for support or operations, including business-hour calendars, pause states, and escalation rules.",
30923
+ example: "Apply a 1-hour first-response SLA to urgent tickets, pause the clock while waiting on customer reply, and flag approaching breaches before timeout.",
30924
+ promptSnippet: "Model Service-Level Agreement (SLA) tracking with priority-based target durations, business-hours calculation, explicit pause states (e.g., waiting on customer), and breach escalation alerts."
30925
+ }
30926
+ }
30927
+ },
30928
+ "know-your-customer": {
30929
+ aliases: {
30930
+ ko: ["KYC", "\uACE0\uAC1D \uC2E0\uC6D0 \uD655\uC778", "\uD310\uB9E4\uC790 \uC785\uC810 \uBCF8\uC778\uC778\uC99D", "\uC2E0\uBD84\uC99D \uC778\uC99D \uB2E8\uACC4", "\uD55C\uB3C4 \uC0C1\uD5A5 \uC2EC\uC0AC"],
30931
+ en: ["KYC", "identity verification", "customer verification", "seller onboarding KYC"]
30932
+ },
30933
+ text: {
30934
+ ko: {
30935
+ definition: "\uAE08\uC735\xB7\uC815\uC0B0\xB7\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4 \uC11C\uBE44\uC2A4\uAC00 \uBC95\uC801 \uADDC\uC81C\uC640 \uBD80\uC815 \uAC70\uB798 \uBC29\uC9C0\uB97C \uC704\uD574 \uC0AC\uC6A9\uC790\uC758 \uC2E4\uBA85\xB7\uC0AC\uC5C5\uC790\xB7\uACC4\uC88C \uC18C\uC720 \uC5EC\uBD80\uB97C \uB2E8\uACC4\uBCC4\uB85C \uAC80\uC99D\uD558\uB294 \uC808\uCC28\uC785\uB2C8\uB2E4.",
30936
+ example: "\uD540\uD14C\uD06C \uC9C0\uAC11\uC774\uB098 \uC624\uD508\uB9C8\uCF13\uC5D0\uC11C \uBBF8\uC778\uC99D \uACC4\uC815\uC740 \uC18C\uC561 \uC870\uD68C\uB9CC \uD5C8\uC6A9\uD558\uACE0, \uC2E0\uBD84\uC99D\xB7\uACC4\uC88C \uC778\uC99D(KYC)\uC744 \uB9C8\uCCD0\uC57C \uCD9C\uAE08\uC774\uB098 \uD310\uB9E4\uC790 \uC815\uC0B0 \uD55C\uB3C4\uB97C \uC5F4\uC5B4 \uC90D\uB2C8\uB2E4.",
30937
+ promptSnippet: "\uACB0\uC81C\xB7\uC815\uC0B0\xB7\uCD9C\uAE08 \uAE30\uB2A5\uC774 \uD3EC\uD568\uB41C \uC11C\uBE44\uC2A4\uC5D0\uC11C\uB294 \uACE0\uAC1D \uD655\uC778 \uC808\uCC28(KYC)\uC758 \uAC80\uC99D \uB2E8\uACC4(\uBBF8\uC81C\uCD9C\xB7\uC2EC\uC0AC \uC911\xB7\uC2B9\uC778\xB7\uBCF4\uB958)\uB97C \uBD84\uB9AC\uD558\uACE0, \uBBF8\uC644\uB8CC \uC0C1\uD0DC\uC758 \uAE30\uB2A5 \uC81C\uD55C\uACFC \uBC18\uB824 \uC0AC\uC720 \uC7AC\uC81C\uCD9C \uD750\uB984\uC744 \uC124\uACC4\uD574 \uC918."
30938
+ },
30939
+ en: {
30940
+ definition: "A regulated verification workflow used by fintech and marketplace platforms to confirm user or merchant identity, business legitimacy, and payout account ownership.",
30941
+ example: "Restrict withdrawals and seller payouts while an account is unverified or pending KYC review, and show clear resubmission guidance if documents are rejected.",
30942
+ promptSnippet: "Structure Know Your Customer (KYC) onboarding with explicit verification states (unverified, under review, approved, rejected), capability limits per tier, and clear resubmission feedback."
30943
+ }
30944
+ }
30945
+ },
30946
+ "user-onboarding": {
30947
+ aliases: {
30948
+ ko: ["\uC628\uBCF4\uB529 \uD750\uB984", "\uCD08\uAE30 \uC124\uC815 \uAC00\uC774\uB4DC", "\uC2DC\uC791\uD558\uAE30 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8", "\uCCAB \uC0AC\uC6A9\uC790 \uC548\uB0B4"],
30949
+ en: ["onboarding flow", "getting started checklist", "first-run experience", "activation checklist"]
30950
+ },
30951
+ text: {
30952
+ ko: {
30953
+ definition: "\uC0C8\uB85C \uAC00\uC785\uD55C \uC0AC\uC6A9\uC790\uB098 \uD300\uC774 \uC11C\uBE44\uC2A4\uC758 \uCCAB \uD575\uC2EC \uAC00\uCE58\uB97C \uBE60\uB974\uAC8C \uACBD\uD5D8\uD558\uB3C4\uB85D \uCD08\uAE30 \uC124\uC815\xB7\uD544\uC218 \uC785\uB825\xB7\uB458\uB7EC\uBCF4\uAE30 \uB2E8\uACC4\uB97C \uC21C\uC11C\uB300\uB85C \uC548\uB0B4\uD558\uB294 \uD750\uB984\uC785\uB2C8\uB2E4.",
30954
+ example: '\uD300 \uD611\uC5C5 SaaS \uAC00\uC785 \uC9C1\uD6C4 "1. \uD504\uB85C\uD544 \uC124\uC815 \u2192 2. \uD300\uC6D0 \uCD08\uB300 \u2192 3. \uCCAB \uD504\uB85C\uC81D\uD2B8 \uB9CC\uB4E4\uAE30" \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uC640 \uC9C4\uD589\uB960 \uB9C9\uB300\uB97C \uBCF4\uC5EC \uC8FC\uC5B4 \uC774\uD0C8 \uC5C6\uC774 \uC2DC\uC791\uD558\uAC8C \uD569\uB2C8\uB2E4.',
30955
+ promptSnippet: "\uC2E0\uADDC \uC0AC\uC6A9\uC790 \uC628\uBCF4\uB529\uC740 \uD55C \uBC88\uC5D0 \uBAA8\uB4E0 \uC124\uC815\uC744 \uAC15\uC694\uD558\uC9C0 \uB9D0\uACE0 3~4\uAC1C\uC758 \uC791\uC740 \uC644\uB8CC \uAC00\uB2A5\uD55C \uB2E8\uACC4\uC640 \uC9C4\uD589\uB960 \uD45C\uC2DC\uB85C \uB098\uB204\uACE0, \uAC74\uB108\uB6F0\uAE30\uC640 \uB098\uC911\uC5D0 \uC774\uC5B4\uD558\uAE30\uB97C \uD5C8\uC6A9\uD574 \uC918."
30956
+ },
30957
+ en: {
30958
+ definition: "A guided activation flow that helps new users or teams complete essential setup steps and reach their first meaningful outcome without feeling overwhelmed.",
30959
+ example: 'After sign-up, present a 3-step checklist ("Profile", "Invite teammates", "Create first project") with a live progress indicator and optional skip.',
30960
+ promptSnippet: "Design user onboarding as a concise 3-4 step checklist with visible progress, clear next-action cues, and safe skip/resume support so users reach core value quickly."
30961
+ }
30962
+ }
30963
+ },
30964
+ "escrow-settlement": {
30965
+ aliases: {
30966
+ ko: ["\uC5D0\uC2A4\uD06C\uB85C \uACB0\uC81C \uC815\uC0B0", "\uAD6C\uB9E4 \uD655\uC815 \uD6C4 \uC9C0\uAE09", "\uB300\uAE08 \uBCF4\uAD00 \uC815\uC0B0", "\uC815\uC0B0 \uBCF4\uB958 \uBC0F \uBD84\uC7C1 \uCC98\uB9AC"],
30967
+ en: ["escrow payout", "held funds settlement", "buyer confirmation release", "marketplace escrow"]
30968
+ },
30969
+ text: {
30970
+ ko: {
30971
+ definition: "\uAD6C\uB9E4\uC790\uC640 \uD310\uB9E4\uC790 \uC0AC\uC774 \uAC70\uB798\uC5D0\uC11C \uD50C\uB7AB\uD3FC\uC774 \uACB0\uC81C \uB300\uAE08\uC744 \uC548\uC804\uD558\uAC8C \uBCF4\uAD00\uD558\uACE0 \uC788\uB2E4\uAC00, \uAD6C\uB9E4 \uD655\uC815\xB7\uBC30\uC1A1 \uC644\uB8CC\xB7\uB9C8\uC77C\uC2A4\uD1A4 \uAC80\uC218\uAC00 \uB05D\uB09C \uB4A4 \uC218\uC218\uB8CC\uB97C \uCC28\uAC10\uD574 \uC815\uC0B0\uD574 \uC8FC\uB294 \uD750\uB984\uC785\uB2C8\uB2E4.",
30972
+ example: "\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4\uC5D0\uC11C \uAD6C\uB9E4\uC790\uAC00 \uACB0\uC81C\uD558\uBA74 \uB300\uAE08\uC740 \uC5D0\uC2A4\uD06C\uB85C \uB300\uAE30 \uC0C1\uD0DC\uB85C \uBB36\uC774\uACE0, \uC0C1\uD488 \uC218\uB839 \uD6C4 [\uAD6C\uB9E4 \uD655\uC815]\uC744 \uB204\uB974\uAC70\uB098 \uC790\uB3D9 \uD655\uC815 \uAE30\uAC04\uC774 \uC9C0\uB098\uBA74 \uC218\uC218\uB8CC\uB97C \uC81C\uC678\uD55C \uAE08\uC561\uC774 \uD310\uB9E4\uC790\uC5D0\uAC8C \uC815\uC0B0\uB429\uB2C8\uB2E4.",
30973
+ promptSnippet: "\uB9C8\uCF13\uD50C\uB808\uC774\uC2A4\uB098 \uC678\uC8FC \uAC70\uB798\uC5D0\uB294 \uACB0\uC81C \uB300\uAE08\uC744 \uC989\uC2DC \uCD9C\uAE08\uC2DC\uD0A4\uC9C0 \uC54A\uACE0 \uBCF4\uAD00 \u2192 \uAD6C\uB9E4 \uD655\uC815(\uB610\uB294 \uAE30\uD55C \uB9CC\uB8CC) \u2192 \uC218\uC218\uB8CC \uCC28\uAC10 \uC815\uC0B0 \u2192 \uBD84\uC7C1 \uC2DC \uC9C0\uAE09 \uBCF4\uB958 \uC0C1\uD0DC\uB97C \uAC70\uCE58\uB294 \uC5D0\uC2A4\uD06C\uB85C \uC815\uC0B0 \uD750\uB984\uC744 \uC801\uC6A9\uD574 \uC918."
30974
+ },
30975
+ en: {
30976
+ definition: "A marketplace settlement workflow where the platform holds buyer funds safely until delivery confirmation or milestone sign-off, then releases net payouts after fee deduction.",
30977
+ example: "Hold order funds in escrow at checkout and release the seller payout minus platform fees only after buyer confirmation or auto-confirm expiry, pausing payout if a dispute opens.",
30978
+ promptSnippet: "Model escrow settlement with distinct ledger states\u2014held on payment, frozen during active disputes, and released net of platform fees upon buyer confirmation or milestone approval."
30979
+ }
30980
+ }
30981
+ },
30982
+ proration: {
30983
+ aliases: {
30984
+ ko: ["\uD504\uB85C\uB808\uC774\uC158", "\uC911\uB3C4 \uBCC0\uACBD \uCC28\uC561 \uACC4\uC0B0", "\uB0A8\uC740 \uAE30\uAC04 \uC77C\uD560 \uC815\uC0B0", "\uC694\uAE08\uC81C \uC5C5\uADF8\uB808\uC774\uB4DC \uCC28\uC561"],
30985
+ en: ["pro-rata billing", "prorated charge", "mid-cycle plan adjustment", "seat proration"]
30986
+ },
30987
+ text: {
30988
+ ko: {
30989
+ definition: "\uAD6C\uB3C5 \uACB0\uC81C \uC8FC\uAE30 \uB3C4\uC911\uC5D0 \uC694\uAE08\uC81C\uB97C \uBCC0\uACBD\uD558\uAC70\uB098 \uD300 \uC88C\uC11D \uC218\uB97C \uB298\uB9AC\uACE0 \uC904\uC77C \uB54C, \uB0A8\uC740 \uC0AC\uC6A9 \uC77C\uC218\xB7\uC2DC\uAC04 \uBE44\uC728\uC5D0 \uB9DE\uCDB0 \uCD94\uAC00 \uCCAD\uAD6C\uC561\uC774\uB098 \uD06C\uB808\uB527 \uCC28\uC561\uC744 \uC815\uC0B0\uD558\uB294 \uADDC\uCE59\uC785\uB2C8\uB2E4.",
30990
+ example: "\uC6D4\uAC04 30\uC77C \uC8FC\uAE30 \uC911 15\uC77C\uC774 \uB0A8\uC740 \uC2DC\uC810\uC5D0 \uC88C\uC11D\uC744 1\uAC1C \uCD94\uAC00\uD558\uBA74 \uC804\uCCB4 \uD55C \uB2EC \uC694\uAE08\uC774 \uC544\uB2C8\uB77C \uB0A8\uC740 15\uC77C\uCE58 \uC808\uBC18 \uAE08\uC561\uB9CC \uACC4\uC0B0\uD574 \uCCAD\uAD6C\uC11C\uC5D0 \uBC18\uC601\uD569\uB2C8\uB2E4.",
30991
+ promptSnippet: "\uAD6C\uB3C5 \uD50C\uB79C \uC5C5\uADF8\uB808\uC774\uB4DC\xB7\uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC \uB610\uB294 \uC88C\uC11D \uC99D\uAC10 \uC2DC \uACB0\uC81C \uC8FC\uAE30 \uB0A8\uC740 \uAE30\uAC04\uC5D0 \uB530\uB978 \uC77C\uD560 \uACC4\uC0B0(Proration) \uC801\uC6A9 \uC5EC\uBD80\uC640 \uC608\uC0C1 \uCC28\uC561\xB7\uC801\uC6A9 \uC2DC\uC810(\uC989\uC2DC vs \uB2E4\uC74C \uC8FC\uAE30)\uC744 \uBCC0\uACBD \uD655\uC778 \uD654\uBA74\uC5D0 \uBBF8\uB9AC \uBCF4\uC5EC \uC918."
30992
+ },
30993
+ en: {
30994
+ definition: "A billing calculation that adjusts charges or credits proportionally based on the remaining days in a billing cycle when a plan or seat count changes mid-cycle.",
30995
+ example: "Adding a team seat halfway through a 30-day billing cycle charges roughly half the monthly seat price rather than the full month.",
30996
+ promptSnippet: "Preview prorated charges or credits clearly before confirming mid-cycle plan or seat changes, specifying whether adjustments apply immediately or on the next invoice."
30997
+ }
30998
+ }
30999
+ },
31000
+ "grace-period": {
31001
+ aliases: {
31002
+ ko: ["\uC720\uC608\uAE30\uAC04", "\uACB0\uC81C \uC2E4\uD328 \uC720\uC608", "\uD0C8\uD1F4 \uCCA0\uD68C \uAE30\uAC04", "\uC2DC\uD06C\uB9BF \uAD50\uCCB4 \uC720\uC608"],
31003
+ en: ["grace window", "dunning grace period", "deletion grace period", "dual-valid window"]
31004
+ },
31005
+ text: {
31006
+ ko: {
31007
+ definition: "\uACB0\uC81C \uC2E4\uD328\xB7\uAD6C\uB3C5 \uB9CC\uB8CC\xB7\uD68C\uC6D0 \uD0C8\uD1F4 \uC694\uCCAD\xB7API \uC2DC\uD06C\uB9BF \uAD50\uCCB4 \uAC19\uC740 \uC804\uD658\uC774 \uBC1C\uC0DD\uD55C \uB4A4, \uC989\uC2DC \uCC28\uB2E8\uD558\uAC70\uB098 \uC601\uAD6C \uC0AD\uC81C\uD558\uC9C0 \uC54A\uACE0 \uBCF5\uAD6C\xB7\uC804\uD658\uD560 \uC218 \uC788\uB3C4\uB85D \uD5C8\uC6A9\uD558\uB294 \uC77C\uC815 \uC720\uC608 \uC2DC\uAC04\uC785\uB2C8\uB2E4.",
31008
+ example: "\uC815\uAE30 \uACB0\uC81C\uAC00 \uC2E4\uD328\uD574\uB3C4 \uC989\uC2DC \uACC4\uC815\uC744 \uC7A0\uADF8\uC9C0 \uC54A\uACE0 7\uC77C\uAC04 \uC720\uC608 \uAE30\uAC04 \uBC30\uB108\uC640 \uACB0\uC81C \uC218\uB2E8 \uAD50\uCCB4 \uC548\uB0B4\uB97C \uB744\uC6CC \uC815\uC0C1 \uBCF5\uAD6C\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4.",
31009
+ promptSnippet: "\uACB0\uC81C \uC2E4\uD328, \uD574\uC9C0 \uC608\uC57D, \uACC4\uC815 \uC0AD\uC81C, \uC6F9\uD6C5 \uC2DC\uD06C\uB9BF \uAD50\uCCB4\uC5D0\uB294 \uC989\uC2DC \uCC28\uB2E8 \uB300\uC2E0 \uBA85\uC2DC\uC801 \uC720\uC608 \uAE30\uAC04(Grace Period)\uACFC \uB0A8\uC740 \uAE30\uD55C \uBC30\uB108\xB7\uBCF5\uAD6C \uC561\uC158\uC744 \uC81C\uACF5\uD574 \uC758\uB3C4\uCE58 \uC54A\uC740 \uC11C\uBE44\uC2A4 \uC911\uB2E8\uC744 \uC904\uC5EC \uC918."
31010
+ },
31011
+ en: {
31012
+ definition: "A configured buffer window after payment failure, cancellation, deletion request, or credential rotation during which users can recover or transition before hard enforcement.",
31013
+ example: "After a recurring card charge fails, grant a 7-day grace period with a persistent banner to update payment details before downgrading entitlements.",
31014
+ promptSnippet: "Include an explicit grace period with countdown banners and recovery actions for failed renewals, scheduled account deletions, or dual-valid secret rotations before hard cutoff."
31015
+ }
31016
+ }
31017
+ },
31018
+ "maker-checker-approval": {
31019
+ aliases: {
31020
+ ko: ["\uBA54\uC774\uCEE4 \uCCB4\uCEE4", "2\uC778 \uC2B9\uC778 \uCCB4\uACC4", "\uAD50\uCC28 \uC2B9\uC778", "\uACE0\uC704\uD5D8 \uC791\uC5C5 \uACB0\uC7AC", "4-eyes \uC6D0\uCE59"],
31021
+ en: ["maker-checker", "four-eyes principle", "two-person approval", "peer sign-off"]
31022
+ },
31023
+ text: {
31024
+ ko: {
31025
+ definition: "\uACE0\uC561 \uCD9C\uAE08, \uAD8C\uD55C \uC2B9\uACA9, \uC6B4\uC601 \uC124\uC815 \uBCC0\uACBD \uAC19\uC740 \uACE0\uC704\uD5D8 \uC791\uC5C5\uC744 \uC694\uCCAD\uD558\uB294 \uC0AC\uB78C(Maker)\uACFC \uC774\uB97C \uAC80\uD1A0\xB7\uC2B9\uC778\uD558\uB294 \uC0AC\uB78C(Checker)\uC744 \uBD84\uB9AC\uD574 \uB2E8\uB3C5 \uC2E4\uC218\uB098 \uC545\uC6A9\uC744 \uB9C9\uB294 \uC2B9\uC778 \uC6CC\uD06C\uD50C\uB85C\uC785\uB2C8\uB2E4.",
31026
+ example: "\uB2F4\uB2F9\uC790 A\uAC00 \uB300\uB7C9 \uC815\uC0B0 \uC9C0\uAE09\uC744 \uAE30\uC548\uD558\uB354\uB77C\uB3C4 \uBCF8\uC778 \uACC4\uC815\uC740 \uC2B9\uC778 \uBC84\uD2BC\uC774 \uB9C9\uD600 \uC788\uACE0, \uB2E4\uB978 \uAD00\uB9AC\uC790 B\uAC00 \uB0B4\uC6A9\uC744 \uAC80\uD1A0\uD55C \uB4A4 \uC2B9\uC778\uD574\uC57C\uB9CC \uC2E4\uD589\uB429\uB2C8\uB2E4.",
31027
+ promptSnippet: "\uACE0\uC704\uD5D8 \uC6B4\uC601 \uC791\uC5C5\uC5D0\uB294 \uC694\uCCAD\uC790(Maker)\uC640 \uC2B9\uC778\uC790(Checker)\uB97C \uB3D9\uC77C \uC778\uBB3C\uB85C \uD5C8\uC6A9\uD558\uC9C0 \uC54A\uB294 \uC774\uC911 \uC2B9\uC778 \uC6CC\uD06C\uD50C\uB85C\uB97C \uB450\uACE0, \uC2B9\uC778 \uB9CC\uB8CC \uC2DC\uAC04\xB7\uBC18\uB824 \uC0AC\uC720\xB7\uAC10\uC0AC \uB85C\uADF8\uB97C \uD568\uAED8 \uAE30\uB85D\uD574 \uC918."
31028
+ },
31029
+ en: {
31030
+ definition: "A governance workflow requiring two distinct authorized people\u2014a Maker who initiates a high-risk action and a Checker who independently reviews and approves it.",
31031
+ example: "An operator who drafts a bulk payout or production permission change cannot self-approve; a second reviewer must approve before execution.",
31032
+ promptSnippet: "Enforce Maker-Checker dual-control approval on high-risk actions by blocking self-approval on the backend, adding request expiration and rejection reasons, and logging every decision."
31033
+ }
31034
+ }
31035
+ }
31036
+ };
31037
+
31038
+ // ../../packages/catalog/src/glossary.ts
31039
+ var GLOSSARY_BODIES = {
31040
+ ...UI_GLOSSARY_DATA,
31041
+ ...ENGINEERING_GLOSSARY_DATA,
31042
+ ...WORKFLOW_GLOSSARY_DATA
31043
+ };
31044
+ function buildGlossaryTerm(meta) {
31045
+ const body = GLOSSARY_BODIES[meta.id];
31046
+ if (!body) {
31047
+ throw new Error(`Missing glossary body data for term "${meta.id}"`);
31048
+ }
31049
+ return {
31050
+ ...meta,
31051
+ aliases: body.aliases,
31052
+ text: {
31053
+ ko: { name: meta.name.ko, ...body.text.ko },
31054
+ en: { name: meta.name.en, ...body.text.en }
31055
+ }
31056
+ };
31057
+ }
31058
+ var GLOSSARY_TERMS = GLOSSARY_LINK_META.map(buildGlossaryTerm);
31059
+ var GLOSSARY_BY_ID = new Map(GLOSSARY_TERMS.map((term) => [term.id, term]));
31060
+ function getGlossaryTerm(id) {
31061
+ return GLOSSARY_BY_ID.get(id);
29562
31062
  }
29563
31063
 
29564
- // ../../packages/catalog/src/domain-knowledge-search.ts
29565
- var tokens = createSearchTokenizer(KNOWLEDGE_SYNONYMS, KNOWLEDGE_STOP_WORDS);
29566
- var weights = {
29567
- domain: 35,
29568
- title: 30,
31064
+ // ../../packages/catalog/src/glossary-search.ts
31065
+ var GLOSSARY_SYNONYMS = [
31066
+ ["skeleton", "\uC2A4\uCF08\uB808\uD1A4", "\uBF08\uB300"],
31067
+ ["loading", "\uB85C\uB529", "\uBD88\uB7EC\uC624\uAE30"],
31068
+ ["emptystate", "empty state", "\uBE48 \uC0C1\uD0DC", "\uBE48\uC0C1\uD0DC", "\uBE48 \uD654\uBA74", "\uACB0\uACFC \uC5C6\uC74C", "\uB370\uC774\uD130 \uC5C6\uC74C"],
31069
+ ["validation", "\uC720\uD6A8\uC131 \uAC80\uC99D", "\uC720\uD6A8\uC131 \uAC80\uC0AC", "\uC785\uB825 \uAC80\uC99D", "\uC778\uB77C\uC778 \uC5D0\uB7EC"],
31070
+ ["disclosure", "\uC810\uC9C4\uC801 \uACF5\uAC1C", "\uC811\uAE30 \uD3BC\uCE58\uAE30", "\uC544\uCF54\uB514\uC5B8"],
31071
+ ["toast", "\uD1A0\uC2A4\uD2B8"],
31072
+ ["snackbar", "\uC2A4\uB0B5\uBC14"],
31073
+ ["commandpalette", "command palette", "\uCEE4\uB9E8\uB4DC \uD314\uB808\uD2B8", "\uBA85\uB839 \uD314\uB808\uD2B8", "\uBE60\uB978 \uC2E4\uD589\uCC3D"],
31074
+ ["focustrap", "focus trap", "\uD3EC\uCEE4\uC2A4 \uD2B8\uB7A9", "\uD3EC\uCEE4\uC2A4 \uAC00\uB450\uAE30", "\uCD08\uC810 \uACE0\uC815"],
31075
+ ["virtualscroll", "virtual scroll", "virtual scrolling", "\uAC00\uC0C1 \uC2A4\uD06C\uB864", "\uBAA9\uB85D \uAC00\uC0C1\uD654", "\uC708\uB3C4\uC789"],
31076
+ ["debounce", "\uB514\uBC14\uC6B4\uC2A4", "\uB514\uBC14\uC6B4\uC2F1", "\uC785\uB825 \uC9C0\uC5F0"],
31077
+ ["optimistic", "\uB099\uAD00\uC801"],
31078
+ ["idempotency", "\uBA71\uB4F1\uC131", "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0", "\uC911\uBCF5 \uACB0\uC81C \uB9C9\uAE30", "\uC911\uBCF5 \uC694\uCCAD \uBC29\uC9C0"],
31079
+ ["rbac", "role-based access control", "role based access control", "\uC5ED\uD560 \uAE30\uBC18 \uC811\uADFC \uC81C\uC5B4", "\uC5ED\uD560 \uAE30\uBC18 \uAD8C\uD55C"],
31080
+ ["sse", "server-sent events", "\uC11C\uBC84 \uC804\uC1A1 \uC774\uBCA4\uD2B8", "eventsource"],
31081
+ ["rag", "retrieval-augmented generation", "retrieval augmented generation", "\uAC80\uC0C9 \uC99D\uAC15 \uC0DD\uC131"],
31082
+ ["dlq", "dead-letter queue", "dead letter queue", "\uB370\uB4DC \uB808\uD130 \uD050", "\uC2E4\uD328 \uC791\uC5C5 \uBCF4\uAD00 \uD050"],
31083
+ ["auditlog", "audit log", "audit trail", "\uAC10\uC0AC \uB85C\uADF8", "\uBCC0\uACBD \uC774\uB825"],
31084
+ ["hitl", "human-in-the-loop", "human in the loop", "\uC778\uAC04 \uAC1C\uC785 \uC2B9\uC778", "\uD734\uBA3C\uC778\uB354\uB8E8\uD504"],
31085
+ ["sla", "service-level agreement", "service level agreement", "\uC11C\uBE44\uC2A4 \uC218\uC900 \uD611\uC57D", "\uC751\uB300 \uBAA9\uD45C \uC2DC\uAC04"],
31086
+ ["kyc", "know your customer", "\uACE0\uAC1D \uD655\uC778 \uC808\uCC28", "\uACE0\uAC1D \uC2E0\uC6D0 \uD655\uC778"],
31087
+ ["onboarding", "\uC628\uBCF4\uB529", "\uCD08\uAE30 \uC124\uC815"],
31088
+ ["escrow", "\uC5D0\uC2A4\uD06C\uB85C"],
31089
+ ["proration", "prorated", "pro-rata", "\uC77C\uD560 \uACC4\uC0B0", "\uC77C\uD560\uACC4\uC0B0", "\uD504\uB85C\uB808\uC774\uC158"],
31090
+ ["graceperiod", "grace period", "\uC720\uC608 \uAE30\uAC04", "\uC720\uC608\uAE30\uAC04"],
31091
+ ["makerchecker", "maker-checker", "dual-control", "\uC774\uC911 \uC2B9\uC778", "\uBA54\uC774\uCEE4 \uCCB4\uCEE4", "\uBA54\uC774\uCEE4-\uCCB4\uCEE4", "2\uC778 \uC2B9\uC778"]
31092
+ ];
31093
+ var GLOSSARY_STOP_WORDS = [
31094
+ "\uC6A9\uC5B4",
31095
+ "\uB73B",
31096
+ "\uC758\uBBF8",
31097
+ "\uC124\uBA85",
31098
+ "\uBB50\uC57C",
31099
+ "\uBB34\uC5C7",
31100
+ "\uC54C\uB824\uC918",
31101
+ "\uC54C\uACE0",
31102
+ "\uB300\uD55C",
31103
+ "term",
31104
+ "glossary",
31105
+ "what",
31106
+ "mean",
31107
+ "meaning",
31108
+ "explain",
31109
+ "definition"
31110
+ ];
31111
+ var tokens2 = createSearchTokenizer(GLOSSARY_SYNONYMS, GLOSSARY_STOP_WORDS);
31112
+ var weights2 = {
31113
+ name: 35,
29569
31114
  alias: 28,
29570
- keyword: 20,
29571
- useCase: 18,
29572
- summary: 12,
29573
- concept: 10,
29574
- workflow: 8,
29575
- pitfall: 8,
29576
- question: 6,
29577
- example: 3
31115
+ definition: 12,
31116
+ example: 6,
31117
+ prompt: 2
29578
31118
  };
29579
- var index = /* @__PURE__ */ new Map();
29580
- function entries(item) {
29581
- const cached = index.get(item);
31119
+ var index2 = /* @__PURE__ */ new Map();
31120
+ function entries2(item) {
31121
+ const cached = index2.get(item);
29582
31122
  if (cached) return cached;
29583
- const texts = [item.text.ko, item.text.en];
29584
31123
  const fields = [
29585
- ["domain", texts.map((text2) => text2.domain)],
29586
- ["title", [item.id, ...texts.map((text2) => text2.title)]],
31124
+ ["name", [item.id, item.name.ko, item.name.en]],
29587
31125
  ["alias", [...item.aliases.ko, ...item.aliases.en]],
29588
- ["keyword", [...item.keywords.ko, ...item.keywords.en]],
29589
- ["useCase", [...item.useCases.ko, ...item.useCases.en]],
29590
- ["summary", texts.flatMap((text2) => [text2.summary, text2.overview])],
29591
- ...["concept", "workflow", "pitfall"].map((field) => [field, texts.flatMap((text2) => (field === "concept" ? text2.concepts : field === "workflow" ? text2.workflow : text2.pitfalls).flatMap((point) => [point.name, point.description]))]),
29592
- ["question", texts.flatMap((text2) => text2.questions)],
29593
- ["example", texts.map((text2) => text2.example)]
31126
+ ["definition", [item.text.ko.definition, item.text.en.definition]],
31127
+ ["example", [item.text.ko.example, item.text.en.example]],
31128
+ ["prompt", [item.text.ko.promptSnippet, item.text.en.promptSnippet]]
29594
31129
  ];
29595
- const result2 = createSearchEntries(fields, tokens);
29596
- index.set(item, result2);
31130
+ const result2 = createSearchEntries(fields, tokens2);
31131
+ index2.set(item, result2);
29597
31132
  return result2;
29598
31133
  }
29599
- function rankDomainKnowledge(query = "") {
29600
- if (!query.trim()) return DOMAIN_KNOWLEDGE.map((item) => ({ item, score: 0, matchedOn: [] }));
29601
- const queryTokens = tokens(query);
31134
+ function rankGlossaryTerms(query = "") {
31135
+ if (!query.trim()) {
31136
+ return GLOSSARY_TERMS.map((item) => ({ item, score: 0, matchedOn: [] }));
31137
+ }
31138
+ const queryTokens = tokens2(query);
29602
31139
  const normalizedQuery = normalizeSearchText(query);
29603
31140
  const results = [];
29604
- for (const item of DOMAIN_KNOWLEDGE) {
29605
- const allEntries = entries(item);
29606
- const exact = allEntries.find((entry) => entry.normalizedValue === normalizedQuery);
29607
- const result2 = rankSearchEntries(allEntries, queryTokens, weights, exact, exact?.field === "domain" || exact?.field === "title" ? 150 : 100);
31141
+ for (const item of GLOSSARY_TERMS) {
31142
+ const allEntries = entries2(item);
31143
+ const exact = allEntries.find((entry) => entry.field !== "prompt" && entry.normalizedValue === normalizedQuery);
31144
+ const exactBonus = exact?.field === "name" ? 150 : exact?.field === "alias" ? 120 : 100;
31145
+ const result2 = rankSearchEntries(allEntries, queryTokens, weights2, exact, exactBonus);
29608
31146
  if (result2) results.push({ item, ...result2 });
29609
31147
  }
29610
31148
  return results.sort((a, b) => b.score - a.score);
@@ -29719,11 +31257,11 @@ var SEARCH_SYNONYMS = [
29719
31257
  ["spectrum", "\uC2A4\uD399\uD2B8\uB7FC"],
29720
31258
  ["ticker", "\uD2F0\uCEE4", "\uB274\uC2A4\uB760"]
29721
31259
  ];
29722
- var tokens2 = createSearchTokenizer(SEARCH_SYNONYMS);
29723
- var weights2 = { title: 30, alias: 28, keyword: 20, useCase: 18, target: 8, trigger: 6, summary: 12, prompt: 1 };
29724
- var index2 = /* @__PURE__ */ new Map();
29725
- function entries2(item) {
29726
- const cached = index2.get(item);
31260
+ var tokens3 = createSearchTokenizer(SEARCH_SYNONYMS);
31261
+ var weights3 = { title: 30, alias: 28, keyword: 20, useCase: 18, target: 8, trigger: 6, summary: 12, prompt: 1 };
31262
+ var index3 = /* @__PURE__ */ new Map();
31263
+ function entries3(item) {
31264
+ const cached = index3.get(item);
29727
31265
  if (cached) return cached;
29728
31266
  const en = getTechniqueText(item, "en");
29729
31267
  const meta = getSearchMetadata(item);
@@ -29737,21 +31275,21 @@ function entries2(item) {
29737
31275
  ["summary", [item.summary, en.summary]],
29738
31276
  ["prompt", [item.promptSnippet, en.promptSnippet]]
29739
31277
  ];
29740
- const result2 = createSearchEntries(fields, tokens2);
29741
- index2.set(item, result2);
31278
+ const result2 = createSearchEntries(fields, tokens3);
31279
+ index3.set(item, result2);
29742
31280
  return result2;
29743
31281
  }
29744
31282
  function rank(item, query, queryTokens) {
29745
31283
  if (!query.trim()) return { item, score: 0, matchedOn: [] };
29746
31284
  const normalizedQuery = normalizeSearchText(query);
29747
- const allEntries = entries2(item);
31285
+ const allEntries = entries3(item);
29748
31286
  const exact = allEntries.find((entry) => entry.field !== "prompt" && entry.normalizedValue === normalizedQuery);
29749
- const result2 = rankSearchEntries(allEntries, queryTokens, weights2, exact, exact?.field === "title" ? 150 : 100);
31287
+ const result2 = rankSearchEntries(allEntries, queryTokens, weights3, exact, exact?.field === "title" ? 150 : 100);
29750
31288
  return result2 ? { item, ...result2 } : null;
29751
31289
  }
29752
31290
  function searchTechniques(options = {}) {
29753
31291
  const query = options.query ?? "";
29754
- const queryTokens = tokens2(query);
31292
+ const queryTokens = tokens3(query);
29755
31293
  const results = [];
29756
31294
  for (const item of TECHNIQUES) {
29757
31295
  if (options.domain && item.domain !== options.domain || options.category && item.category !== options.category) continue;
@@ -29766,10 +31304,10 @@ function searchTechniques(options = {}) {
29766
31304
  // package.json
29767
31305
  var package_default = {
29768
31306
  name: "@keke1933/vibe-dictionary-mcp",
29769
- version: "0.11.0",
31307
+ version: "0.13.0",
29770
31308
  license: "MIT",
29771
31309
  author: "leejh96",
29772
- description: "Read-only local MCP for searching Vibe Dictionary techniques and retrieving implementation prompts",
31310
+ description: "Read-only local MCP for searching Vibe Dictionary techniques, domain knowledge, and glossary terms",
29773
31311
  type: "module",
29774
31312
  repository: {
29775
31313
  type: "git",
@@ -29778,7 +31316,13 @@ var package_default = {
29778
31316
  },
29779
31317
  homepage: "https://leejh96.github.io/vibe-dictionary/",
29780
31318
  bugs: "https://github.com/leejh96/vibe-dictionary/issues",
29781
- keywords: ["mcp", "model-context-protocol", "ui", "prompts", "vibe-coding"],
31319
+ keywords: [
31320
+ "mcp",
31321
+ "model-context-protocol",
31322
+ "ui",
31323
+ "prompts",
31324
+ "vibe-coding"
31325
+ ],
29782
31326
  publishConfig: {
29783
31327
  access: "public",
29784
31328
  registry: "https://registry.npmjs.org/"
@@ -29786,7 +31330,11 @@ var package_default = {
29786
31330
  bin: {
29787
31331
  "vibe-dictionary-mcp": "dist/index.js"
29788
31332
  },
29789
- files: ["dist/index.js", "README.md", "LICENSE"],
31333
+ files: [
31334
+ "dist/index.js",
31335
+ "README.md",
31336
+ "LICENSE"
31337
+ ],
29790
31338
  engines: {
29791
31339
  node: ">=22.12.0"
29792
31340
  },
@@ -29808,7 +31356,7 @@ var package_default = {
29808
31356
 
29809
31357
  // src/server.ts
29810
31358
  var localeSchema = z.enum(["ko", "en"]).default("ko").describe("Output language; search matches both languages regardless of locale.");
29811
- var domainSchema = z.enum(["ui", "motion", "layout", "style", "pixelart", "video"]);
31359
+ var domainSchema = z.enum(["ui", "motion", "layout", "style", "pixelart", "video", "ai"]);
29812
31360
  var categoryIds = [...new Set(Object.values(DOMAIN_CATEGORIES).flatMap((categories) => categories.map(({ id }) => id)))].filter((id) => id !== "all");
29813
31361
  var categorySchema = z.enum(categoryIds);
29814
31362
  var targetSchema = z.enum(TARGETS);
@@ -29831,6 +31379,34 @@ var summaryShape = {
29831
31379
  };
29832
31380
  var readOnlyAnnotations = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
29833
31381
  var knowledgeSummaryShape = { id: z.string(), locale: z.enum(["ko", "en"]), domain: z.string(), title: z.string(), summary: z.string() };
31382
+ var glossaryCategorySchema = z.enum(GLOSSARY_CATEGORIES);
31383
+ var glossaryMatchFieldSchema = z.enum(["name", "alias", "definition", "example", "prompt"]);
31384
+ var glossarySummaryShape = {
31385
+ id: z.string(),
31386
+ locale: z.enum(["ko", "en"]),
31387
+ category: glossaryCategorySchema,
31388
+ name: z.string(),
31389
+ nameKo: z.string(),
31390
+ nameEn: z.string(),
31391
+ definition: z.string(),
31392
+ aliases: z.array(z.string()),
31393
+ relatedTechniqueIds: z.array(z.string()),
31394
+ relatedDomainIds: z.array(z.string())
31395
+ };
31396
+ function summarizeGlossary(item, locale) {
31397
+ return {
31398
+ id: item.id,
31399
+ locale,
31400
+ category: item.category,
31401
+ name: item.text[locale].name,
31402
+ nameKo: item.name.ko,
31403
+ nameEn: item.name.en,
31404
+ definition: item.text[locale].definition,
31405
+ aliases: item.aliases[locale],
31406
+ relatedTechniqueIds: item.relatedTechniqueIds,
31407
+ relatedDomainIds: item.relatedDomainIds
31408
+ };
31409
+ }
29834
31410
  function summarize(item, locale) {
29835
31411
  const text2 = getTechniqueText(item, locale);
29836
31412
  const metadata = getSearchMetadata(item);
@@ -29856,8 +31432,9 @@ function result(output) {
29856
31432
  function createServer() {
29857
31433
  const server = new McpServer({ name: package_default.name, version: package_default.version }, {
29858
31434
  instructions: [
29859
- "Find UI, graphics, layout, style, pixel art and video techniques. Search for a few candidates, compare summaries, useCases and matchedOn fields, then get_technique by exact ID only for the selected prompts.",
29860
- 'Before choosing designs for an education, community, commerce, booking, subscription, collaboration, customer-support, auth/account, notification, CMS/publishing, file/media, marketplace, event/check-in, recruiting/ATS, analytics, security/RBAC, logistics, fintech/wallet, healthcare or form/workflow-automation service, use search_domain_knowledge with a short domain or workflow phrase such as "LMS", "\uD68C\uC6D0 \uC804\uC6A9", "\uBD80\uBD84 \uD658\uBD88", "\uD0C0\uC784\uC2AC\uB86F", "\uC815\uAE30 \uACB0\uC81C", "\uCE78\uBC18", "\uD5EC\uD504\uB370\uC2A4\uD06C", "RBAC", "\uD569\uD3EC\uC7A5" or "\uBCF5\uC2DD \uC6D0\uC7A5". Compare summaries, useCases and matchedOn fields, then call get_domain_knowledge by a returned ID for concepts, workflows, pitfalls, open decisions, sources, related technique IDs and a reference prompt. Search supports bilingual aliases and ranked keyword matching, not semantic AI. If no entry fits, retry fewer terms or a synonym, or browse with an empty query. Workflows and examples are design references, not established policies. Do not assume answers to the open questions. Related designs do not implement the domain rules.',
31435
+ "Find UI, graphics, layout, style, pixel art, video and AI native techniques. Search for a few candidates, compare summaries, useCases and matchedOn fields, then get_technique by exact ID only for the selected prompts.",
31436
+ 'Before choosing designs for an education, community, commerce, booking, subscription, collaboration, customer-support, auth/account, notification, CMS/publishing, file/media, marketplace, event/check-in, recruiting/ATS, analytics, security/RBAC, logistics, fintech/wallet, healthcare, form/workflow-automation or AI agent service, use search_domain_knowledge with a short domain or workflow phrase such as "LMS", "\uD68C\uC6D0 \uC804\uC6A9", "\uBD80\uBD84 \uD658\uBD88", "\uD0C0\uC784\uC2AC\uB86F", "\uC815\uAE30 \uACB0\uC81C", "\uCE78\uBC18", "\uD5EC\uD504\uB370\uC2A4\uD06C", "RBAC", "\uD569\uD3EC\uC7A5", "\uBCF5\uC2DD \uC6D0\uC7A5" or "\uD1A0\uD070 \uC608\uC0B0". Compare summaries, useCases and matchedOn fields, then call get_domain_knowledge by a returned ID for concepts, workflows, pitfalls, open decisions, sources, related technique IDs and a reference prompt. Search supports bilingual aliases and ranked keyword matching, not semantic AI. If no entry fits, retry fewer terms or a synonym, or browse with an empty query. Workflows and examples are design references, not established policies. Do not assume answers to the open questions. Related designs do not implement the domain rules.',
31437
+ 'To look up or clarify UI, engineering or workflow vocabulary such as "skeleton loading", "empty state", "debounce", "optimistic update", "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0", "RBAC" or "\uC774\uC911 \uC2B9\uC778", use search_glossary with a short Korean or English phrase or natural alias. search_glossary searches both languages and aliases regardless of output locale and omits full examples and promptSnippet; call get_glossary_term with a returned ID for the full example, ready-to-use promptSnippet and verified relatedTechniqueIds/relatedDomainIds you can pass directly to get_technique or get_domain_knowledge. Glossary examples and prompts are reference material, not implemented backend policies.',
29861
31438
  "The calling assistant interprets the user request and generates short Korean or English search phrases for one effect at a time. The MCP performs bilingual weighted keyword/alias matching and runs no AI model. Extract concrete effects and targets; omit uncertain filters. For broad requests such as a clean or premium webpage, use the stated purpose and preferences; do not equate an adjective with one fixed style. Ask for clarification when missing context prevents a meaningful choice.",
29862
31439
  "For requests combining techniques, search distinct needs such as style, layout and interaction separately. Retrieve the selected prompts, then decide where each technique applies and compare their visual treatment, inputs and timing for conflicts. The tools do not compose techniques or check compatibility; the calling assistant makes those judgments.",
29863
31440
  "Use target/trigger filters only for required demo inputs. Compare summaries and useCases against the original request. If candidates are missing or unsuitable, retry a synonym, the other language or fewer modifiers, and remove only filters that are not required. Reset offset to zero when changing the query or filters. Do not select an unrelated result merely because it ranks first; clarify if useful candidates still cannot be found. Scores are not probabilities. locale selects output language independently of search language. These read-only tools return reference data only."
@@ -29960,6 +31537,54 @@ function createServer() {
29960
31537
  if (!item) return { isError: true, content: [{ type: "text", text: locale === "en" ? "Domain knowledge ID not found. Use search_domain_knowledge to find a valid ID." : "\uB3C4\uBA54\uC778 \uC9C0\uC2DD ID\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. search_domain_knowledge\uB85C \uC720\uD6A8\uD55C ID\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694." }] };
29961
31538
  return result({ id: item.id, locale, ...item.text[locale], sources: item.sources });
29962
31539
  });
31540
+ server.registerTool("search_glossary", {
31541
+ title: "Search glossary / \uC6A9\uC5B4 \uC0AC\uC804 \uAC80\uC0C9",
31542
+ description: 'Search Korean and English UI, engineering and workflow glossary terms by name, aliases (including natural user descriptions such as "\uACB0\uC81C \uB450 \uBC88 \uBC29\uC9C0"), definition, example and prompt. Bilingual normalization and weighted term coverage rank results regardless of output locale; this is not semantic AI search. Nonempty queries return score (not confidence) and matchedOn field names; empty queries browse catalog order. Non-matching queries return an empty list with total 0. Results exclude full example and promptSnippet; use get_glossary_term with a returned ID for full details and ready-to-use promptSnippet.',
31543
+ inputSchema: {
31544
+ query: z.string().max(500).default("").describe("Short Korean/English term, acronym or natural description; omit to browse."),
31545
+ locale: localeSchema,
31546
+ limit: z.number().int().min(1).max(50).default(20),
31547
+ offset: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).default(0)
31548
+ },
31549
+ outputSchema: {
31550
+ total: z.number().int(),
31551
+ offset: z.number().int(),
31552
+ nextOffset: z.number().int().nullable(),
31553
+ items: z.array(z.object({
31554
+ ...glossarySummaryShape,
31555
+ score: z.number(),
31556
+ matchedOn: z.array(glossaryMatchFieldSchema)
31557
+ }))
31558
+ },
31559
+ annotations: readOnlyAnnotations
31560
+ }, async ({ query, locale, limit, offset }) => {
31561
+ const matches = rankGlossaryTerms(query);
31562
+ const items = matches.slice(offset, offset + limit).map(({ item, score, matchedOn }) => ({
31563
+ ...summarizeGlossary(item, locale),
31564
+ score,
31565
+ matchedOn: matchedOn.map((match) => match.field)
31566
+ }));
31567
+ return result({ total: matches.length, offset, nextOffset: offset + items.length < matches.length ? offset + items.length : null, items });
31568
+ });
31569
+ server.registerTool("get_glossary_term", {
31570
+ title: "Get glossary term / \uC6A9\uC5B4 \uC0C1\uC138 \uC870\uD68C",
31571
+ description: "Retrieve a bilingual glossary term by exact ID in the requested locale (ko default, en supported), including definition, realistic example, ready-to-use promptSnippet, aliases and verified relatedTechniqueIds / relatedDomainIds that can be passed directly to get_technique and get_domain_knowledge. Examples and prompts are reference material, not implemented backend policies. Unknown IDs return an error.",
31572
+ inputSchema: { id: z.string().trim().min(1).max(200), locale: localeSchema },
31573
+ outputSchema: {
31574
+ ...glossarySummaryShape,
31575
+ example: z.string(),
31576
+ promptSnippet: z.string()
31577
+ },
31578
+ annotations: readOnlyAnnotations
31579
+ }, async ({ id, locale }) => {
31580
+ const item = getGlossaryTerm(id);
31581
+ if (!item) return { isError: true, content: [{ type: "text", text: locale === "en" ? "Glossary term ID not found. Use search_glossary to find a valid ID." : "\uC6A9\uC5B4 ID\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. search_glossary\uB85C \uC720\uD6A8\uD55C ID\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694." }] };
31582
+ return result({
31583
+ ...summarizeGlossary(item, locale),
31584
+ example: item.text[locale].example,
31585
+ promptSnippet: item.text[locale].promptSnippet
31586
+ });
31587
+ });
29963
31588
  return server;
29964
31589
  }
29965
31590