1(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([[7177],{ 2 3/***/ 2594: 4/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 5 6"use strict"; 7/* harmony export */ __webpack_require__.d(__webpack_exports__, { 8/* harmony export */ U4: () => (/* binding */ setTrustedIframeSrcdoc), 9/* harmony export */ Yk: () => (/* binding */ writeTrustedHtml), 10/* harmony export */ k_: () => (/* binding */ ensureDefaultTrustedTypesPolicy), 11/* harmony export */ pd: () => (/* binding */ setTrustedInnerHTML), 12/* harmony export */ vn: () => (/* binding */ createTrustedHTML) 13/* harmony export */ }); 14/* unused harmony exports getTrustedTypesPolicy, createTrustedScriptURL, createTrustedScript, setTrustedScriptSrc */ 15let cachedPolicy; 16let cachedDefaultPolicy; 17const POLICY_NAME = "gakuten-tt"; 18const DEFAULT_POLICY_NAME = "default"; 19const DEFAULT_SCRIPT_URL_ORIGINS = [ 20 "https://www.googletagmanager.com", 21 "https://connect.facebook.net", 22 "https://www.clarity.ms", 23 "https://clarity.ms", 24 "https://scripts.clarity.ms", 25 "https://static.ads-twitter.com", 26 "https://c.nox-asp.jp" 27]; 28function getFactory() { 29 if (false) {} 30 const tt = window.trustedTypes; 31 if (!tt || typeof tt.createPolicy !== "function") return null; 32 return tt; 33} 34function normalizeScriptUrl(input) { 35 if (false) {} 36 try { 37 const parsed = new URL(input, window.location.origin); 38 if (parsed.protocol !== "https:" && parsed.protocol !== "http:") { 39 return "about:blank"; 40 } 41 if (parsed.origin === window.location.origin) { 42 return parsed.href; 43 } 44 if (DEFAULT_SCRIPT_URL_ORIGINS.includes(parsed.origin)) { 45 return parsed.href; 46 } 47 } catch { 48 return "about:blank"; 49 } 50 return "about:blank"; 51} 52function ensureDefaultTrustedTypesPolicy() { 53 // Prevent Trusted Types errors during client-side navigation/head updates. 54 if (cachedDefaultPolicy !== undefined) return cachedDefaultPolicy; 55 const factory = getFactory(); 56 if (!factory) { 57 cachedDefaultPolicy = null; 58 return cachedDefaultPolicy; 59 } 60 try { 61 cachedDefaultPolicy = factory.createPolicy(DEFAULT_POLICY_NAME, { 62 createHTML: (input)=>String(input ?? ""), 63 createScriptURL: (input)=>normalizeScriptUrl(String(input ?? "")) 64 }); 65 } catch { 66 cachedDefaultPolicy = null; 67 } 68 return cachedDefaultPolicy; 69} 70function getTrustedTypesPolicy() { 71 if (cachedPolicy !== undefined) return cachedPolicy; 72 const factory = getFactory(); 73 if (!factory) { 74 cachedPolicy = null; 75 return cachedPolicy; 76 } 77 try { 78 cachedPolicy = factory.createPolicy(POLICY_NAME, { 79 createHTML: (input)=>input, 80 createScript: (input)=>input, 81 createScriptURL: (input)=>input 82 }); 83 } catch { 84 cachedPolicy = null; 85 } 86 return cachedPolicy; 87} 88function createTrustedHTML(html) { 89 const policy = getTrustedTypesPolicy(); 90 return policy?.createHTML ? policy.createHTML(html) : html; 91} 92function createTrustedScriptURL(url) { 93 const policy = getTrustedTypesPolicy();
94 return policy?.createScriptURL ? policy.createScriptURL(url) : url; 95} 96function createTrustedScript(script) { 97 const policy = getTrustedTypesPolicy(); 98 return policy?.createScript ? policy.createScript(script) : script; 99} 100function setTrustedInnerHTML(element, html) { 101 const trusted = createTrustedHTML(html); 102 element.innerHTML = trusted; 103} 104function setTrustedScriptSrc(element, url) { 105 const trusted = createTrustedScriptURL(url); 106 element.src = trusted; 107} 108function setTrustedIframeSrcdoc(element, html) { 109 const trusted = createTrustedHTML(html); 110 element.srcdoc = trusted; 111} 112function writeTrustedHtml(doc, html) { 113 const trusted = createTrustedHTML(html); 114 doc.write(trusted); 115} 116 117 118/***/ }), 119 120/***/ 3282: 121/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 122 123"use strict"; 124/* harmony export */ __webpack_require__.d(__webpack_exports__, { 125/* harmony export */ _S: () => (/* binding */ YMD_PATTERN), 126/* harmony export */ n4: () => (/* binding */ diffCalendarDays), 127/* harmony export */ sw: () => (/* binding */ ymdToUtcMs) 128/* harmony export */ }); 129/* unused harmony export DAY_MS */ 130/** 131 * SPEC-K7VJ1TSNGH: æ¦æ¥ã®å·®ã 132 * 133 * ã仿¥ãã使¥å¾ããã¯ãç· åã«ã¬ã³ãã¼ã»å°±æ´»ç®¡çã®è¡ã®å¸¯ã»ããã·ã¥ãã¼ãã® 134 * ã仿¥ãããã¨ãã**åãæå³**ã§ä½¿ããå®è£ ã 2 ã¤æã¤ã¨ãçæ¹ã ã丸ããå¤ãã£ã 135 * ã¨ãã«ã帯ã¯ä»ãã¦ããã®ã«æ®ãæ¥æ°ã¯ 0 æ¥ãã®ãããªé£ãéããéãã«çã¾ããã 136 * 137 * apps/web 㨠apps/mobile ã®ä¸¡æ¹ãèªããReact ã«ã DOM ã«ãä¾åããªãã 138 */ const DAY_MS = 24 * 60 * 60 * 1000; 139/** `YYYY-MM-DD` ã®å½¢ãå¼ã³åºãå´ã®å ¥åæ¤è¨¼ã§ã使ãã */ const YMD_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/; 140/** 141 * `YYYY-MM-DD` ã UTC ã® 0 æã¨ãã¦èªããå½¢å¼ãéãã° nullã 142 * 143 * **apps/web ã® `lib/deadlines/urgency.ts` ããéèªã§ç§»ããã** æåã 1 ã¤ã 144 * å¤ãã¦ããªãï¼`trim` ãè¶³ãçã®ãã¤ãã§ã®æ¹åããããªã ââç§»ãåã¨å¾ã§ 145 * åãä»ããå ¥åãå¤ããã¨ãç· åã®æ®ãæ¥æ°ãéãã«ãããï¼ã 146 */ const ymdToUtcMs = (key)=>{ 147 if (typeof key !== "string") return null; 148 const matched = YMD_PATTERN.exec(key); 149 if (!matched) return null; 150 const year = Number(matched[1]);
151 const month = Number(matched[2]); 152 const day = Number(matched[3]); 153 if (month < 1 || month > 12 || day < 1 || day > 31) return null; 154 const ms = Date.UTC(year, month - 1, day); 155 // 2026-02-30 ã®ãããªç¹°ãä¸ããå ¥åãå¼¾ãï¼Date.UTC ã¯é»ã£ã¦ç¿æã¸éãããï¼ã 156 const round = new Date(ms); 157 if (round.getUTCMonth() !== month - 1 || round.getUTCDate() !== day) return null; 158 return ms; 159}; 160/** 161 * æ¦æ¥ã§ä½æ¥å¾ããã©ã¡ãããèªããªããã° nullã 162 * 163 * **æå»ãæã¡è¾¼ã¾ãªãã** æ¥ä»ã©ããã®å·®ãªã®ã§ãæå·®ã夿éã§ 1 æ¥ãããªãã 164 */ const diffCalendarDays = (targetYmd, todayYmd)=>{ 165 const target = ymdToUtcMs(targetYmd); 166 const today = ymdToUtcMs(todayYmd); 167 if (target === null || today === null) return null; 168 return Math.round((target - today) / DAY_MS); 169}; 170 171 172/***/ }), 173 174/***/ 5029: 175/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 176 177"use strict"; 178/* harmony export */ __webpack_require__.d(__webpack_exports__, { 179/* harmony export */ BrowserLogoutStorageGate: () => (/* binding */ BrowserLogoutStorageGate) 180/* harmony export */ }); 181/* unused harmony export completePendingBrowserLogout */ 182/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10335); 183/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82071); 184/* harmony import */ var _browser_logout_storage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(98996); 185/* __next_internal_client_entry_do_not_use__ completePendingBrowserLogout,BrowserLogoutStorageGate auto */ 186 187 188function csrfToken() { 189 try { 190 const part = document.cookie.split(";").map((entry)=>entry.trim()).find((entry)=>entry.startsWith("csrf_token=")); 191 return part ? decodeURIComponent(part.slice("csrf_token=".length)) : null; 192 } catch { 193 return null; 194 } 195} 196/** Does not mount client storage readers until deletion and server acknowledgement succeed. */ async function completePendingBrowserLogout(browser, fetchImpl, readCsrf) { 197 if (!(0,_browser_logout_storage__WEBPACK_IMPORTED_MODULE_2__/* .clearBrowserStorageAfterLogout */ .j)(browser)) return false; 198 try { 199 let csrf = readCsrf(); 200 if (!csrf) { 201 // Internships excludes /login from middleware, so its GET cannot mint CSRF. 202 // The API path is covered on all three origins. 203 const bootstrap = await fetchImpl("/api/auth/logout-storage-ack", { 204 method: "GET", 205 credentials: "same-origin", 206 cache: "no-store" 207 }); 208 if (!bootstrap.ok) return false; 209 csrf = readCsrf(); 210 } 211 if (!csrf) return false; 212 const response = await fetchImpl("/api/auth/logout-storage-ack", { 213 method: "POST", 214 credentials: "same-origin", 215 headers: { 216 "x-gkt-logout-cleanup": "1", 217 "x-csrf-token": csrf 218 } 219 }); 220 return response.ok; 221 } catch { 222 return false; 223 } 224} 225function BrowserLogoutStorageGate({ pending, children }) { 226 const [blocked, setBlocked] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(pending); 227 const [attempt, setAttempt] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0); 228 const retry = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>setAttempt((current)=>current + 1), []); 229 (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{ 230 if (!blocked) return; 231 let mounted = true; 232 void completePendingBrowserLogout(window, fetch, csrfToken).then((done)=>{ 233 if (mounted && done) setBlocked(false); 234 }); 235 return ()=>{ 236 mounted = false; 237 }; 238 }, [ 239 blocked, 240 attempt 241 ]); 242 if (!blocked) return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { 243 children: children 244 }); 245 return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("main", { 246 role: "alert", 247 style: { 248 padding: 24, 249 maxWidth: 520, 250 margin: "10vh auto" 251 }, 252 children: [ 253 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h1", { 254 children: "ä¿åãã¼ã¿ã確èªãã¦ãã¾ã" 255 }), 256 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { 257 children: "åã®ã¢ã«ã¦ã³ãã®ä¿åãã¼ã¿ãåé¤ã§ããã¾ã§ããã®ç»é¢ã表示ãã¦ãã¾ãã" 258 }), 259 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button", { 260 type: "button", 261 onClick: retry, 262 children: "å試è¡" 263 }) 264 ] 265 }); 266} 267 268 269/***/ }), 270 271/***/ 12048: 272/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 273 274"use strict"; 275/* harmony export */ __webpack_require__.d(__webpack_exports__, { 276/* harmony export */ BT: () => (/* binding */ CardDescription), 277/* harmony export */ Wu: () => (/* binding */ CardContent), 278/* harmony export */ ZB: () => (/* binding */ CardTitle),
279/* harmony export */ Zp: () => (/* binding */ Card), 280/* harmony export */ aR: () => (/* binding */ CardHeader), 281/* harmony export */ wL: () => (/* binding */ CardFooter) 282/* harmony export */ }); 283/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10335); 284/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82071); 285/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(86537); 286 287 288 289const Card = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { 290 ref: ref, 291 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)("rounded-lg border bg-card text-card-foreground shadow-sm", className), 292 ...props 293 })); 294Card.displayName = "Card"; 295const CardHeader = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { 296 ref: ref, 297 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)("flex flex-col space-y-1.5 p-6", className), 298 ...props 299 })); 300CardHeader.displayName = "CardHeader"; 301const CardTitle = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3", { 302 ref: ref, 303 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)("text-2xl font-semibold leading-none tracking-tight", className), 304 ...props 305 })); 306CardTitle.displayName = "CardTitle"; 307const CardDescription = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p", { 308 ref: ref, 309 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)("text-sm text-muted-foreground", className), 310 ...props 311 })); 312CardDescription.displayName = "CardDescription"; 313const CardContent = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { 314 ref: ref, 315 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)("p-6 pt-0", className), 316 ...props 317 })); 318CardContent.displayName = "CardContent"; 319const CardFooter = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div", { 320 ref: ref, 321 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_2__.cn)("flex items-center p-6 pt-0", className), 322 ...props 323 })); 324CardFooter.displayName = "CardFooter"; 325 326 327 328/***/ }), 329 330/***/ 14327: 331/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 332 333"use strict"; 334 335// EXPORTS 336__webpack_require__.d(__webpack_exports__, { 337 i6: () => (/* reexport */ ACTOR_TYPES), 338 Xr: () => (/* reexport */ DEVICE_TYPES), 339 CY: () => (/* reexport */ INTENTS), 340 xG: () => (/* reexport */ SUPPORT_APPS), 341 jZ: () => (/* reexport */ VISIBILITIES), 342 p_: () => (/* reexport */ resolveDeviceType) 343}); 344 345// UNUSED EXPORTS: DEVICE_BREAKPOINTS, isCategoryReachableUnderParent, resolveActorType, selectCategoriesForViewer, selectReachableCategoriesForViewer, toCategoryResponse 346 347;// ../../packages/shared/src/support-chatbot/tree.ts 348/** 349 * ã©ã®ããªã¼ãè¦ããããæ±ºããç´é¢æ°ï¼SPEC-WVA4F4GMQM REQ-07 / AC-01ã»AC-02ã»AC-03ï¼ã 350 * 351 * ãã°ã¤ã³ç¶æ ã¨ãã¼ã«ã¯ãµã¼ããã»ãã·ã§ã³ããå¤å®ãããã¦ã£ã¸ã§ããã«ç¨®å¥ãè¨ãããã®ã¯ 352 * **æªãã°ã¤ã³ã®ã¨ãã ã**ãæ¬çªå®æ¸¬ï¼2026-08-27ï¼ã§ã»ãã·ã§ã³ã® 91% ããã°ã¤ã³ä¸ã§ããã 353 * æ¢ã«ç¥ã£ã¦ããç¸æã«ãå¦çã伿¥ãããè¨ãã¦ããã 354 * 355 * IO ãæããªãï¼å¥ç´ãã¹ãããç´æ¥å©ããããã«ããï¼ãSupabase ç §ä¼ã¯ route å´ã®è²¬åã 356 */ const SUPPORT_APPS = [ 357 "web", 358 "web_ipo", 359 "internships" 360]; 361const ACTOR_TYPES = [ 362 "student", 363 "company", 364 "mentor" 365]; 366const DEVICE_TYPES = [ 367 "all", 368 "pc", 369 "tablet", 370 "smartphone" 371]; 372const VISIBILITIES = [ 373 "all", 374 "logged_in", 375 "guest" 376]; 377const INTENTS = [ 378 "howto", 379 "bug", 380 "request", 381 "account", 382 "billing", 383 "mailbox_mode", 384 "jobhunting_mode", 385 "dynamic" 386]; 387/** 388 * ãã¥ã¼ãã¼ãå¹ ã®å¢çãSPEC ã®å¤ãããã ãã«ç½®ãã 389 * 767 㯠smartphone / 768 㯠tablet / 1023 㯠tablet / 1024 㯠pcã 390 */ const DEVICE_BREAKPOINTS = { 391 smartphoneMax: 767, 392 tabletMax: 1023 393}; 394/** åå¾ã§ããªãã¨ã㯠`pc` ã«åãï¼`all` è¡ã¸ã¯è¡å´ã®ãã©ã¼ã«ããã¯ã§å±ãï¼ã */ function resolveDeviceType(viewportWidth) { 395 if (typeof viewportWidth !== "number" || !Number.isFinite(viewportWidth)) { 396 return "pc"; 397 } 398 if (viewportWidth <= DEVICE_BREAKPOINTS.smartphoneMax) return "smartphone"; 399 if (viewportWidth <= DEVICE_BREAKPOINTS.tabletMax) return "tablet"; 400 return "pc"; 401} 402/** 403 * ãµã¼ãã解決ãããã¼ã«ãã actor_type ãæ±ºããã 404 *
405 * 伿¥ãå ã«è¦ã ââ 伿¥ã¡ã³ãã¼ã§ããã°ä¼æ¥ããªã¼ãåºããã©ã¡ãã§ããªããã°å¦ç 406 * ï¼ãµãã¼ããã£ããã®æ¢å®ã§ãããæªç¥ãã¼ã«ã伿¥å´ã¸åããªãï¼ã 407 */ function resolveActorType(input) { 408 if (input.isCompanyMember) return "company"; 409 if (input.hasMentorRole) return "mentor"; 410 if (input.hasStudentRole) return "student"; 411 return "student"; 412} 413/** 414 * æªãã°ã¤ã³ã«ã¯ `guest` è¡**ã ã**ãè¦ããï¼AC-02: ãã°ã¤ã³å°ç¨ã«ãã´ãªãæ··ããªãï¼ã 415 * ãã°ã¤ã³ä¸ã¯ `all` 㨠`logged_in` ãè¦ããã 416 * åãç¡ãï¼degrade ä¸ï¼ã¨ãã¯çµããªã ââ æ§æåããã®ã¾ã¾éãã 417 */ const isVisibleTo = (row, authState)=>{ 418 if (row.visibility == null) return true; 419 if (authState === "guest") return row.visibility === "guest"; 420 return row.visibility === "all" || row.visibility === "logged_in"; 421}; 422/** 423 * ãã¥ã¼ã¢ã«è¦ããè¡ã ããæ®ãã 424 * 425 * **端æ«å°ç¨è¡ãåªå ãã`all` ã¯ãã©ã¼ã«ããã¯ã¨ãã¦ä½¿ãã** åã `variant_key` 426 * ï¼æ§è¡ã¯ `slug`ãããã«ç¡ããã° `label`ï¼ã§ 427 * å°ç¨è¡ã¨ `all` è¡ã両æ¹ããã¨ãã¯å°ç¨è¡ã ããæ®ãã両æ¹è¿ãã¨åã鏿è¢ã 2 ã¤ä¸¦ã¶ã 428 * 429 * æ°åãç¡ã DBï¼degrade ä¸ï¼ã§ã¯ `app` / `actor_type` ãªã©ã undefined ã§æ¥ãããã®å ´å㯠430 * çµãè¾¼ã¾ãªã ââ æ§æåï¼`user_type` ã ãã§çµã£ãçµæï¼ããã®ã¾ã¾éãã 431 */ function selectCategoriesForViewer(rows, viewer) { 432 const matched = rows.filter((row)=>{ 433 if (row.is_active === false) return false; 434 if (row.app != null && row.app !== viewer.app) return false; 435 // æªãã°ã¤ã³ã®ä¼æ¥ã¯å¦çã¨åãã²ã¹ãããªã¼ã¸åæµããã®ã§ãã²ã¹ãã§ã¯ actor_type ãè¦ãªã 436 // ï¼`visibility = guest` ãæ¢ã«ããªã¼ãçµã£ã¦ããï¼ã 437 if (row.actor_type != null && viewer.authState === "authenticated" && row.actor_type !== viewer.actorType) { 438 return false; 439 } 440 if (!isVisibleTo(row, viewer.authState)) return false; 441 const deviceType = row.device_type ?? "all"; 442 if (deviceType !== "all" && deviceType !== viewer.deviceType) return false; 443 return true; 444 }); 445 const keyOf = (row)=>row.variant_key ?? row.slug ?? row.label; 446 const hasDedicated = new Set(matched.filter((row)=>(row.device_type ?? "all") !== "all").map((row)=>keyOf(row))); 447 return matched.filter((row)=>(row.device_type ?? "all") !== "all" || !hasDedicated.has(keyOf(row))).sort((a, b)=>a.sort_order - b.sort_order); 448} 449/** 450 * 親ã®ä¸ã«ç½®ããåããå°ãªãã¨ã 1 人㮠viewer ããå°éã§ãããã 451 * 452 * `selectReachableCategoriesForViewer` 㯠**viewer æ¡ä»¶ã§åè¡ãçµã£ã¦ãã**親ã辿ãã 453 * ãããã£ã¦è¦ªã¨åã®è¡¨ç¤ºæ¡ä»¶ã«å ±éã® viewer ã 1 人ãå± ãªãã¨ããã®åã¯ã©ã®ç»é¢ã«ã 454 * åºãªãï¼ä¿åã¯æåããã®ã§ãadmin ã«ã¯ãä¿åã§ããã®ã«åºãªããã¨ããè¦ããªãï¼ã 455 * èªã¿æã¨åã 3 ã¤ã®è¿°èªãããã®æ¡ä»¶ãå°ã ââ ãããèªã¿æã¨å¥ã«æ¸ãã¨å¿ ãé£ãéãã 456 * 457 * åãç¡ãï¼degrade ä¸ï¼å¤ã¯ãå¶ç´ãªããã¨ãã¦æ±ããæ§æåãå¤ããªãã 458 */ function isCategoryReachableUnderParent(parent, child) { 459 // ã²ã¹ãããªã¼ã¨ãã°ã¤ã³å¾ããªã¼ã¯ `isVisibleTo` ãæä»ã«æ¯ãåããã 460 const parentGuest = parent.visibility === "guest"; 461 const childGuest = child.visibility === "guest"; 462 if (parent.visibility != null && child.visibility != null && parentGuest !== childGuest) { 463 return false; 464 } 465 // ã²ã¹ãã§ã¯ actor_type ãè¦ãªãã®ã§ï¼ä¸ã® filter ã¨åãè¦åï¼ãããã ãçªãåãããªãã 466 if (!parentGuest && parent.actor_type != null && child.actor_type != null && parent.actor_type !== child.actor_type) { 467 return false; 468 } 469 const parentDevice = parent.device_type ?? "all"; 470 const childDevice = child.device_type ?? "all"; 471 if (parentDevice !== "all" && childDevice !== "all" && parentDevice !== childDevice) { 472 return false;
473 } 474 return true; 475} 476/** 477 * 表示å¯è½ãª root ãã辿ããè¡ã ããæ®ãã 478 * 479 * åèªèº«ã active / viewer ä¸è´ã§ãã親ãç¡å¹ã»å¥ actorã»å¥ç«¯æ«ãªã UI ããã¯å°éä¸è½ã 480 * FAQ ã® ID ç´æå®ãå ¨ææ¤ç´¢ã§ãåãå°éå¯è½æ§ã使ããé ããæãåé²åºãããªãã 481 */ function selectReachableCategoriesForViewer(rows, viewer) { 482 const visible = selectCategoriesForViewer(rows, viewer); 483 const reachable = new Set(); 484 for (const row of visible){ 485 if (row.parent_id == null) reachable.add(row.id); 486 } 487 let changed = true; 488 while(changed){ 489 changed = false; 490 for (const row of visible){ 491 if (!reachable.has(row.id) && typeof row.parent_id === "string" && reachable.has(row.parent_id)) { 492 reachable.add(row.id); 493 changed = true; 494 } 495 } 496 } 497 return visible.filter((row)=>reachable.has(row.id)); 498} 499function toCategoryResponse(row) { 500 const response = { 501 id: row.id, 502 label: row.label, 503 sort_order: row.sort_order 504 }; 505 if (row.slug) response.slug = row.slug; 506 if (row.intent) response.intent = row.intent; 507 if (row.area) response.area = row.area; 508 if (row.deep_link) response.deep_link = row.deep_link; 509 if (row.route_on_unresolved) response.route_on_unresolved = row.route_on_unresolved; 510 if (row.risk) response.risk = row.risk; 511 return response; 512} 513 514;// ./lib/support-chatbot/tree.ts 515/** 516 * SPEC-ZQTJAC3GJ5: æ£æ¬ã¯ `packages/shared` ã¸ç§»ããï¼ã©ã®ããªã¼ãè¦ãããã®å¤å®ãapps/mobile ãåããã®ãèªãï¼ã 517 * 518 * ããã¯**åã¨ã¯ã¹ãã¼ãã ã**ã«ãããå®è£ ãè¶³ã㨠apps/web 㨠apps/mobile ã§ 519 * 夿ãå²ããåãä¼è©±ãé¢ãã¨ã«å¥ã®åºå£ã»å¥ã®è¡ãå ã«ãªãã 520 * 夿´ã¯å¿ ã `packages/shared/src/support-chatbot/tree.ts` å´ã§è¡ãã 521 */ 522 523 524/***/ }), 525 526/***/ 15284: 527/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 528 529"use strict"; 530/* harmony export */ __webpack_require__.d(__webpack_exports__, { 531/* harmony export */ $B: () => (/* binding */ noteImadokoLetterJobOpened), 532/* harmony export */ $x: () => (/* binding */ noteImadokoLetterClosed), 533/* harmony export */ Ck: () => (/* binding */ handImadokoLetterReturn), 534/* harmony export */ YZ: () => (/* binding */ takeImadokoLetterTrigger), 535/* harmony export */ ij: () => (/* binding */ observeImadokoLetterReturnPath), 536/* harmony export */ vH: () => (/* binding */ subscribeImadokoLetterTrigger) 537/* harmony export */ }); 538/* unused harmony exports LETTER_TRIGGER_FALLBACK_MS, LETTER_RETURN_TTL_MS, isImadokoLetterReturnFresh, resetImadokoLetterBridgeForTest */ 539/* harmony import */ var _hei_shared_src_match_invite_copy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16537); 540/* harmony import */ var _hei_shared_src_student_popups_popup_gate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(62658); 541/** 542 * 診æã®æç´ããã1 åç®ã®ããããã®å¥æ©ãåãæ¸¡ãï¼SPEC-C0AMWPMX5B REQ-01ã»REQ-07ï¼ã 543 * 544 * - **A**: æç´ããæ±äººã«ã¼ããæ¼ããã«éããï¼`noteImadokoLetterClosed`ï¼ 545 * - **B**: æç´ã®æ±äººã«ã¼ãããæ±äººè©³ç´°ãéããï¼`noteImadokoLetterJobOpened`ï¼ã 546 * å¿åããã«**就活管çï¼`/jobhunting`ï¼ã¸æ»ã£ã**ã¨ãã«åºãï¼`handImadokoLetterReturn`ï¼ 547 * 548 * æç´ï¼`imadoko-diagnosis-popup.tsx`ï¼ã¨ããããï¼`match-invite-popup.tsx`ï¼ã¯å¥ã® 549 * é¨åãªã®ã§ããããä»ãã¦åãæ¸¡ããã©ã¡ãã React ã«ä¾åããªããã®ã¢ã¸ã¥ã¼ã«ãèªãã 550 * 551 * ## A ã¯éããç¬éã«ä¿çãç«ã¦ã 552 * 553 * æç´ãéããã¨è¨ºæã®ã²ã¼ããéããä»åãã¨ãããã£ã¼ã«å ¥åãéããç¶æ ã«ãªãã 554 * ãããããä½ãçµããåã«ãã¡ããéãã¨ãé çªï¼è¨ºæ â ãããã â ä»åã â ãã®ä»ï¼ã 555 * å´©ãããã ãã**æç´ã® `close` ã®ä¸ã§ãåæã«**ä¿çï¼`holdMatchInvite`ï¼ãç«ã¦ãã 556 * ããããã®é¨åãåãåã£ã¦ä½ãçµãããå¤ããåãåãããªãã¾ã¾æ®ããªãããã 557 * ä¿éºã®ã¿ã¤ãã¼ã§å¤ãï¼åãåã£ãæç¹ã§æ¢ããï¼ã 558 * 559 * ## B ã¯ææ¸ãã¾ãã 560 * 561 * æç´ã®æ±äººã«ã¼ãã¯ç´ ã® `<a>` ã§ææ¸ãã¨é·ç§»ããã®ã§ãå°ã¯**ã¿ãã®ä¿åé å**ã¸ç½®ãã 562 * 30 åã§å¤±å¹ããæ±äººè©³ç´°ãã就活管ç以å¤ã®ãã¼ã¸ã¸ç§»ã£ããæ¨ã¦ã 563 * ï¼`observeImadokoLetterReturnPath`ãã¢ããªå ¨ä½ã«è¼ã `app/providers.tsx` ãå¼ã¶ï¼ã 564 */ 565 566/** æç´ãéãã¦ããããããã®é¨åãåãåãã¾ã§ã®ä¿éºï¼åãåãããªããã°ä¿çãå¤ãï¼ã */ const LETTER_TRIGGER_FALLBACK_MS = 15000; 567/** B ã®å°ã®å¯¿å½ã */ const LETTER_RETURN_TTL_MS = 30 * 60 * 1000; 568let pending = null; 569let fallbackTimer = null; 570const listeners = new Set(); 571function clearFallback() { 572 if (fallbackTimer !== null) { 573 clearTimeout(fallbackTimer); 574 fallbackTimer = null; 575 } 576} 577/** 578 * 奿©ãé ãã¦ç½®ãå ´ã¸ç¥ããããä¿çï¼`holdMatchInvite`ï¼ãåæã«ç«ã¦ãåãåãããªãã¾ã¾ 579 * æ®ããªãããä¿éºã®ã¿ã¤ãã¼ã§å¤ãï¼åãåã£ãæç¹ã§æ¢ããï¼ãA 㨠B ãåãå£ãéãã 580 */ function hand(trigger) { 581 pending = trigger; 582 (0,_hei_shared_src_student_popups_popup_gate__WEBPACK_IMPORTED_MODULE_1__/* .holdMatchInvite */ .iU)(); 583 clearFallback(); 584 fallbackTimer = setTimeout(()=>{ 585 fallbackTimer = null; 586 pending = null; 587 (0,_hei_shared_src_student_popups_popup_gate__WEBPACK_IMPORTED_MODULE_1__/* .releaseMatchInvite */ .y9)(); 588 }, LETTER_TRIGGER_FALLBACK_MS); 589 for (const listener of listeners)listener(); 590} 591/** A: æç´ããæ±äººã«ã¼ããæ¼ããã«éããã**æç´ã® `close` ããåæã«å¼ã¶ã** */ function noteImadokoLetterClosed() { 592 hand({ 593 kind: "closed" 594 }); 595} 596/** 597 * é ãã奿©ãåãåãï¼1 度ã ãï¼ãåãåã£ãå´ãä¿çã®å¾å§æ«ãæã¤ã®ã§ã 598 * ä¿éºã®ã¿ã¤ãã¼ã¯ããã§æ¢ããã 599 */ function takeImadokoLetterTrigger() { 600 const taken = pending; 601 pending = null; 602 if (taken) clearFallback(); 603 return taken; 604} 605function subscribeImadokoLetterTrigger(listener) { 606 listeners.add(listener); 607 return ()=>{ 608 listeners.delete(listener); 609 }; 610} 611/* ââ B: æ±äººããæ»ã£ã âââââââââââââââââââââââââââââââââââââââââââââ */ // åºåãã¯ã³ãã³ï¼gitleaks ã® generic-api-key ãæ´ã¾ãªãå½¢ã`visit-gate.ts` ã¨åãçç±ï¼ã 612const LETTER_RETURN_STORAGE_KEY = "jobhunting:imadoko-letter-job:v1"; 613const isRecord = (value)=>typeof value === "object" && value !== null && !Array.isArray(value); 614function readStoredReturn() { 615 if (false) {} 616 try { 617 const raw = window.sessionStorage.getItem(LETTER_RETURN_STORAGE_KEY); 618 if (!raw) return null; 619 const parsed = JSON.parse(raw);
620 if (!isRecord(parsed)) return null; 621 const { jobId, at } = parsed; 622 if (!(0,_hei_shared_src_match_invite_copy__WEBPACK_IMPORTED_MODULE_0__/* .isMatchInviteId */ .Ui)(jobId) || typeof at !== "number" || !Number.isFinite(at)) return null; 623 return { 624 jobId: jobId.toLowerCase(), 625 at 626 }; 627 } catch { 628 return null; 629 } 630} 631function clearStoredReturn() { 632 if (false) {} 633 try { 634 window.sessionStorage.removeItem(LETTER_RETURN_STORAGE_KEY); 635 } catch { 636 // ä¿åé åã触ããªãç°å¢ã§ã¯ãå°ãããããç½®ãã¦ããªãã 637 } 638} 639/** B ã®å°ãç½®ãã**æç´ã® `openJob` ããå¼ã¶**ï¼é·ç§»ã®æ¢å®åä½ãæ¢ããªãï¼ã */ function noteImadokoLetterJobOpened(jobId, now = Date.now()) { 640 if ( false || !(0,_hei_shared_src_match_invite_copy__WEBPACK_IMPORTED_MODULE_0__/* .isMatchInviteId */ .Ui)(jobId)) return; 641 try { 642 const value = { 643 jobId: jobId.toLowerCase(), 644 at: now 645 }; 646 window.sessionStorage.setItem(LETTER_RETURN_STORAGE_KEY, JSON.stringify(value)); 647 } catch { 648 // ç½®ããªããã° B ã¯åºãªãã ãï¼A 㨠2 åç®ä»¥éã¯å±ãï¼ã 649 } 650} 651/** å°ãçãã¦ãããï¼30 åï¼ãç´é¢æ°ã */ function isImadokoLetterReturnFresh(at, now) { 652 return now >= at && now - at <= LETTER_RETURN_TTL_MS; 653} 654/** æ±äººè©³ç´°ã®ãã¹ï¼`/jobs/<id>`ï¼ãã */ function isJobDetailPath(pathname, jobId) { 655 return pathname.replace(/\/+$/, "").toLowerCase() === `/jobs/${jobId}`; 656} 657/** 658 * ãã¾è¦ã¦ãããã¹ãåãåããå°ãæ¨ã¦ãã¹ããªãæ¨ã¦ãã 659 * 660 * æ®ãã¦ããã®ã¯ããã®æ±äººã®è©³ç´°ã¨ã就活管çï¼æ»ã£ã¦ããå ï¼ã ãããã以å¤ã¸ç§»ã£ãã 661 * ã就活管çã¸æ»ã£ããã§ã¯ãªãã®ã§æ¨ã¦ãã 662 */ function observeImadokoLetterReturnPath(pathname, now = Date.now()) { 663 if (!pathname) return; 664 const stored = readStoredReturn(); 665 if (!stored) return; 666 if (!isImadokoLetterReturnFresh(stored.at, now)) { 667 clearStoredReturn(); 668 return; 669 } 670 if (isJobDetailPath(pathname, stored.jobId)) return; 671 if (pathname.replace(/\/+$/, "") === _hei_shared_src_match_invite_copy__WEBPACK_IMPORTED_MODULE_0__/* .MATCH_INVITE_OPEN_PATH */ .r6) return; 672 clearStoredReturn(); 673} 674/** 675 * 就活管çã¸æ»ã£ãã¨ãã«å°ãåãåãï¼1 度ã ãï¼ãA ã¨åãå£ã§ç½®ãå ´ã¸é ããã 676 * 就活管çã§ãªãã»å°ãç¡ãã»å¤±å¹ãã¦ããã°ä½ãããªããé ããã trueã 677 */ function handImadokoLetterReturn(pathname, now = Date.now()) { 678 if (!pathname || pathname.replace(/\/+$/, "") !== _hei_shared_src_match_invite_copy__WEBPACK_IMPORTED_MODULE_0__/* .MATCH_INVITE_OPEN_PATH */ .r6) return false; 679 const stored = readStoredReturn(); 680 if (!stored) return false; 681 clearStoredReturn(); 682 if (!isImadokoLetterReturnFresh(stored.at, now)) return false; 683 hand({ 684 kind: "returned", 685 jobId: stored.jobId 686 }); 687 return true; 688} 689/** ãã¹ãç¨ãé ãã奿©ã¨ä¿éºãæ¨ã¦ãï¼æ¬çªã®ã³ã¼ãããå¼ã°ãªãï¼ã */ function resetImadokoLetterBridgeForTest() { 690 pending = null; 691 clearFallback(); 692 listeners.clear(); 693 clearStoredReturn(); 694} 695 696 697/***/ }), 698 699/***/ 22745: 700/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 701 702"use strict"; 703/* harmony export */ __webpack_require__.d(__webpack_exports__, { 704/* harmony export */ HF: () => (/* binding */ useBottomActionBarHeight), 705/* harmony export */ vI: () => (/* binding */ useBottomNavHeight) 706/* harmony export */ }); 707/* unused harmony exports BOTTOM_ACTION_BAR_HEIGHT_VAR, BOTTOM_NAV_HEIGHT_VAR */ 708/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82071); 709/* __next_internal_client_entry_do_not_use__ BOTTOM_ACTION_BAR_HEIGHT_VAR,BOTTOM_NAV_HEIGHT_VAR,useBottomActionBarHeight,useBottomNavHeight auto */ 710/** 711 * SPEC-TWRZ3306YB: ç»é¢ã®ä¸ã«åºå®ã§åºããã®ã®é«ãã publish ããå¯ä¸ã®çµè·¯ã 712 * 713 * ## ãªã 1 ç®æã«ç½®ãã®ã 714 * 715 * ç»é¢ã®ä¸ã«ã¯ 3 ã¤ãéãªã£ã¦åºãã 716 * 717 * | è¦ç´ | ä½ç½® | åºãå¹ | 718 * |---|---|---| 719 * | ä¸é¨ããï¼`components/mobile-navigation.tsx`ï¼ | ç»é¢ã®æä¸æ®µ | `md` æªæº | 720 * | åºå® CTA å¸¯ï¼æ±äººè©³ç´°ã»ãããã£ã¼ã«ä¿åï¼ | ä¸é¨ããã®ä¸ | `lg` æªæº | 721 * | ãµãã¼ããã£ããã®èµ·åãã¿ã³ | CTA 帯ã®ä¸ | 常æ | 722 * 723 * ããããããä¸ããä½ px ããã**èªåã§æã¤**ã¨ãä¸ã®æ®µãä¸ã®æ®µã®å®å¯¸ãç¥ããªãã¾ã¾ 724 * æ°å¤ãç¼ãä»ãããã¨ã«ãªããå®éãããªã£ã¦ãã¦ã 725 * 726 * - èµ·åãã¿ã³ã¯ CTA 帯ã¨åã 64px ã«åºå®ã§åºã¦ããã®ã§å¿ ãéãªã£ã¦ãã 727 * - CTA 帯ã¯ä¸é¨ããã 64px ã¨è¦ãªãã¦ããããå®é㯠53pxï¼`sm` 以ä¸ã§ 55pxã 728 * `md` 以ä¸ã§ã¯ 0pxï¼ãªã®ã§ããã¿ã³ã®ä¸ã« 11pxã64px ã®ç©ºç½ãæ®ã£ã¦ãã 729 * 730 * é«ãã¯æ¸¬ã£ã¦ publish ããä¸ã«è¼ãå´ã¯å¤æ°ãèªããããã§å¹ ã«ããåºãåãã
731 * èªåã§è¿½å¾ããï¼`display:none` ã®è¦ç´ ã¯é«ã 0 ãè¿ãã`ResizeObserver` 㯠732 * 表示ãåãæ¿ãã£ãã¨ãã«ãçºç«ããï¼ã**ç»é¢å´ã«ãã¬ã¤ã¯ãã¤ã³ãã®åå²ãæ¸ããªãã** 733 * 734 * ## é ãã®ã§ã¯ãªãéãã 735 * 736 * èµ·åãã¿ã³ãæ¶ãã¨ããã®ç»é¢ãããµãã¼ããã£ããã¸ã®å°ç·ã 1 æ¬ãç¡ããªã 737 * ï¼ãªã¼ãã¼å¤æ 2026-09-16ï¼ãé«ãã publish ãã¦ä¸ã¸ãããã ãã«ããã 738 */ const BOTTOM_ACTION_BAR_HEIGHT_VAR = "--app-bottom-action-bar-height"; 739const BOTTOM_NAV_HEIGHT_VAR = "--app-bottom-nav-height"; 740/** 741 * è¦ç´ ã®å®æ¸¬ã®é«ãã CSS 夿°ã¸ publish ããã 742 * 743 * ç»é¢ãé¢ãããå¿ ãæ»ããæ®ãã¨ããã®å¤æ°ãèªãã§ããå¥ã®ç»é¢ã®è¦ç´ ã 744 * åå¨ããªããã¼ã®ã¶ãã ãæµ®ããã¾ã¾ã«ãªãã 745 */ function useElementHeightVar(ref, varName, enabled = true) { 746 (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(()=>{ 747 /* 748 `enabled` ã弿°ã§åãã®ã¯ãè¦ç´ ããæãããªããªã£ãããã¨ã effect 㸠749 ä¼ããææ®µãä»ã«ç¡ããããref ã¯ä¾åã«ãªããªãã®ã§ãæç»ã null 㸠750 å¤ãã£ã¦ã effect ã¯åå®è¡ãããã**publish æ¸ã¿ã®å¤ãæ®ãç¶ãã**ã 751 ãã®ç¶æ ã ã¨ãä¸ã«è¼ãå´ãåå¨ããªããã¼ã®ã¶ãã ãæµ®ãã 752 */ const element = enabled ? ref.current : null; 753 if (!element) { 754 document.documentElement.style.removeProperty(varName); 755 return; 756 } 757 const publish = ()=>{ 758 document.documentElement.style.setProperty(varName, `${element.getBoundingClientRect().height}px`); 759 }; 760 publish(); 761 const observer = new ResizeObserver(publish); 762 observer.observe(element); 763 return ()=>{ 764 observer.disconnect(); 765 document.documentElement.style.removeProperty(varName); 766 }; 767 }, [ 768 enabled, 769 ref, 770 varName 771 ]); 772} 773/** ç»é¢ä¸ã¸åºå®ããæä½ãã¼ï¼æ±äººè©³ç´°ã® CTA 帯ã»ãããã£ã¼ã«ã®ä¿åãã¼ï¼ã */ function useBottomActionBarHeight(ref) { 774 useElementHeightVar(ref, BOTTOM_ACTION_BAR_HEIGHT_VAR); 775} 776/** æä¸æ®µã®ä¸é¨ããã`md` 以ä¸ã§ã¯åºãªãã®ã§ããã®ã¨ã publish ãããå¤ã¯ 0pxã */ function useBottomNavHeight(ref, rendered) { 777 useElementHeightVar(ref, BOTTOM_NAV_HEIGHT_VAR, rendered); 778} 779 780 781/***/ }), 782 783/***/ 23147: 784/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 785 786"use strict"; 787/* harmony export */ __webpack_require__.d(__webpack_exports__, { 788/* harmony export */ gX: () => (/* binding */ readCsrfToken), 789/* harmony export */ lJ: () => (/* binding */ csrfHeaders), 790/* harmony export */ vJ: () => (/* binding */ CSRF_RELOAD_MESSAGE) 791/* harmony export */ }); 792const CSRF_COOKIE = "csrf_token"; 793const CSRF_HEADER = "x-csrf-token"; 794/** 795 * Reads the CSRF cookie issued by proxy.ts. Returns null on the server and 796 * whenever the cookie has not been issued yet. 797 */ function readCsrfToken() { 798 if (typeof document === "undefined") return null; 799 const pair = document.cookie.split(";").map((item)=>item.trim()).find((item)=>item.startsWith(`${CSRF_COOKIE}=`)); 800 return pair ? decodeURIComponent(pair.slice(CSRF_COOKIE.length + 1)) : null; 801} 802/** 803 * Header fragment for browser-originated non-GET /api/* requests. proxy.ts 804 * rejects them with 403 invalid_csrf unless the header matches the cookie. 805 */ function csrfHeaders() { 806 const token = readCsrfToken(); 807 return token ? { 808 [CSRF_HEADER]: token 809 } : {}; 810} 811/** 812 * Japanese message for a rejected or unavailable CSRF token. The cookie is 813 * re-issued on the next document load, so reloading is the recovery path. 814 */ const CSRF_RELOAD_MESSAGE = "ç»é¢ã®æ¥ç¶æ å ±ãæ´æ°ããå¿ è¦ãããã¾ãããã¼ã¸ãåèªã¿è¾¼ã¿ãã¦ããä¸åº¦ã試ããã ããã"; 815 816 817/***/ }), 818 819/***/ 27181: 820/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { 821 822Promise.resolve(/* import() eager */).then(__webpack_require__.t.bind(__webpack_require__, 39884, 23)); 823; 824Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 48398)); 825; 826Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 74685)); 827; 828Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 31658)); 829; 830Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 91893)); 831; 832Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 87876)); 833; 834Promise.resolve(/* import() eager */).then(__webpack_require__.bind(__webpack_require__, 5029)); 835 836 837/***/ }), 838 839/***/ 31658: 840/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 841 842"use strict"; 843 844// EXPORTS 845__webpack_require__.d(__webpack_exports__, { 846 "default": () => (/* binding */ AppChrome) 847}); 848 849// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/compiled/react/jsx-runtime.js 850var jsx_runtime = __webpack_require__(10335); 851// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/compiled/react/index.js 852var react = __webpack_require__(82071); 853// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/api/navigation.js 854var navigation = __webpack_require__(30737); 855// EXTERNAL MODULE: ./components/ui/sidebar.tsx 856var sidebar = __webpack_require__(34122);
857// EXTERNAL MODULE: ./components/Layout.tsx + 1 modules 858var Layout = __webpack_require__(74787); 859// EXTERNAL MODULE: ./components/header.tsx 860var header = __webpack_require__(42730); 861// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/client/app-dir/link.js 862var app_dir_link = __webpack_require__(13884); 863var link_default = /*#__PURE__*/__webpack_require__.n(app_dir_link); 864// EXTERNAL MODULE: ./components/ui/lazy-image.tsx 865var lazy_image = __webpack_require__(91500); 866// EXTERNAL MODULE: ./components/ui/separator.tsx 867var separator = __webpack_require__(78663); 868;// ./components/footer.tsx 869/* __next_internal_client_entry_do_not_use__ default auto */ 870 871 872 873 874/** 875 * Siteâwide footer component. 876 * Uses Tailwindâs responsive utilities: 877 * - singleâcolumn on mobile 878 * - two columns â¥Â md 879 * - four columns â¥Â lg 880 */ function Footer() { 881 const pathname = (0,navigation.usePathname)() ?? ""; 882 const studentPrefixes = [ 883 '/dashboard', 884 '/analysis', 885 '/selection', 886 '/case', 887 '/calendar', 888 '/interested-events', 889 '/library', 890 '/diagnosis', 891 '/ES', 892 '/favorites', 893 '/scouts', 894 '/applications', 895 '/career-edit', 896 '/profile', 897 '/resume', 898 '/chat' 899 ]; 900 if (pathname.startsWith("/admin") || pathname.startsWith("/company") || studentPrefixes.some((prefix)=>pathname.startsWith(prefix))) { 901 return null; // Hide footer on admin, company, andå¦çãã¼ã¿ã«ã®ãã¼ã¸ 902 } 903 return /*#__PURE__*/ (0,jsx_runtime.jsx)("footer", { 904 className: "bg-white py-8 md:py-12", 905 children: /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 906 className: "container mx-auto px-4 md:px-6", 907 children: [ 908 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 909 className: "grid items-center gap-4 md:grid-cols-[1fr_auto_1fr]", 910 children: [ 911 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 912 className: "flex items-center justify-self-center md:justify-self-start", 913 children: /*#__PURE__*/ (0,jsx_runtime.jsx)(lazy_image/* LazyImage */.o, { 914 src: "/logo.png", 915 alt: "å¦ç転è·ãã´", 916 width: 1500, 917 height: 500, 918 className: "h-12 w-auto", 919 priority: true 920 }) 921 }), 922 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 923 className: "flex w-full flex-col items-center gap-2 justify-self-center text-center md:w-auto md:flex-row md:gap-6 md:text-left", 924 children: [ 925 /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 926 href: "https://gakuten.co.jp/privacy-policy", 927 className: "text-sm text-gray-600 hover:text-gray-900 whitespace-nowrap", 928 children: "ãã©ã¤ãã·ã¼ããªã·ã¼" 929 }), 930 /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 931 href: "https://gakuten.co.jp/terms", 932 className: "text-sm text-gray-600 hover:text-gray-900 whitespace-nowrap", 933 children: "å©ç¨è¦ç´" 934 }), 935 /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 936 href: "https://www.makeculture.jp/", 937 className: "text-sm text-gray-600 hover:text-gray-900 whitespace-nowrap", 938 children: "éå¶ä¼ç¤¾" 939 }), 940 /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 941 href: "/support", 942 className: "text-sm text-gray-600 hover:text-gray-900 whitespace-nowrap", 943 children: "ãåãåãã" 944 }) 945 ] 946 }), 947 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 948 className: "flex justify-self-center space-x-4 md:justify-self-end", 949 children: [ 950 /*#__PURE__*/ (0,jsx_runtime.jsxs)((link_default()), { 951 href: "https://x.com/gakuten_shukatu", 952 className: "text-gray-600 transition-colors hover:text-red-600", 953 "aria-label": "Xï¼Twitterï¼", 954 children: [ 955 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 956 className: "sr-only", 957 children: "Xï¼Twitterï¼" 958 }), 959 /*#__PURE__*/ (0,jsx_runtime.jsx)("svg", { 960 className: "h-6 w-6", 961 fill: "currentColor",
962 viewBox: "0 0 24 24", 963 "aria-hidden": "true", 964 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("path", { 965 d: "M21.742 21.75l-7.563-11.179 7.056-8.321h-2.456l-5.691 6.714-4.54-6.714H2.359l7.29 10.776L2.25 21.75h2.456l6.035-7.118 4.818 7.118h6.191-.008zM7.739 3.818L18.81 20.182h-2.447L5.29 3.818h2.447z" 966 }) 967 }) 968 ] 969 }), 970 /*#__PURE__*/ (0,jsx_runtime.jsxs)((link_default()), { 971 href: "https://www.instagram.com/gakuseitenshoku?igsh=Z2wwMmQyNjR6cmFp&utm_source=qr", 972 className: "text-gray-600 transition-colors hover:text-red-600", 973 "aria-label": "Instagram", 974 children: [ 975 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 976 className: "sr-only", 977 children: "Instagram" 978 }), 979 /*#__PURE__*/ (0,jsx_runtime.jsx)("svg", { 980 className: "h-6 w-6", 981 fill: "currentColor",
982 viewBox: "0 0 24 24", 983 "aria-hidden": "true", 984 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("path", { 985 fillRule: "evenodd", 986 d: "M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.048-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z", 987 clipRule: "evenodd" 988 }) 989 }) 990 ] 991 }) 992 ] 993 }) 994 ] 995 }), 996 /*#__PURE__*/ (0,jsx_runtime.jsx)(separator/* Separator */.w, { 997 className: "my-6 border-t" 998 }), 999 /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 1000 className: "text-center text-sm text-gray-500 mb-4", 1001 children: "\xa9 2025 å¦çè»¢è· All Rights Reserved." 1002 }) 1003 ] 1004 }) 1005 }); 1006} 1007 1008;// ./components/footer-internships.tsx 1009/* __next_internal_client_entry_do_not_use__ default auto */ 1010 1011 1012function InternshipsFooter() { 1013 const pathname = (0,navigation.usePathname)() ?? ""; 1014 const studentPrefixes = [ 1015 "/dashboard", 1016 "/analysis", 1017 "/selection", 1018 "/case", 1019 "/calendar", 1020 "/interested-events", 1021 "/library", 1022 "/diagnosis", 1023 "/ES", 1024 "/favorites", 1025 "/scouts", 1026 "/applications", 1027 "/career-edit", 1028 "/profile", 1029 "/resume", 1030 "/chat" 1031 ]; 1032 if (pathname.startsWith("/admin") || pathname.startsWith("/company") || studentPrefixes.some((prefix)=>pathname.startsWith(prefix))) { 1033 return null; 1034 } 1035 return /*#__PURE__*/ (0,jsx_runtime.jsx)("footer", { 1036 className: "bg-[#0b1220] text-neutral-200", 1037 children: /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1038 className: "container mx-auto px-4 md:px-6 py-14", 1039 children: [ 1040 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1041 className: "grid gap-10 md:grid-cols-2 lg:grid-cols-4", 1042 children: [ 1043 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1044 children: [ 1045 /*#__PURE__*/ (0,jsx_runtime.jsx)("h3", { 1046 className: "text-xl font-extrabold text-orange-500", 1047 children: "æ±äººãæ¢ã" 1048 }), 1049 /*#__PURE__*/ (0,jsx_runtime.jsxs)("ul", { 1050 className: "mt-6 space-y-3 text-base", 1051 children: [ 1052 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1053 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1054 href: "/jobs?selectionType=intern_long", 1055 children: "è·ç¨®ããæ¢ã" 1056 }) 1057 }), 1058 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1059 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1060 href: "/internships#features", 1061 children: "ç¹å¾´ããæ¢ã" 1062 }) 1063 }), 1064 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1065 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1066 href: "/internships#area", 1067 children: "ã¨ãªã¢ããæ¢ã" 1068 }) 1069 }), 1070 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1071 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1072 href: "/internships#ranking", 1073 children: "人æ°ã©ã³ãã³ã°" 1074 }) 1075 }), 1076 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1077 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1078 href: "/jobs", 1079 children: "ãã¹ã¦ã®æ±äºº" 1080 }) 1081 }) 1082 ] 1083 }) 1084 ] 1085 }), 1086 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1087 children: [ 1088 /*#__PURE__*/ (0,jsx_runtime.jsx)("h3", { 1089 className: "text-xl font-extrabold text-orange-500", 1090 children: "è·ç¨®å¥" 1091 }), 1092 /*#__PURE__*/ (0,jsx_runtime.jsxs)("ul", { 1093 className: "mt-6 space-y-3 text-base", 1094 children: [ 1095 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1096 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1097 href: "/jobs?selectionType=intern_long&jobType=å¶æ¥", 1098 children: "å¶æ¥" 1099 }) 1100 }), 1101 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1102 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1103 href: "/jobs?selectionType=intern_long&jobType=ã¨ã³ã¸ãã¢", 1104 children: "ã¨ã³ã¸ãã¢" 1105 }) 1106 }), 1107 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1108 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1109 href: "/jobs?selectionType=intern_long&jobType=ãã¼ã±ãã£ã³ã°", 1110 children: "ãã¼ã±ãã£ã³ã°" 1111 }) 1112 }), 1113 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1114 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1115 href: "/jobs?selectionType=intern_long&jobType=ãã¶ã¤ãã¼", 1116 children: "ãã¶ã¤ãã¼" 1117 }) 1118 }), 1119 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1120 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1121 href: "/jobs?selectionType=intern_long", 1122 children: "ãã®ä»ã®è·ç¨®" 1123 }) 1124 }) 1125 ] 1126 }) 1127 ] 1128 }), 1129 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1130 children: [ 1131 /*#__PURE__*/ (0,jsx_runtime.jsx)("h3", { 1132 className: "text-xl font-extrabold text-orange-500", 1133 children: "ã³ã³ãã³ã" 1134 }), 1135 /*#__PURE__*/ (0,jsx_runtime.jsxs)("ul", { 1136 className: "mt-6 space-y-3 text-base", 1137 children: [ 1138 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1139 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1140 href: "/media", 1141 children: "ã¤ã³ã¿ã¼ã³ä½é¨è¨" 1142 }) 1143 }), 1144 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1145 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1146 href: "/media", 1147 children: "è¨äºä¸è¦§" 1148 }) 1149 }), 1150 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1151 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1152 href: "/internships#what-is", 1153 children: "é·æã¤ã³ã¿ã¼ã³ã¨ã¯" 1154 }) 1155 }), 1156 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1157 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1158 href: "/internships#guide", 1159 children: "é¸ã³æ¹ã¬ã¤ã" 1160 }) 1161 }) 1162 ] 1163 }) 1164 ] 1165 }), 1166 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1167 children: [ 1168 /*#__PURE__*/ (0,jsx_runtime.jsx)("h3", { 1169 className: "text-xl font-extrabold text-orange-500", 1170 children: "å¦è»¢ã¤ã³ã¿ã¼ã³ã«ã¤ãã¦" 1171 }), 1172 /*#__PURE__*/ (0,jsx_runtime.jsxs)("ul", { 1173 className: "mt-6 space-y-3 text-base", 1174 children: [ 1175 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1176 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1177 href: "https://www.makeculture.jp/", 1178 children: "éå¶ä¼ç¤¾" 1179 }) 1180 }), 1181 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1182 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1183 href: "/support", 1184 children: "ãåãåãã" 1185 }) 1186 }), 1187 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1188 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1189 href: "https://gakuten.co.jp/terms", 1190 children: "å©ç¨è¦ç´" 1191 }) 1192 }), 1193 /*#__PURE__*/ (0,jsx_runtime.jsx)("li", { 1194 children: /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1195 href: "https://gakuten.co.jp/privacy-policy", 1196 children: "ãã©ã¤ãã·ã¼ããªã·ã¼" 1197 }) 1198 }) 1199 ] 1200 }) 1201 ] 1202 }) 1203 ] 1204 }), 1205 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 1206 className: "my-10 h-px w-full bg-white/10" 1207 }), 1208 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1209 className: "flex flex-col gap-6 md:flex-row md:items-center md:justify-between", 1210 children: [ 1211 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1212 children: [ 1213 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 1214 className: "text-3xl font-extrabold text-orange-500", 1215 children: "å¦è»¢ã¤ã³ã¿ã¼ã³" 1216 }), 1217 /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 1218 className: "mt-3 text-sm text-neutral-400", 1219 children: "大å¦çã®ããã®é·æã¤ã³ã¿ã¼ã³ã·ããæ±äººãµã¤ã" 1220 }) 1221 ] 1222 }), 1223 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 1224 className: "flex items-center gap-4", 1225 children: [ 1226 /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1227 href: "https://x.com/gakuten_shukatu", 1228 "aria-label": "X", 1229 className: "flex h-10 w-10 items-center justify-center rounded-full bg-white/5 ring-1 ring-white/10 hover:bg-white/10", 1230 children: /*#__PURE_
1230_*/ (0,jsx_runtime.jsx)("svg", { 1231 className: "h-5 w-5", 1232 fill: "currentColor", 1233 viewBox: "0 0 24 24", 1234 "aria-hidden": "true", 1235 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("path", { 1236 d: "M18.244 2H21l-6.64 7.59L21.77 22h-5.52l-4.33-5.9L6.7 22H3.94l7.16-8.19L2.23 2h5.58l3.9 5.38L18.24 2zM17.3 20.33h1.53L7.02 3.61H5.38l11.92 16.72z" 1237 }) 1238 }) 1239 }), 1240 /*#__PURE__*/ (0,jsx_runtime.jsx)((link_default()), { 1241 href: "https://www.instagram.com/gakuseitenshoku?igsh=Z2wwMmQyNjR6cmFp&utm_source=qr", 1242 "aria-label": "Instagram", 1243 className: "flex h-10 w-10 items-center justify-center rounded-full bg-white/5 ring-1 ring-white/10 hover:bg-white/10", 1244 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("svg", { 1245 className: "h-5 w-5", 1246 fill: "currentColor",
1247 viewBox: "0 0 24 24", 1248 "aria-hidden": "true", 1249 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("path", { 1250 fillRule: "evenodd", 1251 d: "M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.048-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z", 1252 clipRule: "evenodd" 1253 }) 1254 }) 1255 }) 1256 ] 1257 }) 1258 ] 1259 }), 1260 /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 1261 className: "mt-8 text-center text-sm text-neutral-400", 1262 children: "\xa9 2025 å¦è»¢ã¤ã³ã¿ã¼ã³. All rights reserved." 1263 }) 1264 ] 1265 }) 1266 }); 1267} 1268 1269// EXTERNAL MODULE: ./lib/ui/bottom-action-bar.ts 1270var bottom_action_bar = __webpack_require__(22745); 1271// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected][email protected]/node_modules/lucide-react/dist/esm/icons/compass.js 1272var compass = __webpack_require__(86274); 1273// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected][email protected]/node_modules/lucide-react/dist/esm/icons/briefcase.js 1274var briefcase = __webpack_require__(81526); 1275// EXTERNAL MODULE: ./lib/auth-context.tsx + 2 modules 1276var auth_context = __webpack_require__(98796); 1277// EXTERNAL MODULE: ./utils/analytics.ts + 1 modules 1278var analytics = __webpack_require__(28572); 1279// EXTERNAL MODULE: ./lib/hooks/use-inbox-unread.ts 1280var use_inbox_unread = __webpack_require__(54739); 1281// EXTERNAL MODULE: ./components/chat/inbox-unread-badge.tsx 1282var inbox_unread_badge = __webpack_require__(19308); 1283;// ./components/mobile-navigation.tsx 1284/* __next_internal_client_entry_do_not_use__ MobileNavigation auto */ 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295// SPEC-0758 / TASK-0758: 就活管çãã¡ãã«ã®å°ç·ã¯ãªãã¯è¨æ¸¬å¯¾è±¡ã«ã¼ãã 1296const JOBHUNTING_NAV_HREF = "/jobhunting"; 1297const STUDENT_MOBILE_PREFIXES = [ 1298 '/dashboard', 1299 '/analysis', 1300 '/career-backcast', 1301 '/selection', 1302 '/ES', 1303 '/case', 1304 '/calendar', 1305 '/interested-events', 1306 '/library', 1307 '/diagnosis', 1308 '/favorites', 1309 '/scouts', 1310 '/applications', 1311 '/career-edit', 1312 '/profile', 1313 '/resume', 1314 '/chat', 1315 '/demo' 1316]; 1317function MobileNavigation({ studentChromeHint = false } = {}) { 1318 const navRef = (0,react.useRef)(null); 1319 const inboxUnread = (0,use_inbox_unread/* useInboxUnread */.x)(); 1320 const pathname = (0,navigation.usePathname)() ?? ""; 1321 const isStudentArea = STUDENT_MOBILE_PREFIXES.some((prefix)=>pathname?.startsWith(prefix)); 1322 const { ready: authReady, userType } = (0,auth_context/* useAuth */.As)(); 1323 // 確å®åã¯ç®å°ã決ãã確å®ãããèªè¨¼ã®å¤ã ããæ±ºããï¼å ±éã¯ãã¼ã ã¨åãï¼ã 1324 const isStudent = (0,react.useMemo)(()=>authReady ? userType === "student" : studentChromeHint, [ 1325 authReady, 1326 userType, 1327 studentChromeHint 1328 ]);
1329 // ããããã¼ã¸ãå¦çä»¥å¤ â é表示 (IPOãã¼ã¸ã¯å¸¸ã«è¡¨ç¤º) 1330 const rendered = isStudent && !(!isStudentArea && pathname === "/"); 1331 /* 1332 SPEC-TWRZ3306YB: é«ãã® publish ã¯æç»ã®æç¡ãã¨ä¼ãããä¸ã®æ©æ return ã§ 1333 null ãè¿ãç»é¢ãããã®ã§ã渡ããªã㨠publish æ¸ã¿ã®å¤ãæ®ãã 1334 ãã®ç»é¢ã®åºå® CTA 帯ãåå¨ããªãããã®ã¶ãã ãæµ®ãã 1335 */ (0,bottom_action_bar/* useBottomNavHeight */.vI)(navRef, rendered); 1336 if (!rendered) return null; 1337 const links = [ 1338 { 1339 href: "/dashboard", 1340 label: "ãã¼ã ", 1341 icon: "home" 1342 }, 1343 { 1344 href: "/jobs", 1345 label: "æ±äººæ¤ç´¢", 1346 icon: "search" 1347 }, 1348 { 1349 href: "/jobhunting", 1350 label: "就活管ç", 1351 icon: "briefcase", 1352 tour: "selection" 1353 }, 1354 // TASK-2054: ã¹ã«ã¦ãã§çµãè¾¼ãã åä¿¡ç®±ã§ã¯ãªããçµ±ååä¿¡ç®±ãã®ãã®ãéãã 1355 // `/scouts` ã¯åããã¼ã¸ãã¹ã«ã¦ãçµãè¾¼ã¿ã§éããããããããå ¥ã㨠1356 // ãã£ãããè¦ããªãã£ãï¼ãä¸ã¤ã®ãã¼ã¸ã§å ¨ã¦è¦ããããªã¼ãã¼æç¤º 2026-08-06ï¼ã 1357 { 1358 href: "/chat", 1359 label: "ãã£ãã", 1360 icon: "envelope" 1361 }, 1362 { 1363 href: "/career-backcast", 1364 label: "èªå·±åæ", 1365 icon: "compass", 1366 tour: "analysis" 1367 } 1368 ]; 1369 return(/* 1370 SPEC-TWRZ3306YB: ãã®é«ãã publish ãããä¸ã«è¼ãåºå® CTA 帯ã 1371 `bottom-16`ï¼64pxï¼ãç¼ãä»ãã¦ããããå®å¯¸ã¯ 53pxï¼`sm` 以ä¸ã¯ 55pxã 1372 `md` 以ä¸ã¯ 0pxï¼ãªã®ã§ããã¿ã³ã®ä¸ã«ç©ºç½ãæ®ã£ã¦ããã 1373 å¹ ã§é«ããå¤ããã®ã§ãæ°å¤ã§ã¯ãªã宿¸¬ãé ãã 1374 */ /*#__PURE__*/ (0,jsx_runtime.jsx)("nav", { 1375 ref: navRef, 1376 "aria-label": "ã¡ã¤ã³ããã²ã¼ã·ã§ã³", 1377 className: "fixed bottom-0 left-0 z-50 w-full border-t bg-white md:hidden", 1378 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 1379 className: "mx-auto flex max-w-md justify-between px-2", 1380 children: links.map((link)=>{ 1381 const isActive = pathname === link.href || pathname.startsWith(link.href + "/"); 1382 const iconStyle = isActive ? { 1383 filter: "brightness(0) saturate(100%) invert(13%) sepia(93%) saturate(3057%) hue-rotate(344deg) brightness(83%) contrast(101%)" 1384 } : { 1385 filter: "grayscale(0.2)" 1386 }; 1387 return /*#__PURE__*/ (0,jsx_runtime.jsxs)((link_default()), { 1388 href: link.href, 1389 onClick: link.href === JOBHUNTING_NAV_HREF ? ()=>// SPEC-0758 / TASK-0758: 就活管çå°ç·ã®ã¯ãªãã¯ã®ã¿è¨æ¸¬ã 1390 // fire-and-forgetï¼sendBeaconï¼ã§é·ç§»ã¯é»å®³ããªãã 1391 void (0,analytics/* trackAnalyticsEvent */.KG)("jobhunting_nav_click", { 1392 surface: "mobile_bottom_nav" 1393 }) : undefined, 1394 className: `flex flex-1 flex-col items-center justify-center py-2 text-[10px] sm:text-[10px] ${isActive ? "text-[#b54427]" : "text-gray-500"}`, 1395 "data-tour-mobile": link.tour, 1396 "aria-current": isActive ? "page" : undefined, 1397 "aria-label": link.href === "/chat" ? `ãã£ãã${inboxUnread.count ? `ãæªèª${inboxUnread.count}ä»¶` : ""}${inboxUnread.unavailable ? "ãæªèªæ°ãæ´æ°ã§ãã¾ãã" : ""}` : undefined, 1398 children: [ 1399 /*#__PURE__*/ (0,jsx_runtime.jsxs)("span", { 1400 className: "relative", 1401 children: [ 1402 /*#__PURE__*/ (0,jsx_runtime.jsx)(MobileNavIcon, { 1403 name: link.icon, 1404 className: "mb-0.5 h-[22px] w-[22px] sm:h-6 sm:w-6", 1405 style: iconStyle 1406 }), 1407 link.href === "/chat" && /*#__PURE__*/ (0,jsx_runtime.jsx)(inbox_unread_badge/* InboxUnreadBadge */.l, {
1408 count: inboxUnread.count, 1409 className: "absolute -right-3 -top-2" 1410 }) 1411 ] 1412 }), 1413 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 1414 className: "line-clamp-1 text-[10px] leading-3", 1415 children: link.label 1416 }) 1417 ] 1418 }, link.href); 1419 }) 1420 }) 1421 })); 1422} 1423function MobileNavIcon({ name, className, style }) { 1424 if (name === "compass") { 1425 return /*#__PURE__*/ (0,jsx_runtime.jsx)(compass/* default */.A, { 1426 className: className, 1427 "aria-hidden": "true" 1428 }); 1429 } 1430 // 就活管çã¯ã¢ããªã®ä¸é¨ã¿ãã¨åãããã°ï¼ãªã¼ãã¼æç¤º 2026-10-01ï¼ã 1431 // èªå·±åæã¨åããæåè²ã§å¡ãã®ã§ã鏿ä¸ã®è²ã¯ãªã³ã¯ã®æåè²ããã®ã¾ã¾å½ããã 1432 if (name === "briefcase") { 1433 return /*#__PURE__*/ (0,jsx_runtime.jsx)(briefcase/* default */.A, { 1434 className: className, 1435 "aria-hidden": "true" 1436 }); 1437 } 1438 const srcMap = { 1439 home: "/home.png", 1440 search: "/search.png", 1441 envelope: "/mail.png" 1442 }; 1443 return /*#__PURE__*/ (0,jsx_runtime.jsx)(lazy_image/* LazyImage */.o, { 1444 src: srcMap[name], 1445 alt: name, 1446 width: 24, 1447 height: 24, 1448 className: className, 1449 style: style, 1450 priority: false 1451 }); 1452} 1453 1454// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected][email protected]/node_modules/lucide-react/dist/esm/icons/chevron-down.js 1455var chevron_down = __webpack_require__(41960); 1456// EXTERNAL MODULE: ./components/ui/button.tsx 1457var ui_button = __webpack_require__(27962); 1458// EXTERNAL MODULE: ./components/ui/card.tsx 1459var card = __webpack_require__(12048); 1460// EXTERNAL MODULE: ./components/ui/input.tsx 1461var input = __webpack_require__(97418); 1462// EXTERNAL MODULE: ./components/ui/scroll-area.tsx 1463var scroll_area = __webpack_require__(50065); 1464// EXTERNAL MODULE: ./lib/utils.ts 1465var utils = __webpack_require__(86537); 1466;// ../../packages/shared/src/support-chatbot/message-format.ts 1467/** 1468 * ãµãã¼ããã£ããã®æ¬ææ´å½¢ï¼ç´é¢æ°ã®ã¿ï¼ã 1469 * 1470 * èæ¯ï¼ç£æ» 2026-08-10ï¼: 1471 * `supabase/migrations/202902210002_seed_support_faq_data.sql` 㯠`E''` ã¨ã¹ã±ã¼ã 1472 * æååãä¸åº¦ã使ãããæ¨æºã®åä¸å¼ç¨ç¬¦ãªãã©ã«ã§ `'...\n...'` ã¨æ¸ãã¦ããã 1473 * ã¤ã¾ã `support_faqs.answer` ã«å ¥ã£ã¦ããã®ã¯æ¹è¡ã§ã¯ãªã 1474 * **ããã¯ã¹ã©ãã·ã¥ã¨ n ã® 2 æå**ã§ããã`whitespace-pre-wrap` ã¯å®å¨ããæ¹è¡æå 1475 * ããæ¹è¡ã«ããªãã®ã§ä½ã®å½¹ã«ãç«ããªããMarkdown 風㮠`**強調**` ãçã®ã¾ã¾åºã¦ããã 1476 * æ¢å migration 㯠append-only ãªã®ã§ãã¼ã¿å´ã¯ç´ããªããæç»å´ã§å¸åããã 1477 * 1478 * apps/web 㨠apps/web_ipo ã§åãæ´å½¢ãè¦ããããCLAUDE.md ã® 1479 * ãapp éã§ãã¡ã¤ã«ãã³ãã¼ããªã â `packages/*` ã«å ±éåãã«å¾ãã 1480 * å¤å®ã»åå²ã®ç´é¢æ°ã ããããã«ç½®ããJSX çæï¼Fragment / strong / brï¼ã¯ 1481 * å app ã® widget ã«æ®ãããã®å±¤ã¯ React ã«ã `next/server` ã«ãä¾åããªãã 1482 */ /** 1483 * `**...**` ã 1 åã®è¦ç´ ã¨ãã¦åãåºããæç²ã°ã«ã¼ãä»ã split ãªã®ã§ 1484 * åå²çµæã«ã¯éãã¼ã«ã¼é¨åã¨ãã¼ã«ã¼é¨åã交äºã«ä¸¦ã¶ã 1485 */ const BOLD_SPLIT_PATTERN = /(\*\*.*?\*\*)/g; 1486/** 1487 * 強調ã¨ãã¦æ±ãæå°ã®é·ãã`**` ã 2 çµï¼4 æåï¼ã¡ããã©ã§ã¯å²ã¾ããæåã 1488 * 0 åãªã®ã§ã空㮠`<strong>` ãä½ãããã®ã¾ã¾æ¬æã¨ãã¦åºãã 1489 */ const BOLD_MARKER_MIN_LENGTH = 5; 1490/** 1491 * DB ã« literal ã§å ¥ã£ã¦ãã¾ã£ãæ¹è¡è¡¨ç¾ãå®éã®æ¹è¡ã¸æ»ãã 1492 * 1493 * `\r\n`ï¼4 æåï¼ãå ã«æ½°ãã¦ãã `\n`ï¼2 æåï¼ãæ½°ããé åºãå ¥ãæ¿ãã㨠1494 * literal `\r\n` ã®å¾åã ããæ¹è¡ã«ãªãã`\r` ãæ¬æã«æ®ãã 1495 */ function normalizeMessageContent(content) {
1496 return content.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n").replace(/\r\n/g, "\n"); 1497} 1498/** 1499 * 1 è¡ããç´ ã®ããã¹ããã¨ã強調ãã«åããã 1500 * 1501 * éãã¦ããªã `**` ã¯ãããããªããããç´ éãã® text ã»ã°ã¡ã³ãã¨ãã¦ãã®ã¾ã¾æ®ã 1502 * ï¼åæã«è£å®ãã¦æ¬æãæ¸ãæããªãï¼ã 1503 */ function splitInlineSegments(text) { 1504 const segments = []; 1505 for (const part of text.split(BOLD_SPLIT_PATTERN)){ 1506 // æç²ã°ã«ã¼ãä»ã split ãå¢çã«æã空æåãæç»å¯¾è±¡ãç¡ãã®ã§è½ã¨ãã 1507 if (part === "") continue; 1508 if (part.startsWith("**") && part.endsWith("**") && part.length >= BOLD_MARKER_MIN_LENGTH) { 1509 segments.push({ 1510 kind: "bold", 1511 value: part.slice(2, -2) 1512 }); 1513 continue; 1514 } 1515 segments.push({ 1516 kind: "text", 1517 value: part 1518 }); 1519 } 1520 return segments; 1521} 1522/** 1523 * æ¬æããè¡ â ã»ã°ã¡ã³ããã®äºæ¬¡å ãã¼ã¿ã«ããã 1524 * 1525 * è¡åºåãã¯å¼ã³åºãå´ã `<br />` ã«ã`bold` 㯠`<strong>` ã«åãã ãã§ããã 1526 * 空è¡ã¯ã»ã°ã¡ã³ã 0 åã®è¡ã¨ãã¦æ®ãï¼è¡æ°ãä¿ã¤ï¼æ¹è¡ãæ¶ããªãï¼ã 1527 */ function splitFormattedLines(content) { 1528 return normalizeMessageContent(content).split("\n").map((line)=>splitInlineSegments(line)); 1529} 1530 1531;// ./lib/support-chatbot/api.ts 1532const API_URL = "/api/support-chatbot"; 1533async function post(body, options) { 1534 const res = await fetch(API_URL, { 1535 method: "POST", 1536 headers: { 1537 "Content-Type": "application/json" 1538 }, 1539 body: JSON.stringify(body), 1540 keepalive: options?.keepalive 1541 }); 1542 if (!res.ok) { 1543 const err = await res.json().catch(()=>({ 1544 error: "Request failed" 1545 })); 1546 throw new Error(err.error ?? "Request failed"); 1547 } 1548 return res.json(); 1549} 1550async function startSession(userType, deviceInfo) { 1551 return post({ 1552 action: "start_session", 1553 userType, 1554 deviceInfo 1555 }); 1556} 1557/** 1558 * ã«ãã´ãªãåãã`userType` ã¯ã²ã¹ãã®ç³åãªã®ã§ä»»æ ââ ãã°ã¤ã³ä¸ã¯ãµã¼ãã 1559 * ã»ãã·ã§ã³ãããã¼ã«ãå¤å®ããï¼`askUserType` ã false ã§è¿ãï¼ã 1560 */ async function getCategories(input) { 1561 return post({ 1562 action: "get_categories", 1563 userType: input?.userType, 1564 viewportWidth: input?.viewportWidth 1565 }); 1566} 1567async function getSubcategories(parentId, input) { 1568 return post({ 1569 action: "get_subcategories", 1570 parentId, 1571 userType: input?.userType, 1572 viewportWidth: input?.viewportWidth 1573 }); 1574} 1575async function getFaqs(categoryId, errorCode, input) { 1576 return post({ 1577 action: "get_faqs", 1578 categoryId, 1579 errorCode: errorCode ?? undefined, 1580 userType: input?.userType, 1581 viewportWidth: input?.viewportWidth 1582 }); 1583} 1584async function getFaqDetail(faqId, input) { 1585 return post({ 1586 action: "get_faq_detail", 1587 faqId, 1588 userType: input?.userType, 1589 viewportWidth: input?.viewportWidth 1590 }); 1591} 1592async function searchFaqs(query, userType, input) { 1593 return post({ 1594 action: "search_faqs", 1595 query, 1596 userType, 1597 categoryId: input?.categoryId ?? undefined, 1598 viewportWidth: input?.viewportWidth 1599 }); 1600} 1601async function saveMessage(sessionId, content, sessionToken) { 1602 return post({ 1603 action: "save_message", 1604 sessionId, 1605 role: "user", 1606 content, 1607 sessionToken 1608 }); 1609} 1610async function resolveSession(sessionId, resolved, sessionToken) { 1611 return post({ 1612 action: "resolve_session", 1613 sessionId, 1614 resolved, 1615 sessionToken 1616 }); 1617} 1618/** 1619 * `delivery` ã¯ãµãã¼ãã¸ã®éç¥ã¡ã¼ã«ã®çµæ«ï¼TASK-2078ï¼ã 1620 * `"sent"` 以å¤ã®ã¨ãã«ããé£çµ¡ãããã¾ããã¨è¨ãåããªãããã«è¿ãã¦ããã 1621 * åä»è¨é²ï¼`support_escalations`ï¼èªä½ã¯çµæ«ã«ãããå ¥ãã 1622 */ async function escalate(sessionId, reason, userEmail, sessionToken) { 1623 return post({ 1624 action: "escalate", 1625 sessionId, 1626 reason, 1627 userEmail, 1628 // å¿åã»ãã·ã§ã³ã®ææè ç §åç¨ããã°ã¤ã³ã¦ã¼ã¶ã¼ã¯ãµã¼ãã auth.uid() ã
1628§ç §åããã 1629 sessionToken 1630 }); 1631} 1632/** 1633 * æ§é åãã°å ±åã®åä»ï¼SPEC-WVA4F4GMQM REQ-11ï¼ã 1634 * 1635 * åä»è¨é²ãåããªããã°æåãè¿ããªãï¼ãµã¼ãå´ fail-closedï¼ã`reportId` ãè¿ã£ãã¨ãã ã 1636 * åä» ID ã表示ããã**ãå±ãããã¨æå®ããªã** ââ éä¿¡ã®çµæ«ã¯åä»ã¨ã¯å¥ã ããã 1637 */ async function submitBugReport(input) { 1638 return post({ 1639 action: "submit_bug_report", 1640 sessionId: input.sessionId, 1641 sessionToken: input.sessionToken, 1642 report: input.report 1643 }); 1644} 1645/** 1646 * ä¿®æ£å 容ã®ç¢ºèªï¼SPEC-XNB12ATSR4 REQ-09ï¼ã 1647 * èªåã®ã»ãã·ã§ã³ã«ç´ã¥ã確èªå¾ ã¡ã®å ±åã ããè¿ãã 1648 */ async function getFixConfirmation(input) { 1649 return post({ 1650 action: "get_fix_confirmation", 1651 sessionId: input.sessionId, 1652 sessionToken: input.sessionToken, 1653 reportId: input.reportId 1654 }); 1655} 1656/** 確èªã®åçã**æ¿èªã§ã¯ãªã** ââ äºè±¡ã®çè§£ãåã£ã¦ãããã ããè¿ãã */ async function confirmFix(input) { 1657 return post({ 1658 action: "confirm_fix", 1659 sessionId: input.sessionId, 1660 sessionToken: input.sessionToken, 1661 reportId: input.reportId, 1662 confirmed: input.confirmed 1663 }); 1664} 1665/** æªãã°ã¤ã³å ±åè ãé¢å¸ããã¨ããéåæã®ç¢ºèªå¾ ã¡ã¸æ®ãã skipped ã«ããã */ async function skipFixConfirmation(input) { 1666 return post({ 1667 action: "skip_fix_confirmation", 1668 sessionId: input.sessionId, 1669 sessionToken: input.sessionToken 1670 }, { 1671 keepalive: input.keepalive 1672 }); 1673} 1674 1675;// ../../packages/shared/src/support-chatbot/faq-detail.ts 1676/** 1677 * FAQ è©³ç´°ã®æ§é å表示ï¼SPEC-WVA4F4GMQM REQ-02 / AC-15ï¼ã 1678 * 1679 * IO 㨠JSX ãæããªããmigration æªé©ç¨ãæ¢å FAQ ã®ããã« `steps` ãç¡ãå ´å㯠1680 * 徿¥ã©ãã `answer` ã ããè¿ãã 1681 */ function normalizeFaqSteps(value) { 1682 if (!Array.isArray(value)) return []; 1683 return value.flatMap((entry)=>{ 1684 if (typeof entry !== "string") return []; 1685 const text = entry.trim(); 1686 return text.length > 0 ? [ 1687 text.slice(0, 500) 1688 ] : []; 1689 }).slice(0, 20); 1690} 1691function formatFaqDetail(detail) { 1692 const steps = normalizeFaqSteps(detail.steps); 1693 if (steps.length === 0) return detail.answer; 1694 const intro = detail.summary?.trim() || detail.answer.trim(); 1695 const sections = [ 1696 intro, 1697 "æé ", 1698 ...steps.map((step, index)=>`${index + 1}. ${step}`) 1699 ]; 1700 const expected = detail.expectedResult?.trim(); 1701 if (expected) sections.push(`æå¾ ãããçµæ\n${expected}`); 1702 return sections.filter(Boolean).join("\n\n"); 1703} 1704/** FAQã»ã«ãã´ãªããåºããªã³ã¯ã¯åä¸ãµã¤ãå ã®ãã¹ã ãã許å¯ããã */ function normalizeSupportDeepLink(value) { 1705 if (typeof value !== "string") return null; 1706 const link = value.trim(); 1707 if (link.length === 0 || link.length > 255 || !link.startsWith("/") || link.startsWith("//") || link.includes("\\") || /[\u0000-\u001f\u007f\s]/.test(link)) { 1708 return null; 1709 } 1710 return link; 1711} 1712 1713;// ../../packages/shared/src/support-chatbot/constants.ts 1714/** èªç±å ¥åã«ããåæ¤ç´¢ã®ä¸éåæ° */ const MAX_FREE_INPUT_RETRIES = 3; 1715/** FAQåè£ã¨ãã¦è¡¨ç¤ºããæå¤§ä»¶æ° */ const MAX_FAQ_CANDIDATES = 3; 1716/** ã¨ã¹ã«ã¬ã¼ã·ã§ã³å ã¡ã¼ã«ã¢ãã¬ã¹ */ const ESCALATION_EMAIL = "[email protected]"; 1717/** ãããã®åæã¡ãã»ã¼ã¸ */ const INITIAL_MESSAGE = "ãå°ãã®ãã¨ã¯ãããã¾ããï¼ã¾ããããªãã®ç¨®å¥ãé¸ãã§ãã ããã"; 1718/** ã«ãã´ãªé¸æã¡ãã»ã¼ã¸ */ const CATEGORY_SELECT_MESSAGE = "ãå°ãã®ã«ãã´ãªãé¸ãã§ãã ããã"; 1719/** 第1é層ã0ä»¶ã§ããåãåãããå試è¡ã¸é²ãããã¨ãæç¤ºããã */ const CATEGORY_UNAVAILABLE_MESSAGE = "ç¾å¨é¸ã¹ãã«ãã´ãªãããã¾ããããµãã¼ãã¸ã®ãåãåãããã¾ãã¯åèªã¿è¾¼ã¿ãã試ããã ããã"; 1720/** ãµãã«ãã´ãªé¸æã¡ãã»ã¼ã¸ */ const SUBCATEGORY_SELECT_MESSAGE = "ããå°ãå ·ä½çã«æãã¦ãã ããã"; 1721/** FAQåè£ã¡ãã»ã¼ã¸ */ const FAQ_CANDIDATES_MESSAGE = "以ä¸ã®ãããã質åãã該å½ãããã®ã¯ããã¾ããï¼"; 1722/** 解決確èªã¡ãã»ã¼ã¸ */ const RESOLVED_CHECK_MESSAGE = "ãã¡ãã®åçã§è§£æ±ºãã¾ãããï¼"; 1723/** æªè§£æ±ºã¡ãã»ã¼ã¸ */ const UNRESOLVED_MESSAGE = "ç³ã訳ãããã¾ããããæ¢ãã®å 容ããã¼ã¯ã¼ãã§å ¥åãã¦ã¿ã¦ãã ããã"; 1724/** ã¨ã¹ã«ã¬ã¼ã·ã§ã³ç¢ºèªã¡ãã»ã¼ã¸ */ const ESCALATION_CONFIRM_MESSAGE = "ç³ã訳ãããã¾ããããµãã¼ãæ å½ã«ãç¹ããã¦ãããããã§ããï¼ã¡ã¼ã«ã«ã¦ãé£çµ¡ãããã¾ãã"; 1725/** ã¨ã¹ã«ã¬ã¼ã·ã§ã³å®äºã¡ãã»ã¼ã¸ï¼éç¥ã¡ã¼ã«ãå®éã«éããã¨ãï¼ */ const ESCALATION_COMPLETE_MESSAGE = "ãåãåãããåãä»ãã¾ããããµãã¼ãæ å½ããã¡ã¼ã«ã§ãé£çµ¡ãããã¾ãã®ã§ããã°ãããå¾ ã¡ãã ããã"; 1726/** 1727 * åä»ã¯æ¸ãã ãããµãã¼ãã¸ã®éç¥ã¡ã¼ã«ãé
1727ããªãã£ãã¨ãã®æé¢ï¼TASK-2078ï¼ã 1728 * 1729 * æ§å®è£ ã¯éä¿¡çµæãè¦ãã«å¸¸ã«ä¸ã®å®äºã¡ãã»ã¼ã¸ãåºãã¦ãããå®éã«ã¯éç¥ã 1730 * 1 éãå±ãã¦ããªãã£ããããå¦çã¯ãé£çµ¡ãæ¥ãã¯ããã¨å¾ ã¡ç¶ãããã¨ã«ãªãã 1731 * è¨é²ã¯ `support_escalations` ã«æ®ã£ã¦ããã®ã§åä»èªä½ã¯æç«ãã¦ããã 1732 * é£çµ¡ãé ãå¾ããã¨ã¨ãæ¥ãå ´åã®ä»£æ¿ææ®µãä¼ããã 1733 */ const ESCALATION_COMPLETE_DEGRADED_MESSAGE = "ãåãåãããåãä»ãã¾ããããã ããµãã¼ãã¸ã®éç¥ãæ£å¸¸ã«éãã¾ããã§ããã" + `ãæ¥ãã®å ´å㯠${ESCALATION_EMAIL} ã¾ã§ç´æ¥ãé£çµ¡ãã ããã`; 1734/** èªç±å ¥åä¸éå°éã¡ãã»ã¼ã¸ */ const FREE_INPUT_LIMIT_MESSAGE = "æ¤ç´¢åæ°ã®ä¸éã«éãã¾ããããµãã¼ãæ å½ã«ãåãåãããã ããã"; 1735/** 第 3 é層ï¼ã¨ã©ã¼æè¨ã®é¸æï¼ã®è¦åºããSPEC-WVA4F4GMQM REQ-12ã */ const THIRD_TIER_MESSAGE = "表示ãããå 容ãèµ·ãããã¨ã«è¿ããã®ãé¸ãã§ãã ããã"; 1736/** 1737 * 仿§ã©ããã®æå¦ï¼ãããã£ã¼ã«æªå®æã»å¿åæ¸ã¿ã»ç· åè¶ éãªã©ï¼ã«å½ãã£ãã¨ãã®æ¡å ã 1738 * ããã¯ä¸å ·åã§ã¯ãªãã®ã§ã該å½ããç»é¢ã¸èªå°ãã¦çµããã 1739 */ const EXPECTED_REJECTION_MESSAGE = "ãã¡ãã¯ä¸å ·åã§ã¯ãªãããµã¼ãã¹å´ã®æ¡ä»¶ã«ãããæ¡å ã§ããä¸ã®ãªã³ã¯ãã該å½ã®ç»é¢ãã確èªãã ããã"; 1740/** ãã°å ±åãã©ã¼ã ã®å°å ¥ãSPEC-WVA4F4GMQM REQ-11ã */ const BUG_REPORT_INTRO_MESSAGE = "ä¸å ·åã¨ãã¦åãä»ãã¾ããåç¾ã§ãããããèµ·ãããã¨ãæãã¦ãã ããã" + "URL ã¨ç«¯æ«ã®æ å ±ã¯èªåã§æ·»ãã¾ãã"; 1741/** 1742 * åä»ã§ããã¨ãã®æé¢ã**ãå±ãããã¨æå®ããªã** ââ åä»è¨é²ãå ¥ã£ããã¨ã¨ã 1743 * æ å½è ãè¦ã¦é£çµ¡ãããã¨ã¯å¥ã ãããåä» ID ã¯å¾ããåãåãããã¨ãã®ææããã 1744 */ const BUG_REPORT_RECEIVED_MESSAGE = "ä¸å ·åã®å ±åãåãä»ãã¾ãããåä» ID ããæ§ããã ãããå 容ã確èªã®ãã対å¿ãã¾ãã"; 1745/** 1746 * ã¹ã¯ãªã¼ã³ã·ã§ããæ·»ä»ã䏿çã«éãã¦ããæ¨ï¼SPEC-JH4QAJST04 REQ-08 ã®æ«å®æªç½®ï¼ã 1747 * 1748 * æ·»ä»ã¯ base64 ã§æ¬æã¸è¼ãããåã«ã¼ãã®å ¥å£ã«ã¯æ¬æ 32 KiB ã®ä¸éãããããã 1749 * å®ç«¯æ«ã®ã¹ã¯ãªã¼ã³ã·ã§ããã¯å¿ ã 413 ã«ãªãã413 㯠action ãè¦ãåã«è¿ãã®ã§ 1750 * åä»è¨é²ãæ®ãããå¦çã«ã¯çç±ãåãããªãã¾ã¾å¤±æããã 1751 * ç½²åä»ã URL ã®ç´æ¥ã¢ãããã¼ãã¸ç§»ãã¾ã§ãæ¬èªä½ãåºããªãã 1752 */ const BUG_REPORT_SCREENSHOT_PAUSED_NOTICE = "ã¹ã¯ãªã¼ã³ã·ã§ããã®æ·»ä»ã¯ç¾å¨ãå©ç¨ããã ãã¾ãããã¨ã©ã¼ç»é¢ã«åºã¦ããæè¨ããä¸ã®æ¬ã«ãã®ã¾ã¾æ¸ãã¦ããã ããã¨å©ããã¾ãã"; 1753/** åä»ãã®ãã®ãã§ããªãã£ãã¨ãã®æé¢ï¼è¨é²ãç¡ãã®ã§åãä»ããã¨è¨ããªãï¼ã */ const BUG_REPORT_UNAVAILABLE_MESSAGE = "ãã ãã¾ä¸å ·åã®åä»ãã§ãã¾ããã§ããããææ°ã§ããããµãã¼ãã¸ã®ãåãåãããããé£çµ¡ãã ããã"; 1754 1755;// ./lib/support-chatbot/constants.ts 1756/** 1757 * SPEC-ZQTJAC3GJ5: æ£æ¬ã¯ `packages/shared` ã¸ç§»ããï¼ãµãã¼ããã£ããã®æè¨ãapps/mobile ãåããã®ãèªãï¼ã 1758 * 1759 * ããã¯**åã¨ã¯ã¹ãã¼ãã ã**ã«ãããå®è£ ãè¶³ã㨠apps/web 㨠apps/mobile ã§ 1760 * 夿ãå²ããåãä¼è©±ãé¢ãã¨ã«å¥ã®åºå£ã»å¥ã®è¡ãå ã«ãªãã 1761 * 夿´ã¯å¿ ã `packages/shared/src/support-chatbot/constants.ts` å´ã§è¡ãã 1762 */ 1763 1764// EXTERNAL MODULE: ./lib/support-chatbot/tree.ts + 1 modules 1765var tree = __webpack_require__(14327); 1766;// ./lib/support-reports/preview.ts 1767/** 1768 * ãã¬ãã¥ã¼ã®èªå½ã¨ä¸éï¼SPEC-XNB12ATSR4 REQ-06 / REQ-08 / AC-08ã»AC-10ï¼ã 1769 * 1770 * IO ãæããªãã**ãã¬ãã¥ã¼ã¯ãã©ã³ãã®å®ã³ã¼ãããããä½ããªã** ââ 代æ¿ã®è¦ãç®ã 1771 * çµã¿ç«ã¦ã颿°ãããã¸è¶³ããªããã¨ãçæã§ããªãã¨ã㯠`unavailable` ã«ããã 1772 */ const PREVIEW_KINDS = (/* unused pure expression or super */ null && ([ 1773 "string_diff", 1774 "screenshot", 1775 "unavailable"
1776])); 1777const FIX_LANES = (/* unused pure expression or super */ null && ([ 1778 "text", 1779 "visual", 1780 "none" 1781])); 1782const REPORTER_CONFIRMATIONS = (/* unused pure expression or super */ null && ([ 1783 "pending", 1784 "confirmed", 1785 "rejected", 1786 "skipped", 1787 "timeout" 1788])); 1789/** ç»å㯠Phase 1 ã® private ãã±ããã® `previews/` ã¸å ¥ããï¼æ°è¦ãã±ãããä½ããªãï¼ã */ const PREVIEW_BUCKET = "support-bug-reports"; 1790const PREVIEW_PREFIX = "previews"; 1791const PREVIEW_MAX_IMAGES = 2; 1792const PREVIEW_MAX_BYTES = (/* unused pure expression or super */ null && (5 * 1024 * 1024)); 1793/** 確èªã®å¾ ã¡æéãéããã `timeout` ã«ã㦠Draft PR ã¯ä½ãï¼ç¡å¿çããããã«ã¼ã«ããªãï¼ã */ const CONFIRMATION_TIMEOUT_MS = (/* unused pure expression or super */ null && (24 * 60 * 60 * 1000)); 1794function isPreviewKind(value) { 1795 return typeof value === "string" && PREVIEW_KINDS.includes(value); 1796} 1797function isReporterConfirmation(value) { 1798 return typeof value === "string" && REPORTER_CONFIRMATIONS.includes(value); 1799} 1800const UNSAFE_REPORTER_PREVIEW_TEXT = /(?:https?:\/\/|\b(?:api[_-]?key|token|secret|password|authorization|import|export|function|const|let|var|class|return|buffer|null|undefined)\b|process\.env|[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}|\$\{|=>|[{};=|]|[A-Za-z0-9+/_=-]{40,})/i; 1801function sanitizeReporterPreviewText(value) { 1802 if (typeof value !== "string") return null; 1803 const text = value.trim(); 1804 if (text.length === 0 || text.length > 300 || text.startsWith("/") || /^["'`].*["'`][,;]?$/.test(text) || /[\u0000-\u0008\u000b\u000c\u000e-\u001f]/.test(text) || UNSAFE_REPORTER_PREVIEW_TEXT.test(text)) return null; 1805 return text; 1806} 1807/** API ãææè 確èªå¾ã«è¿ããæå° payload ãã確èªã«ã¼ãã®è¡¨ç¤ºã¸å¤æããã */ function buildConfirmationPreviewDisplay(kind, payload) { 1808 if (!payload || typeof payload !== "object") return { 1809 text: null, 1810 images: [] 1811 }; 1812 const value = payload; 1813 if (kind === "string_diff" && Array.isArray(value.changes)) { 1814 const blocks = value.changes.slice(0, 10).flatMap((entry)=>{ 1815 if (!entry || typeof entry !== "object") return []; 1816 const change = entry; 1817 const before = sanitizeReporterPreviewText(change.before) ?? "ï¼ãªãï¼"; 1818 const after = sanitizeReporterPreviewText(change.after) ?? "ï¼ãªãï¼"; 1819 if (before === "ï¼ãªãï¼" && after === "ï¼ãªãï¼") return []; 1820 return [ 1821 `夿´å: ${before}\n夿´å¾: ${after}` 1822 ]; 1823 }); 1824 return { 1825 text: blocks.length > 0 ? `夿´äºå®ã®æè¨ã§ãã\n\n${blocks.join("\n\n")}` : null, 1826 images: [] 1827 }; 1828 } 1829 if (kind === "screenshot" && Array.isArray(value.images)) { 1830 const images = value.images.slice(0, PREVIEW_MAX_IMAGES).flatMap((entry, index)=>{ 1831 if (!entry || typeof entry !== "object") return []; 1832 const src = entry.url; 1833 if (typeof src !== "string" || !src.startsWith("https://")) return []; 1834 return [ 1835 { 1836 src, 1837 alt: index === 0 ? "ä¿®æ£åã®ç»é¢" : "ä¿®æ£å¾ã®ç»é¢" 1838 } 1839 ]; 1840 }); 1841 return { 1842 text: images.length > 0 ? "ä¿®æ£åã¨ä¿®æ£å¾ã®ç»é¢ã§ãã" : null, 1843 images 1844 }; 1845 } 1846 return { 1847 text: null, 1848 images: [] 1849 }; 1850} 1851/** 1852 * å ±åè ã¸è¦ããåãã**æ¿èªãæ±ããªãã** 1853 * è¨ãã®ã¯ãå°ã£ã¦ããäºè±¡ã®çè§£ãåã£ã¦ããããã ãã§ããã¼ã¸ã®å¯å¦ã§ã¯ãªãã 1854 */ const CONFIRMATION_QUESTION = "ãå°ãã ã£ãã®ã¯ãã®å 容ã§åã£ã¦ãã¾ããï¼ ç´ãæ¹ã®æ¤è¨ã«ä½¿ããã¦ããã ãã¾ãã"; 1855/** ãã¬ãã¥ã¼ãã¾ã åºæ¥ã¦ããªãã¨ãã®è¡¨ç¤ºã空ã®ç¢ºèª UI ãåºããªãã */ const CONFIRMATION_PREPARING_MESSAGE = "å 容ã確èªãã¦ãã¾ããæºåãã§ããããç¥ãããã¾ãã";
1856/** çæå®äºã ãæ¯è¼è¡¨ç¤ºãä½ããªãã£ãå ´åãæºåä¸ã¨ã¯åºå¥ããåçå¯è½ãªã¾ã¾ã«ããã */ const CONFIRMATION_UNAVAILABLE_MESSAGE = "æ¯è¼ç¨ã®ãã¬ãã¥ã¼ã¯ç¨æã§ãã¾ããã§ããã表示å 容ã確èªããããã§ãçããã ããã"; 1857const CONFIRMATION_OPTIONS = [ 1858 { 1859 label: "åã£ã¦ãã¾ã", 1860 value: "support_fix_confirm_yes" 1861 }, 1862 { 1863 label: "éãã¾ã", 1864 value: "support_fix_confirm_no" 1865 } 1866]; 1867 1868;// ./lib/support-reports/constants.ts 1869/** 1870 * ãµãã¼ãå ±åã®ããªã¢ã¼ã¸ã§ä½¿ãèªå½ã¨ä¸éï¼SPEC-02T78Y3RWNï¼ã 1871 * 1872 * ãªãã©ã«ãããã ãã«ç½®ããcron / admin / å¥ç´ãã¹ããåã宿°ãåç §ããã 1873 * IO ãæããªãã 1874 */ const SUPPORT_REPORT_TABLE = "support_bug_reports"; 1875const SUPPORT_REPORT_AUDIT_TABLE = "support_report_audit_logs"; 1876/** å ±åã®ç¶æ ãåé²ã®ã¿ï¼`issued` ã®åãæ¶ããèªååããªãï¼ã */ const REPORT_STATUSES = (/* unused pure expression or super */ null && ([ 1877 "received", 1878 "classified", 1879 "needs_review", 1880 "duplicate", 1881 "redirected", 1882 "issued", 1883 "rejected", 1884 "fixing", 1885 "awaiting_confirmation", 1886 "pr_created", 1887 "fix_abandoned" 1888])); 1889/** LLM ãè¿ãã¦ããåé¡ããã以å¤ã¯ç ´æ£ããã */ const TRIAGE_CLASSES = (/* unused pure expression or super */ null && ([ 1890 "bug", 1891 "spec", 1892 "question" 1893])); 1894/** ç£æ»ãã°ã® action / actorã */ const AUDIT_ACTIONS = (/* unused pure expression or super */ null && ([ 1895 "classified", 1896 "corrected", 1897 "approved", 1898 "rejected", 1899 "issued", 1900 "dedup", 1901 "confirmation_confirmed", 1902 "confirmation_rejected", 1903 "confirmation_skipped", 1904 "confirmation_timeout", 1905 "fix_abandoned", 1906 "fix_restarted", 1907 "pr_created" 1908])); 1909const AUDIT_ACTORS = (/* unused pure expression or super */ null && ([ 1910 "ai", 1911 "admin", 1912 "reporter", 1913 "bot" 1914])); 1915/** 1 tick ãããã®å¦çä¸éã */ const TRIAGE_BATCH_SIZE = 10; 1916/** 起票ã®å試è¡ä¸éãè¶ ããã `needs_review` ã¸è½ã¨ãã */ const ISSUE_MAX_ATTEMPTS = 3; 1917/** åé¡ã®ãã¼ã¹å試è¡ä¸éã */ const CLASSIFY_MAX_RETRIES = 2; 1918/** éè¤å¤å®ã®çªï¼æ¥ï¼ãã¡ããã© 30 æ¥ã¯éè¤ãè¶ ã¯æ°è¦ã */ const DEDUP_WINDOW_DAYS = 30; 1919/** 起票å ã1 ãªãã¸ããªã«åºå®ããã */ const GITHUB_OWNER = "makeculture"; 1920const GITHUB_REPO = "all_gakuseitenshoku"; 1921/** Issue ã«ä»ããã©ãã«ã®æ¥é è¾ã */ const ISSUE_LABEL_BASE = "support-report"; 1922const ISSUE_LABEL_NEEDS_HUMAN = "needs-human"; 1923/** 1924 * LLM ã¸æ¸¡ãã¦ãããã£ã¼ã«ãï¼REQ-05 ã®æå°éåï¼ã 1925 * 1926 * **ãã®é åã«ç¡ããã®ã渡ããªãã** ã¡ã¼ã«ã¢ãã¬ã¹ã»`user_id`ã»ã¹ã¯ãªã¼ã³ã·ã§ããã» 1927 * `recent_events` ã¯å ¥ããªããallowlist ã«ãã¦ããã¨ããã£ã¼ã«ããå¢ããã¨ãã« 1928 * ãæ¸¡ããªãããæ°ãã¤ãããã§ã¯ãªãæ§é ã§è½ã¡ãã 1929 */ const CLASSIFY_INPUT_FIELDS = (/* unused pure expression or super */ null && ([ 1930 "source_category_slug", 1931 "source_subcategory_slug", 1932 "target_category_slug", 1933 "target_subcategory_slug", 1934 "canonical_url", 1935 "error_code", 1936 "device_type", 1937 "frequency", 1938 "impact" 1939])); 1940/** `recent_events` ã«è¨é²ãã¦ãã種å¥ãå ¥åå¤ã»ããã¹ãå 容ã¯è¨é²ããªãã */ const RECENT_EVENT_KINDS = [ 1941 "click", 1942 "navigation", 1943 "submit" 1944]; 1945const constants_RECENT_EVENTS_MAX_COUNT = 20; 1946const constants_RECENT_EVENTS_MAX_AGE_MS = 10 * 60 * 1000; 1947 1948;// ./lib/support-chatbot/recent-events.ts 1949/** 1950 * ç´è¿æä½ã®è¨é²ï¼SPEC-02T78Y3RWN REQ-10 / AC-13ï¼ã 1951 * 1952 * **å ¥åå¤ã»ããã¹ãå å®¹ãæ§é çã«æããªãã** è¨é²ããã®ã¯ç¨®å¥ã»å¯¾è±¡è¦ç´ ã®èå¥åã»æå»ã ãã§ã 1953 * å¤ãå ¥ãããã£ã¼ã«ããåã«åå¨ããªãï¼ãå ¥ããªãããæ°ãã¤ãããã«é ¼ããªãï¼ã 1954 * 1955 * åæã¯éä¿¡ãã¨ã«åããæ¢å®ã¯ OFFããã°ã¤ã³ä¸ã®ã¿ãLLM 㨠Issue æ¬æã¸ã¯æ¸¡ããªã 1956 * ï¼admin UI ã§ã®ã¿é²è¦§ããï¼ãIO ãæããªãã 1957 */ 1958const TARGET_MAX = 80; 1959const OPAQUE_PATH_SEGMENT = /^(?:\d+|[0-9a-f]{8}-[0-9a-f-]{27,}|[A-Za-z0-9_-]{24,})$/i; 1960const STATIC_PATH_SEGMENT = /^[A-Za-z][A-Za-z0-9_-]{0,23}$/; 1961const ELEMENT_IDENTIFIER = /^[A-Za-z][A-Za-z0-9_-]{0,79}$/; 1962const OPAQUE_ELEMENT_IDENTIFIER = /^(?:\d+|[0-9a-f]{8}-[0-9a-f-]{27,}|[A-Za-z0-9_-]{40,})$/i; 1963const NAVIGATION_TARGET = /^\/(?:$|(?:(?:[A-Za-z][A-Za-z0-9_-]{0,23}|:id)(?:\/(?:[A-Za-z][A-Za-z0-9_-]{0,23}|:id))*))$/; 1964/** ãµã¼ãã§ãåãèå¥åèªå½ã¸çµããå ¥åå¤ã URL query ã target ã¨ãã¦å
1964ããªãã */ function recent_events_isAllowedRecentEventTarget(kind, target) { 1965 if (typeof target !== "string" || target.length === 0 || target.length > TARGET_MAX) return false; 1966 if (kind === "navigation") return NAVIGATION_TARGET.test(target); 1967 return ELEMENT_IDENTIFIER.test(target) && !OPAQUE_ELEMENT_IDENTIFIER.test(target); 1968} 1969/** è¦ç´ ããèå¥åã ããåãåºãã**value / textContent ãèªã¾ãªãã** */ function describeTarget(element) { 1970 const testId = element.getAttribute?.("data-testid"); 1971 const safeIdentifier = (value)=>{ 1972 const candidate = value?.trim().slice(0, TARGET_MAX) ?? ""; 1973 return recent_events_isAllowedRecentEventTarget("click", candidate) ? candidate : null; 1974 }; 1975 const describedTestId = safeIdentifier(testId); 1976 if (describedTestId) return describedTestId; 1977 const describedId = safeIdentifier(element.id); 1978 if (describedId) return describedId; 1979 const tag = element.tagName ?? ""; 1980 return (typeof tag === "string" ? tag.toLowerCase() : "unknown").slice(0, TARGET_MAX); 1981} 1982/** 1983 * ç»é¢é·ç§»ããç»é¢ã®ç¨®é¡ãã¨ãã¦è¨é²ããã 1984 * 1985 * `usePathname` ã®å¤ã ããåãåããã query / hash ã¯å ããå ¥ããªãããåä½ã§ã 1986 * ããããåãè½ã¨ããæ°å¤ IDã»UUIDã»é·ã token ããã segment ã¯å¤ãæ®ãã `:id` ã«ããã 1987 */ function describeNavigationTarget(pathname) { 1988 const pathOnly = (pathname ?? "").trim().split(/[?#]/, 1)[0]; 1989 if (!pathOnly.startsWith("/")) return "/unknown"; 1990 const segments = pathOnly.split("/").filter(Boolean).map((segment)=>OPAQUE_PATH_SEGMENT.test(segment) || !STATIC_PATH_SEGMENT.test(segment) ? ":id" : segment); 1991 const described = `/${segments.join("/")}`; 1992 return described.slice(0, TARGET_MAX) || "/"; 1993} 1994function recent_events_isRecentEventKind(value) { 1995 return typeof value === "string" && RECENT_EVENT_KINDS.includes(value); 1996} 1997/** ãããã¡ã¸ 1 ä»¶è¶³ããä¸éãè¶ ãããå¤ãå´ããè½ã¨ãã */ function append
1997RecentEvent(buffer, event) { 1998 return [ 1999 ...buffer, 2000 event 2001 ].slice(-constants_RECENT_EVENTS_MAX_COUNT); 2002} 2003/** 2004 * éä¿¡æã«æ¸¡ãå½¢ã¸è½ã¨ãã 2005 * åæãç¡ãã»ãã°ã¤ã³ãã¦ããªãã»ç©ºã®ã¨ã㯠**null**ï¼ç©ºé åãéããªãï¼ã 2006 */ function buildRecentEventsPayload(input) { 2007 if (!input.consented || !input.isAuthenticated) return null; 2008 const fresh = input.buffer.filter((event)=>recent_events_isRecentEventKind(event.kind) && recent_events_isAllowedRecentEventTarget(event.kind, event.target) && input.nowMs - event.at <= constants_RECENT_EVENTS_MAX_AGE_MS && event.at <= input.nowMs).slice(-constants_RECENT_EVENTS_MAX_COUNT).map((event)=>({ 2009 kind: event.kind, 2010 target: event.target, 2011 at: event.at 2012 })); 2013 return fresh.length > 0 ? fresh : null; 2014} 2015/** åæãã§ãã¯ã®æè¨ã**ä½ãå«ã¾ãªãããæç¤ºããã** */ const RECENT_EVENTS_CONSENT_LABEL = "ç´è¿ã®æä½æ å ±ï¼æ¼ãããã¿ã³ã»éããç»é¢ã®ç¨®é¡ãå ¥åããæåã¯å«ã¾ãã¾ããï¼ãæ·»ä»ãã"; 2016 2017;// ./lib/support-chatbot/bug-report.ts 2018/** 2019 * æ§é åãã°å ±åã®åä»ãã¤ãã¼ããçµã¿ç«ã¦ãç´é¢æ°ï¼SPEC-WVA4F4GMQM REQ-11 / AC-09ãAC-13ï¼ã 2020 * 2021 * IO ãæããªãï¼å¥ç´ãã¹ãããç´æ¥å©ããããã«ããï¼ãä¿åã¨ã¬ã¼ãå¶éã¯ãµã¼ãå´ã® RPCã 2022 */ 2023 2024 2025/** èªç±è¨è¿°ã®ä¸éãæ¢åã®ã¨ã¹ã«ã¬ã¼ã·ã§ã³çç±ã¨åãåºæºã«æããã */ const BUG_REPORT_TEXT_MAX = 2000; 2026/** å¿åå ±åã®ã¡ã¼ã«ã¢ãã¬ã¹ä¸éã */ const BUG_REPORT_EMAIL_MAX = 254; 2027/** ã¹ã¯ãªã¼ã³ã·ã§ããã®ä¸éã */ const BUG_REPORT_SCREENSHOT_MAX_COUNT = 3; 2028const BUG_REPORT_SCREENSHOT_MAX_BYTES = (/* unused pure expression or super */ null && (5 * 1024 * 1024)); 2029const BUG_REPORT_SCREENSHOT_MIME_TYPES = (/* unused pure expression or super */ null && ([ 2030 "image/png", 2031 "image/jpeg", 2032 "image/webp" 2033])); 2034const FREQUENCY_VALUES = [ 2035 "always", 2036 "often", 2037 "sometimes", 2038 "once" 2039]; 2040const IMPACT_VALUES = [ 2041 "blocked", 2042 "workaround", 2043 "annoying" 2044]; 2045const FREQUENCY_LABELS = { 2046 always: "æ¯åèµ·ãã", 2047 often: "ããèµ·ãã", 2048 sometimes: "ãã¾ã«èµ·ãã", 2049 once: "1 åã ãèµ·ãã" 2050}; 2051const IMPACT_LABELS = { 2052 blocked: "å ã«é²ããªã", 2053 workaround: "å¥ã®æ¹æ³ã§åé¿ã§ãã", 2054 annoying: "å°ããé²ãããã" 2055}; 2056/** 2057 * ä¼ãåã«ãããã¹ã**`raw_url` ã«ãæãã**ï¼AC-12: ã©ã¡ãã«ãå¹³æã§æ®ããªãï¼ã 2058 * æ±äººãã¬ãã¥ã¼ã® token 㯠URL ãç¥ã£ã¦ããã°èª°ã§ãéããã®ã§ãå ±å㨠admin ç»é¢ã® 2059 * åæ¹ããæ¶ãã 2060 */ const MASKED_SEGMENT = "***"; 2061const MASK_RULES = [ 2062 { 2063 pattern: /^\/jobs\/preview\/[^/?#]+/, 2064 replacement: `/jobs/preview/${MASKED_SEGMENT}` 2065 }, 2066 { 2067 pattern: /^\/api\/jobs\/preview\/[^/?#]+/, 2068 replacement: `/api/jobs/preview/${MASKED_SEGMENT}` 2069 } 2070]; 2071const isSensitiveQueryKey = (key)=>{ 2072 const normalized = key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[.-]/g, "_").toLowerCase(); 2073 // æ«å°¾ä¸è´ã«ããªããSupabase Auth ã®ç¢ºèªã»åè¨å®ãªã³ã¯ã¯ `token_hash` ã使ãã®ã§ã 2074 // `$` ã§éããã¨å®éç¨ã§ãã¡ã°ãå±ãªãå¤ãç´ éãããï¼`/password-reset-callback?token_hash=...` 2075 // ä¸ã§éãããã£ããããã®å ±åã§ãæªä½¿ç¨ã® recovery token ãå¹³æä¿åãããï¼ã 2076 // èªã®åãç®ï¼`_` ã¾ãã¯çµç«¯ï¼ã§éããã®ã§ `keyword` / `codename` ã¯å·»ãè¾¼ã¾ãªãã 2077 return /(?:^|_)(?:token|secret|key|code|password|credential)(?:_|$)/.test(normalized); 2078}; 2079/** 2080 * æ£æ¬ãã¹ã¸ã®å¯ãæ¿ãã`apps/web/next.config.js` ã®æä¹ ãªãã¤ã¬ã¯ããåãããã®ã 2081 * ãµã¼ãå´ã®ãªãã¤ã¬ã¯ããªã®ã§ãã©ã¦ã¶ã® URL ã¯æ¢ã«å¯ã£ã¦ãããã¨ãå¤ããã 2082 * å¤ãã¿ãã»å ±æãªã³ã¯ããéããå ±åãåããã¼ã«å¯ããããã«æã¤ 2083 * ï¼Phase 2 ã®éè¤å¤å®ããã®ãã¹ããã¼ã«ä½¿ãï¼ã 2084 */ const CANONICAL_PATH_REWRITES = [ 2085 { 2086 from: "/campanylp/", 2087 to: "/companylp/" 2088 }, 2089 { 2090 from: "/ipo/dashboard/", 2091 to: "/dashboard/" 2092 }, 2093 { 2094 from: "/ipo/analysis/", 2095 to: "/analysis/" 2096 }, 2097 { 2098 from: "/ipo/selection/", 2099 to: "/selection/" 2100 }, 2101 { 2102 from: "/ipo/case/", 2103 to: "/case/" 2104 }, 2105 { 2106 from: "/ipo/calendar/", 2107 to: "/calendar/" 2108 }, 2109 { 2110 from: "/ipo/interested-events/", 2111 to: "/interested-events/" 2112 }, 2113 { 2114 from: "/ipo/library/", 2115 to: "/library/" 2116 }, 2117 { 2118 from: "/ipo/diagnosis/", 2119 to: "/diagnosis/" 2120 }, 2121 { 2122 from: "/ipo/es/", 2123 to: "/ES/" 2124 }, 2125 { 2126 from: "/ipo/ES/", 2127 to: "/ES/" 2128 }, 2129 { 2130 from: "/ipo/demo/", 2131 to: "/demo/" 2132 }, 2133 { 2134 from: "/student/dashboard/", 2135 to: "/dashboard/" 2136 }, 2137 { 2138 from: "/student/analysis/", 2139 to: "/analysis/" 2140 }, 2141 { 2142 from: "/student/selection/", 2143 to: "/selection/" 2144 }, 2145 { 2146 from: "/student/ES/", 2147 to: "/ES/" 2148 }, 2149 { 2150 from: "/student/case/", 2151 to: "/case/" 2152 }, 2153 { 2154 from: "/student/calendar/", 2155 to: "/calendar/" 2156 }, 2157 { 2158 from: "/student/interested-events/", 2159 to: "/interested-events/" 2160 }, 2161 { 2162 from: "/student/library/", 2163 to: "/library/" 2164 }, 2165 { 2166 from: "/student/diagnosis/", 2167 to: "/diagnosis/" 2168 }, 2169 { 2170 from: "/student/favorites/", 2171 to: "/favorites/" 2172 }, 2173 { 2174 from: "/student/scouts/", 2175 to: "/scouts/" 2176 }, 2177 { 2178 from: "/student/applications/", 2179 to: "/applications/" 2180 }, 2181 { 2182 from: "/student/career-edit/", 2183 to: "/career-edit/" 2184 }, 2185 { 2186 from: "/student/profile/", 2187 to: "/profile/" 2188 } 2189]; 2190/** URL ãã path + search + hash ãåãåºããç¸å¯¾ã§ã絶対ã§ãåããã */ function toPath(input) { 2191 const trimmed = input.trim(); 2192 if (trimmed.length === 0) return "/"; 2193 try { 2194 const parsed = new URL(trimmed, "https://gakuten.co.jp"); 2195 return `${parsed.pathname}${parsed.search}${parsed.hash}`; 2196 } catch { 2197 return trimmed.startsWith("/") ? trimmed : `/${trimmed}`; 2198 } 2199} 2200/** token çãä¼ããã`raw_url` ã«ã `canonical_url` ã«ãæããã */ function maskSensitivePath(pathWithQuery) { 2201 let masked = pathWithQuery; 2202 for (const rule of MASK_RULES){ 2203 masked = masked.replace(rule.pattern, rule.replacement); 2204 } 2205 try { 2206 const parsed = new URL(masked, "https://gakuten.co.jp"); 2207 for (const key of new Set(parsed.searchParams.keys())){ 2208 if (isSensitiveQueryKey(key)) parsed.searchParams.set(key, MASKED_SEGMENT); 2209 } 2210 return `${parsed.pathname}${parsed.search}${parsed.hash ? `#${MASKED_SEGMENT}` : ""}`; 2211 } catch { 2212 return masked// URL ã¨ãã¦è§£éã§ããªãã£ãã¨ãã®ä¿éºãä¸ã¨åãèªå½ã使ãï¼`token_hash=` ãæ¾ãï¼ã 2213 .replace(/([?&][^=&#]*(?:token|secret|key|code|password|credential)[^=&#]*=)[^&#]*/gi, `$1${MASKED_SEGMENT}`).replace(/#.*$/, `#${MASKED_SEGMENT}`); 2214 } 2215} 2216/** æ£æ¬ãã¹ã¸å¯ããï¼ä¼ãåããå ã«æãã¦ãçµæã¯åãã ããé åºãåºå®ãã¦ããï¼ã */ function toCanonicalPath(pathWithQuery) { 2217 const rewrite = CANONICAL_PATH_REWRITES.find((rule)=>pathWithQuery.startsWith(rule.from)); 2218 const rewritten = rewrite ? `${rewrite.to}${pathWithQuery.slice(rewrite.from.length)}` : pathWithQuery; 2219 // å®å ¨ä¸è´ã® 1 ä»¶ï¼`/kanrilp` ã¯ãã¬ãã£ãã¯ã¹ã«æããã¨é£æºã®éä¸ãå£ããï¼ã 2220 if (rewritten === "/kanrilp") return "/"; 2221 return rewritten; 2222} 2223function normalizeReportUrls(input) { 2224 const pathWithQuery = toPath(typeof input === "string" ? input : ""); 2225 const rawUrl = maskSensitivePath(pathWithQuery); 2226 return { 2227 rawUrl, 2228 canonicalUrl: maskSensitivePath(toCanonicalPath(pathWithQuery)) 2229 }; 2230} 2231/** åå¾ã§ããªãå¤ã¯ç©ºæåã§ã¯ãªã `unknown` ãæç¤ºããï¼ç°å¸¸ç³»ã®è¦æ±ï¼ã */ function normalizeDevice(input) { 2232 const pick = (value)=>typeof value === "string" && value.trim().length > 0 ? value.trim() : "unknown"; 2233 const type = input?.type;
2234 const knownType = typeof type === "string" && DEVICE_TYPES.includes(type) ? type : "unknown"; 2235 return { 2236 type: knownType, 2237 os: pick(input?.os), 2238 browser: pick(input?.browser), 2239 viewport: pick(input?.viewport), 2240 orientation: pick(input?.orientation) 2241 }; 2242} 2243function clampText(value, max = BUG_REPORT_TEXT_MAX) { 2244 if (typeof value !== "string") return null; 2245 const trimmed = value.trim(); 2246 if (trimmed.length === 0) return null; 2247 return trimmed.slice(0, max); 2248} 2249/** RFC-5321 ç¸å½ã®å®ç¨å½¢ãé·ãè¶ éã»å½¢å¼ä¸æ£ã¯ nullï¼ä¿åããªãï¼ã */ function normalizeReportEmail(input) { 2250 if (typeof input !== "string") return null; 2251 const trimmed = input.trim(); 2252 if (trimmed.length === 0 || trimmed.length > BUG_REPORT_EMAIL_MAX) return null; 2253 if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed)) return null; 2254 return trimmed; 2255} 2256const RISK_VALUES = new Set([ 2257 "green", 2258 "yellow", 2259 "red" 2260]); 2261/** 2262 * åä»ãã¤ãã¼ããçµã¿ç«ã¦ãã 2263 * 2264 * - `what_happened` ã¯ä¸¡æ¹ã§å¿ é 2265 * - å¿å㯠`user_email` å¿ é ï¼å½¢å¼æ¤è¨¼ï¼ããã°ã¤ã³ä¸ã¯ãµã¼ãã `user_id` ãã解決ããã®ã§åãåããªã 2266 * - `frequency` / `impact` ã¯é¸æå¼ã§å¿ é 2267 * - `triage_risk` ã¯ã«ãã´ãªã® `risk` ã®æ©æ¢°ã³ãã¼ãæªç¥å¤ã¯æãå®å ¨ãª `red` ã¸åã 2268 */ function buildBugReportPayload(input) { 2269 const whatHappened = clampText(input.whatHappened); 2270 if (!whatHappened) return { 2271 ok: false, 2272 error: "what_happened_required" 2273 }; 2274 const frequency = FREQUENCY_VALUES.find((value)=>value === input.frequency); 2275 if (!frequency) return { 2276 ok: false, 2277 error: "frequency_required" 2278 }; 2279 const impact = IMPACT_VALUES.find((value)=>value === input.impact); 2280 if (!impact) return { 2281 ok: false, 2282 error: "impact_required" 2283 }; 2284 let userEmail = null; 2285 if (input.authState === "guest") { 2286 if (typeof input.userEmail !== "string" || input.userEmail.trim().length === 0) { 2287 return { 2288 ok: false, 2289 error: "email_required" 2290 }; 2291 } 2292 userEmail = normalizeReportEmail(input.userEmail); 2293 if (!userEmail) return { 2294 ok: false, 2295 error: "email_invalid" 2296 }; 2297 } 2298 const urls = normalizeReportUrls(input.rawUrl); 2299 // ã«ãã´ãªãå¼ããªãã£ãã»å¤ãæ³å®å¤ãªãæãå®å ¨ãªå´ã¸åãã 2300 const resolvedRisk = input.resolved?.risk; 2301 const risk = typeof resolvedRisk === "string" && RISK_VALUES.has(resolvedRisk) ? resolvedRisk : "red"; 2302 return { 2303 ok: true, 2304 payload: { 2305 kind: "bug", 2306 auth_state: input.authState, 2307 user_email: userEmail, 2308 raw_url: urls.rawUrl, 2309 canonical_url: urls.canonicalUrl, 2310 screen_name: clampText(input.screenName, 255), 2311 device: normalizeDevice(input.device), 2312 what_happened: whatHappened, 2313 what_i_tried: clampText(input.whatITried), 2314 error_text: clampText(input.errorText), 2315 expected: clampText(input.expected), 2316 frequency, 2317 impact, 2318 triage_risk: risk, 2319 recent_events: normalizeRecentEvents(input.recentEvents, { 2320 authState: input.authState, 2321 consented: input.recentEventsConsent === true, 2322 nowMs: Date.now() 2323 }), 2324 faq_trace: Array.isArray(input.faqTrace) ? input.faqTrace.filter((value)=>typeof value === "string").slice(0, 10) : null, 2325 source_category_slug: input.resolved?.categorySlug ?? null, 2326 source_subcategory_slug: input.resolved?.subcategorySlug ?? null, 2327 error_code: input.errorCode ?? null, 2328 area: input.resolved?.area ?? null 2329 } 2330 }; 2331} 2332/** 2333 * ã¹ã¯ãªã¼ã³ã·ã§ããã®åãå ¥ãå¤å®ï¼AC-13ï¼ã 2334 * 1 ãã¡ã¤ã« 5MB 以ä¸ã»png/jpeg/webp ã®ã¿ã»1 å ±å 3 æã¾ã§ã 2335 * **storage é害ã§ãå ±åæ¬ä½ã¯åçãã**ã®ã§ããã®å¤å®ã¯æ·»ä»å´ã ããæ¢ããã 2336 */ function validateScreenshots(files) { 2337 if (files.length > BUG_REPORT_SCREENSHOT_MAX_COUNT) { 2338 return { 2339 ok: false, 2340 error: "too_many" 2341 }; 2342 } 2343 for (const file of files){ 2344 if (!BUG_REPORT_SCREENSHOT_MIME_TYPES.includes(file.mimeType)) { 2345 return { 2346 ok: false, 2347 error: "unsupported_type" 2348 }; 2349 } 2350 if (file.sizeBytes > BUG_REPORT_SCREENSHOT_MAX_BYTES) { 2351 return { 2352 ok: false, 2353 error: "too_large" 2354 }; 2355 } 2356 } 2357 return { 2358 ok: true 2359 }; 2360} 2361/** 2362 * ã¯ã©ã¤ã¢ã³ããéã£ã¦ããç´è¿æä½ãã種å¥ã»èå¥åã»æå»ã ãã«çµãï¼REQ-10ï¼ã 2363 * **allowlist ã®å¤ã®ãã¼ã¯è½ã¨ã** ââ å ¥åå¤ãç´ãè¾¼ã¾ããä½å°ãæ®ããªãã 2364 */ function normalizeRecentEvents(input, context) { 2365 if (context.authState !== "authenticated" || !context.consented || !Array.isArray(input) || input.length === 0) { 2366 return null; 2367 } 2368 const events = input.filter((item)=>Boolean(item) && typeof item === "object").map((item)=>({ 2369 kind: typeof item.kind === "string" ? item.kind : "", 2370 target: typeof item.target === "string" ? item.target.slice(0, 80) : "", 2371 at: Number(item.at) 2372 })).filter((item)=>isRecentEventKind(item.kind) && isAllowedRecentEventTarget(item.kind, item.target) && Number.isFinite(item.at) && item.at <= context.nowMs && context.nowMs - item.at <= RECENT_EVENTS_MAX_AGE_MS).slice(-RECENT_EVENTS_MAX_COUNT); 2373 return events.length > 0 ? events : null; 2374} 2375 2376;// ../../packages/shared/src/support-chatbot/next-step.ts 2377/** 2378 * FAQ æ¤ç´¢ã®çµæããæ¬¡ã®ã¹ããããæ±ºããç´é¢æ°ã 2379 * 2380 * èæ¯ï¼ç£æ» 2026-08-10ï¼:
2381 * æ§å®è£ ã¯åè£ 0 ä»¶ã®ã¨ã `UNRESOLVED_MESSAGE` ã options ç¡ãã§åºã㦠`free_input` 2382 * ã¸æ»ãã ãã§ãä¸éå¤å®ãã©ãã«ãç¡ãã£ãã`escalation_confirm` ã¸å ¥ãçµè·¯ã¯ 2383 * ãFAQ åè£ã 1 件以ä¸è¿ã£ãããã¨ãåæã® 2 ç®æï¼ãã©ãã§ããªãã㨠2384 * ã解決ãã¦ãã¾ãããï¼ããåå¨ãããæ¤ç´¢ã 0 ä»¶ãè¿ãç¶ãã人 2385 * ï¼æããµãã¼ããå¿ è¦ã¨ãã¦ãã人ã«ããµãã¼ãã¸ç¹ããã¿ã³ãä¸åº¦ãç¾ããªãã£ãã 2386 * å® seed ã§ã¹ã³ã¢ãªã³ã°ãåç¾ããã¨ãèªç¶ãªæ¥æ¬èª 8 ã¯ã¨ãªä¸ 4 ä»¶ã 0 ä»¶ã«ãªãã 2387 * 2388 * å¤å®ããã® 1 颿°ã«éãè¾¼ããåè£è¡¨ç¤ºï¼`showFaqCandidates` ã® 0 ä»¶åå²ï¼ã¨ 2389 * æ¤ç´¢å®è¡ï¼`handleFreeInput`ï¼ã®ä¸¡æ¹ããå¼ã¶ãçæ¹ã ãã«ç½®ãã¨å¿ ãç©´ãæ®ãããã 2390 * ä¸éæ¯è¼ã®ãªãã©ã«ã widget å´ã¸æ£ãããªãã 2391 */ 2392/** 2393 * æ®ãã®æ¤ç´¢åæ°ãæ§å®è£ 㯠`MAX_FREE_INPUT_RETRIES - freeInputCount` ãç´æ¥åºãã¦ããã 2394 * 0 ã®æ¬¡ã« -1, -2 ã¨è² å¤ã表示ãã¦ããã 2395 */ function remainingFreeInputSearches(freeInputCount, maxRetries = MAX_FREE_INPUT_RETRIES) { 2396 return Math.max(0, maxRetries - Math.max(0, freeInputCount)); 2397} 2398function resolveNextStepAfterSearch({ hitCount, freeInputCount, maxRetries = MAX_FREE_INPUT_RETRIES }) { 2399 const remainingSearches = remainingFreeInputSearches(freeInputCount, maxRetries); 2400 // åè£ãåºãããªãä¸éã«é¢ä¿ãªãèªã¾ããï¼èªããçããå ã«åºãï¼ã 2401 if (hitCount > 0) { 2402 return { 2403 step: "show_faqs", 2404 limitReached: false, 2405 remainingSearches 2406 }; 2407 } 2408 const limitReached = remainingSearches <= 0; 2409 return { 2410 step: limitReached ? "escalation_confirm" : "free_input", 2411 limitReached, 2412 remainingSearches 2413 }; 2414} 2415 2416;// ./lib/support-chatbot/next-step.ts 2417/** 2418 * SPEC-ZQTJAC3GJ5: æ£æ¬ã¯ `packages/shared` ã¸ç§»ããï¼æ¤ç´¢çµæããæ¬¡ã®ã¹ããããæ±ºããå¤å®ãapps/mobile ãåããã®ãèªãï¼ã 2419 * 2420 * ããã¯**åã¨ã¯ã¹ãã¼ãã ã**ã«ãããå®è£ ãè¶³ã㨠apps/web 㨠apps/mobile ã§ 2421 * 夿ãå²ããåãä¼è©±ãé¢ãã¨ã«å¥ã®åºå£ã»å¥ã®è¡ãå ã«ãªãã 2422 * 夿´ã¯å¿ ã `packages/shared/src/support-chatbot/next-step.ts` å´ã§è¡ãã 2423 */ 2424 2425// EXTERNAL MODULE: ./lib/support-chatbot/routing.ts + 1 modules 2426var routing = __webpack_require__(37372); 2427;// ../../packages/shared/src/support-chatbot/faq-exits.ts 2428/** 2429 * FAQ å´ã®çµç«¯ã§ãæ¬¡ã«æ¼ãããã®ããæ±ºããç´é¢æ°ï¼SPEC-WVA4F4GMQM REQ-10 / AC-06ï¼ã 2430 * 2431 * `mailbox-mode.ts` ã就活ã¡ã¼ã« AI å´ã«æã£ã¦ããè¦å¾ããã¡ãã¸ç§»ã ââ 2432 * **options ç¡ãã®ã¡ãã»ã¼ã¸ã§çµããããªã**ãå¤å®ã widget ãã追ãåºãã¦ããã¨ã 2433 * å¥ç´ããå ¨çµç«¯ãåãã¦åºå£ã 2 ã¤ä»¥ä¸ãããã¨ããç¶²ç¾ çã«æ¤æ»ã§ãã 2434 * ï¼åå²ãè¶³ããã®ã«åºå£ãè¶³ãå¿ããããå¥ç´ã§æ¢ããï¼ã 2435 * 2436 * åæ°ã®æ¦å¿µã¯ `next-step.ts` ãæ£æ¬ã¨ããããã§ã¯æããªãã就活ã¡ã¼ã«å´ã®å¾å¾©ä¸éã¨ã¯ 2437 * å¥ç©ãªã®ã§å ±æããªãï¼å ±æããã¨çæ¹ãå£ããï¼ã 2438 */ 2439 2440/** 2441 * FAQ å´ã®åºå£ã¨ãã¦ä½¿ã£ã¦ããå¤ã 2442 * 2443 * ããã«ç¡ãå¤ã鏿è¢ã«è¼ããªã ââ widget ã® `handleOptionClick` ãè§£éããã®ã¯ 2444 * ãã®éåã¨åã¹ãããåºæã®å¤ã ãã§ãç¥ããªãå¤ãè¶³ãã¨ãæ¼ãã¦ãä½ãèµ·ããªã 2445 * 鏿è¢ããçã¾ããã就活ã¡ã¼ã«å´ã® `MAILBOX_OPTION_VALUES` ã¨ã¯æ··ããªãã 2446 */ const FAQ_EXIT_VALUES = (/* unused pure expression or super */ null && ([ 2447 /** 人ã¸ç¹ã確èªã¸é²ãã */ "escalate", 2448 /** ã«ãã´ãªä¸è¦§ã¸æ»ãã */ "back_to_categories", 2449 /** ããã¼ã®å é ããããç´ãã */ "restart", 2450 /** éããã */ "close", 2451 /** åãåãã確èªã®ãã¯ããã */ "yes", 2452 /** åãåãã確èªã®ãããããã */ "no" 2453])); 2454const ESCALATE = { 2455 label: "ãµãã¼ãã«åãåããã", 2456 value: "escalate" 2457}; 2458const BACK_TO_CATEGORIES = { 2459 label: "ã«ãã´ãªããæ¢ãç´ã", 2460 value: "back_to_categories" 2461}; 2462const RESTART = { 2463 label: "æåããããç´ã", 2464 value: "restart" 2465}; 2466const ANOTHER_QUESTION = { 2467 label: "ä»ã®è³ªåããã", 2468 value: "restart" 2469}; 2470const CLOSE = { 2471 label: "éãã", 2472 value: "close" 2473}; 2474const CONFIRM_YES = { 2475 label: "ã¯ããåãåããã", 2476 value: "yes" 2477}; 2478const CONFIRM_NO = { 2479 label: "ããããèªåã§è§£æ±ºãã¾ã", 2480 value: "no" 2481}; 2482/** åãåãã確èªã® 2 æï¼`escalate` ãæ¼ããç´å¾ï¼ã */ const ESCALATION_CONFIRM_OPTIONS = [ 2483 CONFIRM_YES, 2484 CONFIRM_NO 2485]; 2486/** 解決ã»åä»å®äºã®å¾ã«æ®ãåºå£ã */ const RESOLVED_OPTIONS = [ 2487 ANOTHER_QUESTION, 2488 CLOSE 2489]; 2490/** `faq_only` ã¯äººã¸ç¹ãããFAQ ã®å¥ã«ãã´ãªãçµäºã ããæç¤ºããã */ function resolveFaqOnlyOutcome() { 2491 return { 2492 step: "resolved",
2493 message: "ãã®ã«ãã´ãªã®ãæ¡å 㯠FAQ ã®ã¿ã§ããå¥ã®ã«ãã´ãªããæ¢ãç´ããã¨ãã§ãã¾ãã", 2494 options: [ 2495 BACK_TO_CATEGORIES, 2496 CLOSE 2497 ] 2498 }; 2499} 2500/** 2501 * åè£ã 1 ä»¶ãåºããªãã£ãã¨ãã«å¿ ãæ·»ããåºå£ã 2502 * options ç¡ãã®ã¡ãã»ã¼ã¸ãè¡ãæ¢ã¾ãã¨ãã¦æ®ããªãã 2503 */ const NO_HIT_OPTIONS = [ 2504 ESCALATE, 2505 BACK_TO_CATEGORIES 2506]; 2507/** 2508 * æ¤ç´¢åæ°ã®ä¸éã«éããã¨ãã®åºå£ï¼REQ-10ï¼ã 2509 * 2510 * æ§å®è£ 㯠`FREE_INPUT_LIMIT_MESSAGE` ã options ç¡ãã§åºããç¶ãã¦ç¢ºèªã® 2 æã 2511 * å¥ããã«ã§åºãã¦ãããä¸éã«éããå¦çã«æåã«å±ãããã«ãè¡ãæ¢ã¾ãã ã£ãã®ã§ã 2512 * æ¬æã¨åºå£ã 1 ã¤ã®ããã«ã¸éç´ããããã°å ±åï¼REQ-11ï¼ã¯ããã¸è¶³ãã 2513 */ const FREE_INPUT_LIMIT_OPTIONS = [ 2514 CONFIRM_YES, 2515 CONFIRM_NO, 2516 CLOSE 2517]; 2518/** 2519 * éä¿¡ã«å¤±æããã¨ãã®åºå£ã 2520 * 2521 * ã»ãã·ã§ã³ãã¾ã ç¡ãã¨åãåãããåãä»ããããªãï¼`escalate` 㯠`sessionId` å¿ é ï¼ 2522 * ã®ã§ãæ¼ãã¦ãä½ãèµ·ããªããã¿ã³ã¯åºããªãã**ãã® 1 ä»¶ã ããåºå£ 1 ã¤ã®ä¾å¤**ã§ã 2523 * ãåºå£ã 2 ã¤ä»¥ä¸ããããæ¼ãã¦åããªããã®ãåºããªãããåªå ãã¦ããã 2524 * æ®ã 1 ã¤ã¯å¿ ãæ©è½ããï¼å é ããããç´ããï¼ã 2525 */ function buildErrorOptions(hasSession) { 2526 if (!hasSession) { 2527 return [ 2528 RESTART 2529 ]; 2530 } 2531 return [ 2532 BACK_TO_CATEGORIES, 2533 ESCALATE 2534 ]; 2535} 2536/** 2537 * 第1é層ã®è¡¨ç¤ºå 容ã 2538 * 2539 * 管çç»é¢ã§å ¨ã«ãã´ãªãç¡å¹åããå ´åã viewer æ¡ä»¶ã«ä¸è´ããè¡ãç¡ãå ´åãã 2540 * 空ã®é¸æè¢ãè¿ãã¦ä¼è©±ãæ¢ããªããã»ãã·ã§ã³ãããã°åãåãããæ®ããç¡ããã° 2541 * å®è¡ä¸è½ãªåãåãããã¿ã³ãåºããå é ããã®å試è¡ã ããè¿ãã 2542 */ function resolveCategorySelectionOutcome(categories, hasSession) { 2543 if (categories.length > 0) { 2544 return { 2545 message: CATEGORY_SELECT_MESSAGE, 2546 options: categories.map((category)=>({ 2547 label: category.label, 2548 value: category.id 2549 })) 2550 }; 2551 } 2552 return { 2553 message: CATEGORY_UNAVAILABLE_MESSAGE, 2554 options: buildErrorOptions(hasSession) 2555 }; 2556} 2557/** 2558 * ãä»ã®å ¥åã§ã¯çããåºããªããã¨ãã«åºãæ¬æã¨åºå£ã決ããã 2559 * **ã©ã¡ãã®åå²ã§ã `options.length >= 2`**ï¼è¡ãæ¢ã¾ããä½ããªãï¼ã 2560 * 2561 * ä¸éå¤å®ã¯ `resolveNextStepAfterSearch` ã«å§ããããã§ã¯æããªãã 2562 */ function resolveFaqUnresolvedOutcome(input) { 2563 const outcome = resolveNextStepAfterSearch({ 2564 hitCount: 0, 2565 freeInputCount: input.freeInputCount, 2566 maxRetries: input.maxRetries 2567 }); 2568 if (outcome.step === "escalation_confirm") { 2569 return { 2570 step: "escalation_confirm", 2571 message: `${FREE_INPUT_LIMIT_MESSAGE}\n${ESCALATION_CONFIRM_MESSAGE}`, 2572 options: FREE_INPUT_LIMIT_OPTIONS 2573 }; 2574 } 2575 return { 2576 step: "free_input", 2577 message: UNRESOLVED_MESSAGE, 2578 options: NO_HIT_OPTIONS 2579 }; 2580} 2581 2582;// ./lib/support-chatbot/faq-exits.ts 2583/** 2584 * SPEC-ZQTJAC3GJ5: æ£æ¬ã¯ `packages/shared` ã¸ç§»ããï¼FAQ å´ã®çµç«¯ã§ãæ¬¡ã«æ¼ãããã®ããapps/mobile ãåããã®ãèªãï¼ã 2585 * 2586 * ããã¯**åã¨ã¯ã¹ãã¼ãã ã**ã«ãããå®è£ ãè¶³ã㨠apps/web 㨠apps/mobile ã§ 2587 * 夿ãå²ããåãä¼è©±ãé¢ãã¨ã«å¥ã®åºå£ã»å¥ã®è¡ãå ã«ãªãã 2588 * 夿´ã¯å¿ ã `packages/shared/src/support-chatbot/faq-exits.ts` å´ã§è¡ãã 2589 */ 2590 2591;// ./lib/mailbox-chat/notice.ts 2592/** 2593 * 就活ã¡ã¼ã« AI ããçããåºããããªãã£ããã¨ãã®ç¨®å¥ï¼TASK-2083ï¼ã 2594 * 2595 * TASK-2082 ã¨åãè¦å¾ã§ã**ãã¹ã¦ã®çµç«¯ã«æ¼ãã鏿è¢ãæ·»ãã**ããã«åå¨ããã 2596 * 種å¥ãããã§åæãã¦ããã¨ãå¥ç´ããå ¨ç¨®å¥ãåãã¦åºå£ã 2 ã¤ä»¥ä¸ãããã¨ãã 2597 * ç¶²ç¾ çã«æ¤æ»ã§ããï¼åå²ãè¶³ããã®ã«æè¨ãè¶³ãå¿ããããåã¨å¥ç´ã®ä¸¡æ¹ã§æ¢ããï¼ã 2598 */ const MAILBOX_NOTICE_CODES = [ 2599 /** Gmail ãã¾ã 飿ºãã¦ããªãã */ "not_connected", 2600 /** 飿ºæ¸ã¿ã ãåç §ã§ããã¡ã¼ã«ã 0 éï¼é£æºç´å¾ãªã©ï¼ã */ "no_emails", 2601 /** èªå¯åãçãå飿ºããªãã¨ç´ããªãã */ "reconnect_required", 2602 /** èªååå¾ã忢ä¸ï¼TASK-2050 ã®èªå½ï¼ã */ "sync_paused",
2603 /** çæãè½ã¡ã / `OPENAI_API_KEY` ãç¡ããæ±ºå®è«çãªè¦ç´ãä½µãã¦è¿ãã */ "generation_unavailable", 2604 /** ã¡ã¼ã«ãå¼ããªãã£ããæ¬¡ã«æ¼ããã®ãåºããããã§å試è¡ãããã */ "retrieval_failed", 2605 /** ã¬ã¼ãä¸éï¼429ï¼ããµã¼ã㯠200 body ã§ã¯è¿ãããã¯ã©ã¤ã¢ã³ããç«ã¦ãã */ "rate_limited" 2606]; 2607const isMailboxNoticeCode = (value)=>typeof value === "string" && MAILBOX_NOTICE_CODES.includes(value); 2608 2609// EXTERNAL MODULE: ./lib/jobhunting/date.ts 2610var date = __webpack_require__(56119); 2611;// ./lib/selection-prep/sources/redaction.ts 2612/** 2613 * SPEC-2073 §10 / ç°å¸¸ç³» 6 â çæã®å ¥åã«å人æ å ±ãæµããªãããã®æ£æ¬ã 2614 * 2615 * èæ¯: ã¡ã¼ã«ç±æ¥ã®å¤ï¼`interviews.notes` / `location` / `interviewer`ï¼ã«ã¯ã 2616 * æ å½è åã»ã¡ã¼ã«ã¢ãã¬ã¹ã»é»è©±çªå·ãå ¥ã£ã¦ããå®ä¾ãããï¼TASK-2055ï¼ã 2617 * å¦çæ¬äººãç»é¢ã§è¦ãã®ã¯æ§ããªããã**å¤é¨ã®çæ API ã¸ã¯ãã®ã¾ã¾åºããªã**ã 2618 * 2619 * ãããã£ã¦ 2620 * - èªç±æï¼`notes` / `memo` / ã¡ã¼ã«æ¬æï¼ã¯åã®æç¹ã§åãåããªã 2621 * ï¼`SelectionPrepFacts` ã«ãã®æ¬ãç¡ã ï¼ å¼ã³åºãå´ã渡ããã¨ããã¨ã³ã³ãã¤ã«ã§è½ã¡ãï¼ 2622 * - æ§é åå¤ï¼å½¢å¼ã»å ´æï¼ã¯é£çµ¡å ãåã£ã¦ããæ¸¡ã 2623 * - 颿¥å®ã¯**æ°åãæ¸¡ããå½¹å²ã©ãã«ã¸ç³ã**ï¼ã颿¥å®ã¯å½¹å¡ãã¾ã§ã§å¯¾çã«ã¯è¶³ããï¼ 2624 */ /** é£çµ¡å ãè½ã¨ãããã¨ãèªã¿æã«åããå°ã空æåã«ããã¨æ¬ è½ã¨åºå¥ã§ããªãã */ const REDACTED_MARK = "ï¼ç¥ï¼"; 2625const EMAIL_PATTERN = /[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g; 2626const URL_PATTERN = /\b(?:https?:\/\/|www\.)\S+/gi; 2627/** å½å é»è©±çªå·ï¼ãã¤ãã³ããã»ãªãã»+81ï¼ã */ const PHONE_PATTERN = /(?:\+81[-\s]?\d{1,4}[-\s]?\d{1,4}[-\s]?\d{3,4}|0\d{1,4}[-\s]?\d{1,4}[-\s]?\d{3,4}|0\d{9,10})/g; 2628/** 2629 * æ§é åå¤ããé£çµ¡å ã ããè½ã¨ããæã®æå³ï¼ãªã³ã©ã¤ã³ / æ¬ç¤¾ 8F çï¼ã¯æ®ãã 2630 * è½ã¨ããç跡㯠{@link REDACTED_MARK} ã§æ®ãï¼æ¶ããã®ãå ããç¡ãã®ããåºå¥ããï¼ã 2631 */ function redaction_redactContactDetails(value, maxLength = 200) { 2632 if (typeof value !== "string") return null; 2633 const redacted = value.replace(EMAIL_PATTERN, REDACTED_MARK).replace(URL_PATTERN, REDACTED_MARK).replace(PHONE_PATTERN, REDACTED_MARK).replace(/\s+/g, " ").trim(); 2634 if (redacted.length === 0) return null; 2635 return redacted.slice(0, maxLength); 2636} 2637const INTERVIEWER_ROLES = (/* unused pure expression or super */ null && ([ 2638 "executive", 2639 "hr", 2640 "field", 2641 "multiple", 2642 "unknown" 2643])); 2644const INTERVIEWER_ROLE_LABELS = { 2645 executive: "å½¹å¡ã¯ã©ã¹", 2646 hr: "äººäºæ å½", 2647 field: "ç¾å ´ç¤¾å¡", 2648 multiple: "è¤æ°å", 2649 unknown: "䏿" 2650}; 2651const EXECUTIVE_KEYWORDS = (/* unused pure expression or super */ null && ([ 2652 "å½¹å¡", 2653 "åç· å½¹", 2654 "社é·", 2655 "代表", 2656 "CEO", 2657 "CTO", 2658 "COO", 2659 "å·è¡å½¹å¡" 2660])); 2661const HR_KEYWORDS = (/* unused pure expression or super */ null && ([ 2662 "人äº", 2663 "æ¡ç¨æ å½", 2664 "æ¡ç¨æ å½è ", 2665 "ãªã¯ã«ã¼ã¿ã¼", 2666 "HR" 2667])); 2668const FIELD_KEYWORDS = (/* unused pure expression or super */ null && ([ 2669 "ç¾å ´", 2670 "ã¨ã³ã¸ãã¢", 2671 "é å±", 2672 "é¨é·", 2673 "課é·", 2674 "ããã¼ã¸ã£ã¼", 2675 "å 輩社å¡" 2676])); 2677const containsAnyKeyword = (value, keywords)=>keywords.some((keyword)=>value.includes(keyword)); 2678/** 2679 * 颿¥å®ã®çå¤ãå½¹å²ã©ãã«ã¸ç³ãã**æ»ãå¤ã«çå¤ã¯ä¸åå«ã¾ããªãã** 2680 * æ°åããæ¸ããã¦ããªãè¡ã¯ `unknown` ã«ãªãï¼ãããæ£ãã degrade ã§ã 2681 * æ°åããå½¹å²ãã¨ãã¦éããããå®å ¨ï¼ã 2682 */ function classifyInterviewerRole(raw) { 2683 if (typeof raw !== "string") return "unknown"; 2684 const value = raw.trim(); 2685 if (value.length === 0) return "unknown"; 2686 if (containsAnyKeyword(value, EXECUTIVE_KEYWORDS)) return "executive"; 2687 if (containsAnyKeyword(value, HR_KEYWORDS)) return "hr"; 2688 if (containsAnyKeyword(value, FIELD_KEYWORDS)) return "field"; 2689 const looksPlural = value.includes("è¤æ°") || /\d+\s*å/.test(value) || /[ã,ï¼/]/.test(value); 2690 if (looksPlural) return "multiple"; 2691 return "unknown"; 2692} 2693function interviewerRoleLabel(raw) { 2694 const role = classifyInterviewerRole(raw); 2695 return role === "unknown" ? null : INTERVIEWER_ROLE_LABELS[role]; 2696} 2697 2698;
2698// ./lib/mailbox-chat/digest.ts 2699/** 2700 * 就活ã¡ã¼ã«ã AI ã¸æ¸¡ãå½¢ã«ç³ãå¯ä¸ã®å ´æï¼TASK-2083ï¼ã 2701 * 2702 * ãããæ¬æ©è½ã®å®å ¨å¢çã§ãããGmail æ¬æã¯ PII ãªã®ã§ã 2703 * **ãæ¸¡ããªãããã«æ°ãã¤ãããã§ã¯ãªããæ¸¡ãæ¬ãåã«ç¡ãã**ã§æ ä¿ãã 2704 * ï¼SPEC-2073 §10 ã® `SelectionPrepFacts` ã¨åãä½ãï¼ã 2705 * 2706 * - {@link MailboxEmailRecord} ã« `bodyText` / `snippet` / `sender` / 2707 * `gmailMessageId` / `llmResult` / `meetingUrl` ã®æ¬ãç¡ãã 2708 * 渡ããã¨ãã㨠**ã³ã³ãã¤ã«ã§è½ã¡ã**ã 2709 * - ä»¶å㯠{@link redactContactDetails} ãéãã¦ããã§ãªãã¨è¡ã«ãªããªã 2710 * ï¼ã¡ã¼ã«æ¬æã®å¼ç¨ãä»¶åã«ç´ãè¾¼ãã§ããå®ä¾ãããããï¼ã 2711 * - åä¿¡æ¥æã¯**æ¥ä»ã¾ã§**ãæå»ã¯è½ã¨ãï¼é¢è«ã®æå»ã¯ `processing_result` ã® 2712 * æ§é åå¤ã§è¶³ããæå»ã®ç²åº¦ã¯æ¬äººç¹å®ã«å¹ãã ãï¼ã 2713 * 2714 * `id` ã¯è¡ã«è¼ããªããdedupe ã¨ã¬ã¼ã³éè¨ã®ããã«ãµã¼ãå´ã§æã¤ã ãã§ã 2715 * UUID ã AI ã«è¦ãã¦ãæå³ãç¡ãããã®ã¾ã¾å¾©å±ãããã¨ç»é¢ã« UUID ãåºãã 2716 */ 2717 2718/** 1 éã¶ãã® digest è¡ã«è¼ããä»¶åã®ä¸éã */ const DIGEST_SUBJECT_MAX_CHARS = 120; 2719/** AI ã¸æ¸¡ãéæ°ã®ä¸éãã¬ã¼ã³ã®åè¨ãããã§åãã */ const MAILBOX_DIGEST_MAX_EMAILS = 60; 2720/** å¤ãç¡ãæ¬ã®åãèã空æåã«ããã¨åãããã¦èªã¿éããã */ const ABSENT = "â"; 2721/** ã©ã®ã¬ã¼ã³ã§æ¾ã£ãããå¦çã«ãä½ãè¦ãããã示ãããã«è¿ãã */ const MAILBOX_LANES = [ 2722 "recent", 2723 "company", 2724 "needs_review" 2725]; 2726const MAILBOX_LANE_LABELS = { 2727 recent: "ç´è¿ã®ã¡ã¼ã«", 2728 company: "質åã«åºã¦ãã伿¥ã®ã¡ã¼ã«", 2729 needs_review: "è¦ç¢ºèªã®ã¡ã¼ã«" 2730}; 2731/** åä¿¡æ¥æã JST ã®æ¦æ¥ã«è½ã¨ããæå»ã¯æ¨ã¦ãã */ const toDigestDate = (receivedAt)=>{ 2732 if (typeof receivedAt !== "string" || receivedAt.length === 0) return null; 2733 const ms = Date.parse(receivedAt); 2734 if (!Number.isFinite(ms)) return null; 2735 return toJstYmd(new Date(ms)); 2736}; 2737/** 2738 * é¸èã®ç¶æ³ã 1 ã»ã«ã«ç³ãã`processing_result` ã®æ§é åå¤ã ãã使ã 2739 * ï¼èªç±æã® `llmResult` ã«ã¯æ å½è åã»é»è©±çªå·ãå ¥ãå¾ãã®ã§è§¦ããªãï¼ã 2740 */ const formatStage = (record)=>{ 2741 const parts = [ 2742 record.stageName, 2743 record.stageStatus 2744 ].filter((value)=>typeof value === "string" && value.length > 0); 2745 if (parts.length > 0) return parts.join("/"); 2746 const status = record.companyStatusApplied ?? record.companyStatusCandidate; 2747 return typeof status === "string" && status.length > 0 ? status : ABSENT; 2748}; 2749/** 2750 * 1 éã¶ãã®è¡ã 2751 * å½¢å¼: `åä¿¡æ¥ | 伿¥ | ä»¶å | é¸è | éä¿¡å ãã¡ã¤ã³ | æ¢èªç¶æ [ | è¦ç¢ºèª]` 2752 * 2753 * ä»¶åã¯å¿ ã {@link redactContactDetails} ãéããè½ã¡ãé£çµ¡å 㯠`ï¼ç¥ï¼` ã«ãªãã®ã§ã 2754 * ãå ããç¡ããã¨ãè½ã¨ããããèªã¿æã«ã AI ã«ãåºå¥ã§ããã 2755 */ const buildMailboxDigestLine = (record)=>{ 2756 const cells = [ 2757 toDigestDate(record.receivedAt) ?? ABSENT, 2758 record.companyFolderName ?? "伿¥æªç¹å®", 2759 redactContactDetails(record.subject, DIGEST_SUBJECT_MAX_CHARS) ?? "ï¼ä»¶åãªãï¼", 2760 formatStage(record), 2761 record.senderDomain ?? ABSENT, 2762 record.isRead ? "æ¢èª" : "æªèª" 2763 ]; 2764 if (record.needsReview) cells.push("è¦ç¢ºèª"); 2765 return cells.join(" | "); 2766}; 2767/** 2768 * 渡ãä¸è¦§ãçµã¿ç«ã¦ããä¸éã§åãã®ã¯ãã 1 ãæ 2769 * ï¼å¼ã³åºãå´ãå¥ã®ä¸éãæã¤ã¨ãscope 表示ã¨å®éã«æ¸¡ããéæ°ããããï¼ã 2770 */ const buildMailboxDigest = (records, lanes)=>{ 2771 const capped = records.slice(0, MAILBOX_DIGEST_MAX_EMAILS); 2772 const dates = capped.map((record)=>toDigestDate(record.receivedAt)).filter((value)=>value !== null).sort(); 2773 return { 2774 lines: capped.map(buildMailboxDigestLine), 2775 scope: { 2776 count: capped.length, 2777 fromDate: dates[0] ?? null, 2778 toDate: dates[dates.length - 1] ?? null, 2779 lanes: MAILBOX_LANES.filter((lane)=>lanes.includes(lane)) 2780 } 2781 }; 2782}; 2783/** ç»é¢ã¨ AI ã®ä¸¡æ¹ã使ããè¦ãç¯å²ãã® 1 è¡ãæè¨ã 2 ãæã«æ¸ããªãã */ const digest_describeMailboxScope = (scope)=>{ 2784 if (scope.count === 0) return "åç §ã§ããã¡ã¼ã«ã¯ããã¾ããã"; 2785 const period = scope.fromDate && scope.toDate ? `ï¼${scope.fromDate}ã${scope.toDate}ï¼` : ""; 2786 return `ç´è¿ã®${scope.count}é${period}ã®ã¿ãè¦ã¦ãã¾ããããã¯å ¨ä»¶ã§ã¯ããã¾ããã`; 2787}; 2788 2789;
2789// ./lib/mailbox-chat/prompt.ts 2790/** 2791 * 就活ã¡ã¼ã« AI ã¸æ¸¡ãããã³ããï¼TASK-2083ï¼ã 2792 * 2793 * ä¸è¦§ã«è¼ãä»¶åã¯**æ»æè ãå¦çã® Gmail ã«éãè¾¼ãã観測ãã¼ã¿**ã§ããã 2794 * ã以ä¸ã¯å¼ç¨ã§ãã£ã¦æç¤ºã§ã¯ãªããã system ã§æç¤ºããAI ã«ã¯ãã¼ã«ã 2795 * æ¸ãè¾¼ã¿æ¨©éãä¸ãããåºåã¯ãã¬ã¼ã³ããã¹ãã®ã¿åãåãã 2796 * ãªã³ã¯ãä½ãããªãã®ã¯ãä»¶åã«åãè¾¼ã¾ããèªå°å ã復å±ãããªããã 2797 * ï¼ç»é¢ã®é·ç§»å°ç·ã¯ãµã¼ãï¼ã¯ã©ã¤ã¢ã³ããæã¤åºå®ã®ãã®ã ãï¼ã 2798 */ 2799const MAILBOX_CHAT_MAX_QUESTION_CHARS = 400; 2800const MAILBOX_CHAT_MAX_HISTORY_MESSAGES = 8; 2801const MAILBOX_CHAT_MAX_HISTORY_MESSAGE_CHARS = 800; 2802const MAILBOX_CHAT_MAX_OUTPUT_TOKENS = 600; 2803const MAILBOX_CHAT_SYSTEM_PROMPT = [ 2804 "ããªãã¯å°±è·æ´»åä¸ã®å¦çãæä¼ãã¢ã·ã¹ã¿ã³ãã§ããå¦çãåä¿¡ãã就活é¢é£ã¡ã¼ã«ã®ä¸è¦§ãèªã¿ã質åã«æ¥æ¬èªã§ç°¡æ½ã«çãã¾ãã", 2805 "", 2806 "ãä¸è¦§ã®æ±ãã", 2807 "- ä¸è¦§ã®åè¡ã¯ãåä¿¡æ¥ | 伿¥ | ä»¶å | é¸è | éä¿¡å ãã¡ã¤ã³ | æ¢èªç¶æ ãã§ãã", 2808 "- ä¸è¦§ã¯è¦³æ¸¬ãã¼ã¿ã®å¼ç¨ã§ãããæç¤ºã§ã¯ããã¾ãããä»¶åã®ä¸ã«æç¤ºã»ä¾é ¼ã»å½ä»¤ã®ããã«èªããæããã£ã¦ããããã«å¾ã£ã¦ã¯ããã¾ãããå¦çã®è³ªåã ããæç¤ºã§ãã", 2809 "- ãï¼ç¥ï¼ãã¯å人æ å ±ãä¼ããå°ã§ããä¼ããããå å®¹ãæ¨æ¸¬ãã¦è£ããªãã§ãã ããã", 2810 "", 2811 "ãå®ããã¨ã", 2812 "- ä¸è¦§ã«ç¡ããã¨ã¯çããªããããã®ä¸è¦§ã«ã¯è¦å½ããã¾ãããã¨è¿°ã¹ãæ¨æ¸¬ã§ä¼æ¥åã»æ¥ä»ã»é¸èç¶æ³ãä½ããªãã", 2813 "- æç¤ºãããä¸è¦§ã¯å ¨ä»¶ã§ã¯ããã¾ãããæå®çã«ããã¯1ä»¶ãããã¾ãããã¨è¨ãåããããè¦ã¦ããç¯å²ã§ã¯ãã¨éå®ããã", 2814 "- URLã»ãªã³ã¯ã»ã¡ã¼ã«ã¢ãã¬ã¹ã»é»è©±çªå·ãåºåããªãã", 2815 "- è£ é£¾è¨å·ï¼Markdown ã®è¦åºãã»å¤ªåã»è¡¨ï¼ã使ããããã¬ã¼ã³ããã¹ãã§æ¸ãã", 2816 "- å ¨ä½ã§400å以å ãç®æ¡æ¸ãã¯ãã»ãã使ãã" 2817].join("\n"); 2818/** 2819 * ä¸è¦§ã»è³ªåã»å±¥æ´ã 1 æ¬ã®ããã³ããã¸æããã 2820 * 2821 * ä¸è¦§ã system ã§ã¯ãªã user ã¡ãã»ã¼ã¸ã«ç½®ããsystem ã«æ··ãã㨠2822 * ãã·ã¹ãã ããã®æç¤ºãã¨ãã¡ã¼ã«ã®å¼ç¨ããåãå°ã®æã«ãªãã 2823 * ä»¶åã«ç´ãè¾¼ãã æç¤ºæã®éã¿ãä¸ããã 2824 */ const buildMailboxChatPrompt = (input)=>{ 2825 const { digest, question, history } = input; 2826 const digestBlock = digest.lines.length > 0 ? [ 2827 "<就活ã¡ã¼ã«ä¸è¦§>", 2828 ...digest.lines, 2829 "</就活ã¡ã¼ã«ä¸è¦§>" 2830 ].join("\n") : "<就活ã¡ã¼ã«ä¸è¦§>ï¼åç §ã§ããã¡ã¼ã«ã¯ããã¾ããï¼</就活ã¡ã¼ã«ä¸è¦§>"; 2831 return { 2832 system: MAILBOX_CHAT_SYSTEM_PROMPT, 2833 messages: [ 2834 ...history.slice(-MAILBOX_CHAT_MAX_HISTORY_MESSAGES).map((message)=>({ 2835 role: message.role, 2836 content: message.content.slice(0, MAILBOX_CHAT_MAX_HISTORY_MESSAGE_CHARS) 2837 })), 2838 { 2839 role: "user", 2840 content: [ 2841 digestBlock, 2842 "", 2843 describeMailboxScope(digest.scope), 2844 "", 2845 "ãå¦çã®è³ªåã", 2846 question.slice(0, MAILBOX_CHAT_MAX_QUESTION_CHARS) 2847 ].join("\n") 2848 } 2849 ] 2850 }; 2851}; 2852 2853;// ./lib/support-chatbot/mailbox-mode.ts 2854/** 2855 * 就活ã¡ã¼ã« AI ã¢ã¼ãã®ãæ¬¡ã«æ¼ãããã®ããæ±ºããç´é¢æ°ï¼TASK-2083ï¼ã 2856 * 2857 * TASK-2082 ã¨åãè¦å¾ â **options ç¡ãã®ã¡ãã»ã¼ã¸ã§çµããããªã**ã 2858 * å¤å®ã widget ãã追ãåºãã¦ããã¨ãå¥ç´ã 2859 * ãå ¨ notice ãåãã¦åºå£ã 2 ã¤ä»¥ä¸ãããã¨ããç¶²ç¾ çã«æ¤æ»ã§ãã 2860 * ï¼åå²ãè¶³ããã®ã«æè¨ãè¶³ãå¿ããããåã¨å¥ç´ã®ä¸¡æ¹ã§æ¢ããï¼ã 2861 * 2862 * FAQ å´ã® `next-step.ts` / `MAX_FREE_INPUT_RETRIES` ã«ã¯è§¦ããªãã 2863 * åæ°ã®æ¦å¿µãå¥ç©ï¼FAQ ã¯æ¤ç´¢ããã¡ãã¯å¾å¾©ï¼ãªã®ã§å ±æããã¨çæ¹ãå£ããã 2864 */ 2865/** 就活ã¡ã¼ã« AI ã¨ã®å¾å¾©ä¸éï¼1 ã»ãã·ã§ã³ï¼ãæ¬ä½ã¯ãµã¼ãå´ã®ã¬ã¼ãå¶éã */ const MAILBOX_CHAT_MAX_TURNS = 10; 2866/** åºå£ã®å¤ãwidget ã® `handleOptionClick` ãè§£éããã */ const MAILBOX_OPTION_VALUES = (/* unused pure expression or super */ null && ([ 2867 /** ããä¸åº¦åã質åãæãç´ãã */ "mailbox_retry", 2868 /** 就活ã¡ã¼ã«ç»é¢ãéãã */ "mailbox_open_mailbox", 2869 /** Gmail 飿ºã®è¨å®ã¸ã */ "mailbox_connect_gmail", 2870 /** FAQ ããã¼ã®å é ã¸æ»ãã */ "restart", 2871 /** 人ã¸ç¹ãã */ "escalate", 2872 /** éããã */ "close" 2873])); 2874const OPEN_MAILBOX = { 2875 label: "就活ã¡ã¼ã«ãéã", 2876 value: "mailbox_open_mailbox" 2877}; 2878const CONNECT_GMAIL = { 2879 label: "Gmail ã飿ºãã", 2880 value: "mailbox_connect_gmail" 2881}; 2882const RETRY = { 2883 label: "ããä¸åº¦è©¦ã", 2884 value: "mailbox_retry" 2885}; 2886const BACK_TO_FAQ = { 2887 label: "FAQ ããæ¢ã", 2888 value: "restart" 2889}; 2890const mailbox_mode_ESCALATE = { 2891 label: "ãµãã¼ãã«åãåããã", 2892 value: "escalate" 2893}; 2894const mailbox_mode_CLOSE = { 2895 label: "éãã", 2896 value: "close" 2897}; 2898/** ã¢ã¼ãéå§æã® 1 è¡ç®ãä¿åããªããã¨ãããã§æç¤ºããã */ const MAILBOX_INTRO_MESSAGE = "就活ã¡ã¼ã«ã«ã¤ãã¦ãçããã¾ãããä»ã©ãã¾ã§é²ãã§ã?ããè¿ä¿¡ãå¿ãã¦ãªã?ããªã©ã話ãè¨èã§å¤§ä¸å¤«ã§ã
2898ã\n" + "ãã®ä¼è©±ã¯ä¿åããã¾ãããåç㯠AI ãä½ããããå®éã®ã¡ã¼ã«ã¨åããªãå ´åãããã¾ãã"; 2899/** 就活ã¡ã¼ã«ç»é¢ã¸ã®é·ç§»å ï¼AI ã«ä½ãããªããåºå®å¤ãã¯ã©ã¤ã¢ã³ããæã¤ï¼ã */ const MAILBOX_EMAILS_HREF = "/jobhunting/emails"; 2900/** 2901 * éä¿¡ã»çæã®çµæ«ãããåºãæ¬æã¨æ¼ããåºå£ã決ããã 2902 * **ã©ã®åå²ã§ã `options.length >= 2`**ï¼è¡ãæ¢ã¾ããä½ããªãï¼ã 2903 */ function resolveMailboxOutcome(input) { 2904 const { notice, hasAnswer, turnCount, retryAfterSec } = input; 2905 const maxTurns = input.maxTurns ?? MAILBOX_CHAT_MAX_TURNS; 2906 const limitReached = turnCount >= maxTurns; 2907 if (limitReached) { 2908 return { 2909 message: "ãã®ç»é¢ã§ã®è³ªåã¯ä¸éã«éãã¾ãããç¶ãããå ´åã¯æåããããç´ããããµãã¼ãã¸ãåãåãããã ããã", 2910 options: [ 2911 BACK_TO_FAQ, 2912 mailbox_mode_ESCALATE, 2913 mailbox_mode_CLOSE 2914 ], 2915 allowInput: false 2916 }; 2917 } 2918 switch(notice){ 2919 case "not_connected": 2920 return { 2921 message: "Gmail ãã¾ã 飿ºããã¦ããªãããã就活ã¡ã¼ã«ãèªã¿åãã¾ããã飿ºããã¨ãå±ããé¸èã®é£çµ¡ãã¾ã¨ãã¦ç¢ºèªã§ãã¾ãã", 2922 options: [ 2923 CONNECT_GMAIL, 2924 BACK_TO_FAQ, 2925 mailbox_mode_ESCALATE 2926 ], 2927 allowInput: false 2928 }; 2929 case "reconnect_required": 2930 return { 2931 message: "Gmail 飿ºã®èªå¯ãåãã¦ãã¾ãã就活ã¡ã¼ã«ã®ç»é¢ãã飿ºãè§£é¤ãã¦ãããä¸åº¦é£æºãã¦ãã ããã", 2932 options: [ 2933 OPEN_MAILBOX, 2934 BACK_TO_FAQ, 2935 mailbox_mode_ESCALATE 2936 ], 2937 allowInput: false 2938 }; 2939 case "sync_paused": 2940 return { 2941 message: "ãã°ãããã°ã¤ã³ãç¡ãã£ããããGmail ã®èªååå¾ã忢ãã¦ãã¾ããã就活ã¡ã¼ã«ã®ç»é¢ã§ãååæããæ¼ãã¨åãè¾¼ãã¾ãã", 2942 options: [ 2943 OPEN_MAILBOX, 2944 RETRY, 2945 BACK_TO_FAQ 2946 ], 2947 allowInput: true 2948 }; 2949 case "no_emails": 2950 return { 2951 message: "åç §ã§ãã就活ã¡ã¼ã«ãã¾ã ããã¾ããã飿ºããç´å¾ã¯åæ ã¾ã§æéãããããã¨ãããã¾ãã", 2952 options: [ 2953 OPEN_MAILBOX, 2954 RETRY, 2955 BACK_TO_FAQ 2956 ], 2957 allowInput: true 2958 }; 2959 case "generation_unavailable": 2960 return { 2961 message: hasAnswer ? null : "AI ã®åçãä½ãã¾ããã§ãããæéãããã¦ããä¸åº¦ã試ããã ããã", 2962 options: [ 2963 RETRY, 2964 OPEN_MAILBOX, 2965 mailbox_mode_ESCALATE 2966 ], 2967 allowInput: true 2968 }; 2969 case "retrieval_failed": 2970 return { 2971 message: "就活ã¡ã¼ã«ãèªã¿åãã¾ããã§ãããæéãããã¦ããä¸åº¦ã試ããã ããã", 2972 options: [ 2973 RETRY, 2974 OPEN_MAILBOX, 2975 mailbox_mode_ESCALATE 2976 ], 2977 allowInput: true 2978 }; 2979 case "rate_limited": 2980 return { 2981 message: `ç¶ãã¦ã®ãå©ç¨ã¯${Math.max(1, retryAfterSec ?? 60)}ç§ã»ã©ãå¾ ã¡ãã ããã`, 2982 options: [ 2983 OPEN_MAILBOX, 2984 BACK_TO_FAQ, 2985 mailbox_mode_CLOSE 2986 ], 2987 allowInput: true 2988 }; 2989 case null: 2990 return { 2991 message: hasAnswer ? null : "ãã¾ã answer ãçµã¿ç«ã¦ããã¾ããã§ãããããä¸åº¦ã試ããã ããã", 2992 options: [ 2993 OPEN_MAILBOX, 2994 RETRY, 2995 mailbox_mode_ESCALATE 2996 ], 2997 allowInput: true 2998 }; 2999 } 3000}
3001/** éä¿¡ãã®ãã®ã失æããã¨ãï¼fetch ã throw / é 2xxï¼ã */ function resolveMailboxNetworkFailureOutcome(turnCount) { 3002 return resolveMailboxOutcome({ 3003 notice: "retrieval_failed", 3004 hasAnswer: false, 3005 turnCount 3006 }); 3007} 3008/** 3009 * ãã°ã¤ã³ã»ãã·ã§ã³ãåãã¦ããã¨ãï¼401ï¼ã 3010 * å試è¡ãã¦ãåããªã®ã§å ¥åæ¬ãç³ã¿ããã°ã¤ã³ãæããå°ç·ã ããæ®ãã 3011 */ function resolveMailboxUnauthorizedOutcome() { 3012 return { 3013 message: "ãã°ã¤ã³ã®æå¹æéãåãã¦ããããã§ãã就活ã¡ã¼ã«ã®ç»é¢ãéãã¦ãã°ã¤ã³ãç´ãã¦ãããããä¸åº¦ã試ããã ããã", 3014 options: [ 3015 OPEN_MAILBOX, 3016 BACK_TO_FAQ, 3017 mailbox_mode_CLOSE 3018 ], 3019 allowInput: false 3020 }; 3021} 3022/** åçã degrade æè¨ãç¡ããã¨ããç¶æ ãç»é¢ã«åºããªãããã®æå¾ã®åãç¿ã */ const MAILBOX_EMPTY_ANSWER_MESSAGE = "ãã¾ããçãã§ãã¾ããã§ãããããä¸åº¦ã試ãããã ããã就活ã¡ã¼ã«ã®ç»é¢ãã確èªãã ããã"; 3023/** ã¯ã©ã¤ã¢ã³ããæã¡åãæèã®ä¿æä»¶æ°ãããã³ããå´ã®ä¸éã¨åãå¤ã使ãã */ 3024/** å¥ç´ãå ¨åå²ãåãããã®åæã */ const MAILBOX_OUTCOME_NOTICES = [ 3025 ...MAILBOX_NOTICE_CODES, 3026 null 3027]; 3028/** æ®ãã®å¾å¾©åæ°ãè² ã«ãªããªãï¼FAQ å´ã® `remainingFreeInputSearches` ã¨åãè¦åï¼ã */ function remainingMailboxTurns(turnCount, maxTurns = MAILBOX_CHAT_MAX_TURNS) { 3029 return Math.max(0, maxTurns - Math.max(0, turnCount)); 3030} 3031/* ------------------------------------------------------------------ * 3032 * 就活ç¸è«ã¢ã¼ãã®åºå£ï¼SPEC-9773 / TASK-aichat-c48dï¼ 3033 * ------------------------------------------------------------------ */ /** 3034 * 就活ç¸è«ã¢ã¼ãï¼`/api/jobhunting/ai`ï¼ãè¿ãåºå£ã 3035 * 3036 * **æ¢åã® `MAILBOX_OPTION_VALUES` ã«æ··ããªãã** ãã¡ãã¯ã¦ã£ã¸ã§ããã® 3037 * `handleOptionClick` ãè§£éããå¤ã®éåã§ãããç¥ããªãå¤ãè¶³ã㨠3038 * ãæ¼ãã¦ãä½ãèµ·ããªã鏿è¢ããçã¾ãããã¦ã£ã¸ã§ããå´ã®é ç·ã¯æ¬ TASK ã® 3039 * File Scope å¤ãªã®ã§ãèªå½ãåããããã§å¥ãã£ã¼ã«ãã¨ãã¦è¿ãã 3040 */ const JOBHUNTING_AI_EXIT_VALUES = [ 3041 /** ææ¡ãããæ±äººãéããææ¡ã 1 件以ä¸ããã¨ãã ãåºãã */ "jobhunting_ai_view_suggested", 3042 /** æ±äººä¸è¦§ã¸ãææ¡ãç¡ãã¦ãæ¼ããåºå£ãæ®ãããã®åãç¿ã */ "jobhunting_ai_open_jobs", 3043 /** åã質åãããç´ãã */ "jobhunting_ai_retry", 3044 /** 就活ã¡ã¼ã«ã®ç»é¢ã¸ã */ "jobhunting_ai_open_mailbox", 3045 /** éããã */ "jobhunting_ai_close" 3046]; 3047/** é·ç§»å ã¯åºå®å¤ãAI ã« URL ãä½ãããªãï¼SPEC-9773 SEC-05ï¼ã */ const JOBHUNTING_AI_JOBS_HREF = "/jobs"; 3048const VIEW_SUGGESTED = { 3049 label: "ææ¡ãããæ±äººãè¦ã", 3050 value: "jobhunting_ai_view_suggested" 3051}; 3052const OPEN_JOBS = { 3053 label: "æ±äººãæ¢ã", 3054 value: "jobhunting_ai_open_jobs" 3055}; 3056const AI_RETRY = { 3057 label: "ããä¸åº¦èã", 3058 value: "jobhunting_ai_retry" 3059}; 3060const AI_OPEN_MAILBOX = { 3061 label: "就活ã¡ã¼ã«ãéã", 3062 value: "jobhunting_ai_open_mailbox" 3063}; 3064const AI_CLOSE = { 3065 label: "éãã", 3066 value: "jobhunting_ai_close" 3067}; 3068/** 3069 * åºå£ã決ããã**ã©ã®çµã¿åããã§ã 2 ã¤ä»¥ä¸è¿ã**ï¼è¡ãæ¢ã¾ããä½ããªãï¼ã 3070 * 3071 * åçãä½ããªãã£ãã¨ãã«ãããä¸åº¦èããã ããåºãã¨ãåã失æãç¹°ãè¿ããã 3072 * å°ç·ããæ®ããªããå試è¡ã¨ãAI ãä»ããã«èªåã§é²ããåºå£ãå¿ ã併置ããã 3073 */ function resolveJobhuntingAiExits(input) { 3074 if (!input.hasAnswer) { 3075 return [ 3076 AI_RETRY, 3077 OPEN_JOBS, 3078 AI_OPEN_MAILBOX 3079 ]; 3080 } 3081 if (input.hasJobs) { 3082 return [ 3083 VIEW_SUGGESTED, 3084 OPEN_JOBS, 3085 AI_RETRY 3086 ]; 3087 } 3088 return [ 3089 OPEN_JOBS, 3090 AI_RETRY, 3091 AI_CLOSE 3092 ]; 3093} 3094 3095// EXTERNAL MODULE: ./lib/support-chatbot/open-event.ts 3096var open_event = __webpack_require__(55335); 3097// EXTERNAL MODULE: ./lib/security/csrf-client.ts 3098var csrf_client = __webpack_require__(23147); 3099;
3099// ./lib/mailbox-chat/client.ts 3100/** 3101 * ãã©ã¦ã¶å´ãã `/api/mailbox-chat` ãå©ã層ï¼TASK-2083ï¼ã 3102 * 3103 * CSRF ãããã**æç¤ºçã«**ä»ããã`lib/auth/csrf-fetch.ts` ã® global fetch patch ã« 3104 * æé»ã§ä¹ãã¨ãpatch ã®é©ç¨é ãé©ç¨æ¼ãã§ 403 ã«ãªã£ãã¨ãã«åå ãè¦ããªãã 3105 * ãã® API ã `CSRF_EXEMPT_PATHS` ã«è¶³ããªããã¨ã¨å¯¾ã«ãªã£ã¦ããã 3106 * 3107 * ã¬ã¹ãã³ã¹ã¯å¤ããæ¥ãå¤ãªã®ã§ã`as` ã§ä¿¡ããã« type guard ã§æ¤è¨¼ãã¦ããè¿ãã 3108 */ 3109 3110 3111const MAILBOX_CHAT_ENDPOINT = "/api/mailbox-chat"; 3112const EMPTY_SCOPE = { 3113 count: 0, 3114 fromDate: null, 3115 toDate: null, 3116 lanes: [] 3117}; 3118const readStringArray = (value)=>Array.isArray(value) ? value.filter((item)=>typeof item === "string") : []; 3119const readScope = (value)=>{ 3120 if (typeof value !== "object" || value === null) return EMPTY_SCOPE; 3121 const record = value; 3122 const text = (raw)=>typeof raw === "string" ? raw : null; 3123 return { 3124 count: typeof record.count === "number" ? record.count : 0, 3125 fromDate: text(record.fromDate), 3126 toDate: text(record.toDate), 3127 lanes: readStringArray(record.lanes).filter((lane)=>MAILBOX_LANES.includes(lane)) 3128 }; 3129}; 3130const readAnswer = (value)=>{ 3131 const record = typeof value === "object" && value !== null ? value : {}; 3132 return { 3133 answerParagraphs: readStringArray(record.answerParagraphs), 3134 scope: readScope(record.scope), 3135 notice: isMailboxNoticeCode(record.notice) ? record.notice : null, 3136 persisted: false 3137 }; 3138}; 3139async function askMailboxChat(input) { 3140 let res; 3141 try { 3142 res = await fetch(MAILBOX_CHAT_ENDPOINT, { 3143 method: "POST", 3144 credentials: "same-origin", 3145 headers: { 3146 "Content-Type": "application/json", 3147 ...(0,csrf_client/* csrfHeaders */.lJ)() 3148 }, 3149 body: JSON.stringify(input) 3150 }); 3151 } catch { 3152 return { 3153 status: "failed" 3154 }; 3155 } 3156 if (res.status === 401) return { 3157 status: "unauthorized" 3158 }; 3159 if (res.status === 429) { 3160 const body = await res.json().catch(()=>null); 3161 const retryAfter = typeof body === "object" && body !== null && typeof Reflect.get(body, "retryAfter") === "number" ? Number(Reflect.get(body, "retryAfter")) : 60; 3162 return { 3163 status: "rate_limited", 3164 retryAfterSec: Math.max(1, retryAfter) 3165 }; 3166 } 3167 if (!res.ok) return { 3168 status: "failed" 3169 }; 3170 const body = await res.json().catch(()=>null); 3171 if (body === null) return { 3172 status: "failed" 3173 }; 3174 return { 3175 status: "ok", 3176 answer: readAnswer(body) 3177 }; 3178} 3179 3180;// ./lib/jobhunting-ai/client.ts 3181/** 3182 * ãã©ã¦ã¶å´ãã `/api/jobhunting/ai` ãå©ã層ï¼SPEC-9773 / TASK-widget-8b2dï¼ã 3183 * 3184 * `lib/mailbox-chat/client.ts` ã¨åãè¦å¾: 3185 * - CSRF ãããã**æç¤ºçã«**ä»ãããglobal fetch patch ã«æé»ã§ä¹ãã¨ã 3186 * 403 ã«ãªã£ãã¨ãã«åå ãè¦ããªãããã® API ã `CSRF_EXEMPT_PATHS` ã« 3187 * è¶³ããªããã¨ã¨å¯¾ã«ãªã£ã¦ããã 3188 * - ã¬ã¹ãã³ã¹ã¯å¤ããæ¥ãå¤ãªã®ã§ `as` ã§ä¿¡ãã type guard ã§æ¤è¨¼ããã 3189 * 3190 * ## è¨æ¸¬ãããã«ç½®ãçç± 3191 * 3192 * OPS-07 ã®4ææ¨ã¯ãå¼ãã åæ°ãã«å¯¾ããæ¯çã§ãå¼ã³åºãå´ãçºç«ãå¿ãã㨠3193 * åæ¯ãæ¬ ãã¦**æåçãå®éããé«ãè¦ãã**ãå¼ã³åºãã¨åã颿°ã®ä¸ã§æã¦ã°ã 3194 * ãã® API ã使ãé¢ãå¢ãã¦ãè¨æ¸¬ãç½®ãå»ãã«ãªããªãã 3195 * ç»é¢å´ã¯çµæãæãã ãã§ãããã¤ãã³ããç¥ããªãã¦ããã 3196 */ 3197 3198 3199const JOBHUNTING_AI_ENDPOINT = "/api/jobhunting/ai"; 3200const asText = (value)=>typeof value === "string" ? value : ""; 3201const asNullableText = (value)=>typeof value === "string" && value.length > 0 ? value : null; 3202const readJobs = (value)=>{ 3203 if (!Array.isArray(value)) return []; 3204 return value.flatMap((raw)=>{ 3205 if (typeof raw !== "object" || raw === null) return []; 3206 const record = raw; 3207 const jobId = asNullableText(record.job_id); 3208 if (!jobId) return []; 3209 return [ 3210 { 3211 jobId, 3212 title: asNullableText(record.title), 3213 companyName: asNullableText(record.company_name), 3214 matchReason: asText(record.match_reason), 3215 matchDetail: asText(record.match_detail), 3216 linkUrl: asNullableText(record.link_url) 3217 } 3218 ]; 3219 }); 3220}; 3221const EXIT_VALUES = new Set(JOBHUNTING_AI_EXIT_VALUES); 3222const readExits = (value)=>{ 3223 if (!Array.isArray(value)) return []; 3224 return value.flatMap((raw)=>{ 3225 if (typeof raw !== "object" || raw === null) return []; 3226 const record = raw; 3227 const label = asNullableText(record.label); 3228 const optionValue = asNullableText(record.value); 3229 if (!label || !optionValue) return []; 3230 // ç¥ããªãå¤ã®é¸æè¢ã¯ãæãããã®ã«æ¼ãã¦ãä½ãèµ·ããªããã¿ã³ã«ãªãã
3231 // ç»é¢ã¸æ¸¡ãåã«ããã§è½ã¨ãã 3232 if (!EXIT_VALUES.has(optionValue)) return []; 3233 return [ 3234 { 3235 label, 3236 value: optionValue 3237 } 3238 ]; 3239 }); 3240}; 3241const client_readAnswer = (value)=>{ 3242 const record = typeof value === "object" && value !== null ? value : {}; 3243 return { 3244 answer: asText(record.answer), 3245 jobs: readJobs(record.jobs), 3246 exits: readExits(record.exits), 3247 // 䏿ãªããæ¬ ãã¦ãããããããªããå´ã¸åããå®å ¨ãªæ°åã ã¨èª¤èªãããªãã 3248 contextDegraded: record.contextDegraded !== false 3249 }; 3250}; 3251/** 3252 * 質åãæããçµæã¨ä¸ç·ã«è¨æ¸¬ãæã¤ã 3253 * 3254 * 失æãå¿ ã1æ¬è¨é²ããã失æãç¡è¨é²ã ã¨ãå¿çæåçã®åæ¯ããè½ã¡ã¦ 3255 * ã失æãã¦ããªããããã«è¦ããã 3256 */ async function askJobhuntingAi(input, deps = {}) { 3257 const doFetch = deps.fetchImpl ?? fetch; 3258 const track = deps.trackEvent ?? ((name, props)=>void (0,analytics/* trackAnalyticsEvent */.KG)(name, props)); 3259 const headers = deps.csrfHeadersImpl ?? csrf_client/* csrfHeaders */.lJ; 3260 const startedAt = Date.now(); 3261 const elapsed = ()=>Date.now() - startedAt; 3262 const fail = (reason, result)=>{ 3263 // åé¡ã³ã¼ãã®ã¿ã質åæã»åçæ¬æã»ä¼æ¥åã¯è¼ããªãï¼SEC-03 / SEC-07ï¼ã 3264 track("jobhunting_ai_failed", { 3265 reason, 3266 elapsed_ms: elapsed() 3267 }); 3268 return result; 3269 }; 3270 let res; 3271 try { 3272 res = await doFetch(JOBHUNTING_AI_ENDPOINT, { 3273 method: "POST", 3274 credentials: "same-origin", 3275 headers: { 3276 "Content-Type": "application/json", 3277 ...headers() 3278 }, 3279 body: JSON.stringify(input) 3280 }); 3281 } catch { 3282 return fail("network", { 3283 status: "failed" 3284 }); 3285 } 3286 if (res.status === 401) return fail("unauthorized", { 3287 status: "unauthorized" 3288 }); 3289 // ãã©ã° OFF ã®ã¨ã route 㯠404 ãè¿ããæ©è½ãç¡ãã®ã§ãã£ã¦å¤±æã§ã¯ãªããã 3290 // å¼ã°ãã¦ãããã¨èªä½ã¯ç¥ãããã®ã§åé¡ãã¦è¨é²ããã 3291 if (res.status === 404) return fail("disabled", { 3292 status: "disabled" 3293 }); 3294 if (res.status === 429) { 3295 const body = await res.json().catch(()=>null); 3296 const raw = typeof body === "object" && body !== null ? Reflect.get(body, "retryAfter") : null; 3297 const retryAfter = typeof raw === "number" ? raw : 60; 3298 return fail("rate_limited", { 3299 status: "rate_limited", 3300 retryAfterSec: Math.max(1, retryAfter) 3301 }); 3302 } 3303 if (!res.ok) return fail("http_error", { 3304 status: "failed" 3305 }); 3306 const body = await res.json().catch(()=>null); 3307 if (body === null) return fail("invalid_body", { 3308 status: "failed" 3309 }); 3310 const answer = client_readAnswer(body); 3311 // 2xx ã§ãå½¢ãå£ãã¦ãããã¨ã¯ããï¼ãããã·ã®å·®ãæ¿ãã»ããã¯ã¨ã³ãã®å¥ç´å¤æ´ï¼ã 3312 // ããã `status: "ok"` ã¨ãã¦æ°ããã¨ãå¿çæåçãæ°´å¢ãããªãã 3313 // æ¼ããåºå£ã 0 åã«ããç»é¢ãåºããã¨ã«ãªãã失æã¨ãã¦æ±ãã 3314 if (answer.exits.length === 0) return fail("invalid_body", { 3315 status: "failed" 3316 }); 3317 track("jobhunting_ai_answered", { 3318 job_count: answer.jobs.length, 3319 has_answer: answer.answer.length > 0, 3320 context_degraded: answer.contextDegraded, 3321 elapsed_ms: elapsed() 3322 }); 3323 return { 3324 status: "ok", 3325 answer 3326 }; 3327} 3328/** 3329 * ææ¡ãããæ±äººãéãããã¨ãè¨é²ããã 3330 * 3331 * `position` ãæã¤ã®ã¯ãä¸ä½ã ããæ¼ããã¦ããã®ãä¸è¦§å ¨ä½ã使ããã¦ããã®ãã§ 3332 * 並ã³é ã®å¦¥å½æ§ãèªããããã 3333 */ function trackJobhuntingAiJobClick(input, deps = {}) { 3334 const track = deps.trackEvent ?? ((name, props)=>void (0,analytics/* trackAnalyticsEvent */.KG)(name, props)); 3335 track("jobhunting_ai_job_click", { 3336 job_id: input.jobId, 3337 position: input.position, 3338 has_reason: input.hasReason 3339 }); 3340} 3341 3342;// ./components/support-chatbot/MailboxChatPanel.tsx 3343/* __next_internal_client_entry_do_not_use__ MAILBOX_INPUT_PLACEHOLDER,default auto */ 3344/** 3345 * 就活ã¡ã¼ã« AI ã¢ã¼ãã®å ¥åæ¬ï¼TASK-2083ï¼ã 3346 * 3347 * ã¡ãã»ã¼ã¸æ¬ä½ã¯ `SupportChatWidget` ã®å ±éãªã¹ããæãï¼FAQ ã¨åãå¹ãåºãï¼ã 3348 * ãããæã¤ã®ã¯ä¸ç«¯ã® composer ã¨ãè¦ã¦ããç¯å²ãã®æ³¨è¨ã ãã 3349 * 3350 * ç¯å²ã®æ³¨è¨ã¯**å¿ ãåºã**ãç´è¿ 60 éããè¦ã¦ããªãã®ã«å ¨ä»¶æ¤ç´¢ã ã¨èª¤è§£ãããã¨ã 3351 * ãç¡ããã¨ããåçããæ¬å½ã«ç¡ããã¨èªã¾ãã¦ãã¾ãã 3352 * æç»ã¯ãã¬ã¼ã³ããã¹ãï¼`dangerouslySetInnerHTML` ã使ããªãï¼ã 3353 */ 3354 3355 3356const MAILBOX_INPUT_PLACEHOLDER = "就活ã¡ã¼ã«ã«ã¤ãã¦è³ªåãã..."; 3357function MailboxChatPanel({ value, onChange, onSubmit, disabled, scopeLabel, turnCount, placeholder = MAILBOX_INPUT_PLACEHOLDER, ariaLabel = "就活ã¡ã¼ã«ã«ã¤ãã¦ã®è³ªå", showRemainingTurns = true }) { 3358 return /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 3359 className: "border-t px-4 py-3", 3360 children: [ 3361 /*#__PURE__*/ (0,jsx_runtime.jsxs)("form", { 3362 onSubmit: (event)=>{ 3363 event.preventDefault(); 3364 onSubmit(); 3365 }, 3366 className: "flex gap-2", 3367 children: [ 3368 /*#__PURE__*/ (0,jsx_runtime.jsx)(input/* Input */.p, { 3369 value: value, 3370 onChange: (event)=>onChange(event.target.value), 3371 placeholder: placeholder, 3372 disabled: disabled, 3373 // iOS Safari 㯠16px æªæºã®å ¥åæ¬ã«ãã©ã¼ã«ã¹ããã¨ãã¼ã¸å ¨ä½ã 3374 // èªåã§ãºã¼ã ããã就活ç¸è«ã»å°±æ´»ã¡ã¼ã«ã®ä¸¡ã¢ã¼ããå ±æããå¯ä¸ã®å ¥åæ¬ã 3375 className: "flex-1 text-base", 3376 "aria-label": ariaLabel 3377 }), 3378 /*#__PURE__*/ (0,jsx_runtime.jsx)(ui_button/* Button */.$, { 3379 type: "submit", 3380 size: "sm", 3381 className: "h-10", 3382 disabled: disabled || !value.trim(), 3383 children: "èã" 3384 }) 3385 ] 3386 }), 3387 scopeLabel ? /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 3388 className: "mt-1 text-[13px] text-muted-foreground", 3389 "data-mailbox-scope": true, 3390 children: scopeLabel 3391 }) : null, 3392 /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 3393 className: "mt-1 text-[13px] text-muted-foreground", 3394 children: showRemainingTurns ? `æ®ã質ååæ°: ${remainingMailboxTurns(turnCount)}
3394ï¼ãã®ä¼è©±ã¯ä¿åããã¾ããï¼` : "ãã®ä¼è©±ã¯ä¿åããã¾ãã" 3395 }) 3396 ] 3397 }); 3398} 3399 3400;// ./components/support-chatbot/SupportChatWidget.tsx 3401/* __next_internal_client_entry_do_not_use__ resolveTurnAnchorId,resolveReplyScrollTop,resolveMessageGapClass,default auto */ 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428/** 3429 * 就活ã¡ã¼ã« AI ã¢ã¼ãã®åºå£ã®ãã¡ããªã³ã¯ã¨ãã¦æããã®ï¼TASK-2083ï¼ã 3430 * `resolveMailboxOutcome` ã¯å¤ã ããè¿ããé·ç§»å ã¯ããã§ 1 ãæã«éããã 3431 */ const MAILBOX_OPTION_HREFS = { 3432 mailbox_open_mailbox: MAILBOX_EMAILS_HREF, 3433 mailbox_connect_gmail: MAILBOX_EMAILS_HREF 3434}; 3435/** 3436 * 就活ç¸è« AIï¼SPEC-9773 / TASK-widget-3c90ï¼ã 3437 * 3438 * ## ãªããã®é¢ãä½ãã®ãï¼æ¬çªå®æ¸¬ 2026-08-24ï¼ 3439 * 3440 * æ±äººã並ã¹ã¦è¦ããé¢ã¯ãã©ããæ¼ããã¦ããªãã 3441 * 就活管çã®ããããæ ã¯ 26 é±ã§ 502 impression ã«å¯¾ã **click 㯠1**ï¼0.2%ï¼ã 3442 * ãããã®ããããæ ã¯ 0.49%ãå¿åå¾ã®ãããã㯠0.00%ã 3443 * 䏿¹ãå¦çãèªåã§æ¡ä»¶ãåºãæ¤ç´¢ã¯ **8.03%** / 7.50% ã§ã40 åè¿ãå·®ãããã 3444 * è¶³ããªãã®ã¯æ±äººã®ä¸¦ã¹æ¹ã§ã¯ãªããå¦çã®è¨èããå§ã¾ãå°ç·ã ã£ãã 3445 * ããã¯ããµãã¼ã¤ã³ã¿ã¼ã³ãå¢ãããããã¨æ¸ãã¨æ±äººãè¿ãé¢ã§ããã 3446 * push ã§ã¯ãªã pull ã®å´ã«å±ããã 3447 */ const JOBHUNTING_AI_INTRO_MESSAGE = "就活ã®é²ãæ¹ã«ã¤ãã¦ãçããã¾ããããµãã¼ã¤ã³ã¿ã¼ã³ãå¢ããããããä»ã®é¸èãå°ãªãæ°ãããããªã©ã話ãè¨èã§å¤§ä¸å¤«ã§ã
3447ã\n" + "ãã®ä¼è©±ã¯ä¿åããã¾ãããåç㯠AI ãä½ããããå®éã®åéç¶æ³ã¨åããªãå ´åãããã¾ãã"; 3448const JOBHUNTING_AI_INPUT_PLACEHOLDER = "就活ã®é²ãæ¹ã«ã¤ãã¦è³ªåãã..."; 3449const JOBHUNTING_AI_DEGRADED_NOTICE = "就活管çã®éè¨ã確èªã§ããªãã£ããããåçã«ææ°ã®é¸èç¶æ³ãåæ ããã¦ããªãå¯è½æ§ãããã¾ãã"; 3450/** é·ç§»ããåºå£ã®è¡ãå ãAI ã« URL ãä½ãããªãï¼SEC-05ï¼ã */ const JOBHUNTING_AI_OPTION_HREFS = { 3451 jobhunting_ai_open_jobs: JOBHUNTING_AI_JOBS_HREF, 3452 jobhunting_ai_open_mailbox: MAILBOX_EMAILS_HREF 3453}; 3454const toJobhuntingChatOptions = (exits)=>exits.map((exit)=>{ 3455 const href = JOBHUNTING_AI_OPTION_HREFS[exit.value]; 3456 return href ? { 3457 label: exit.label, 3458 value: exit.value, 3459 href 3460 } : { 3461 label: exit.label, 3462 value: exit.value 3463 }; 3464 }); 3465/** 3466 * ææ¡ãããæ±äººããæ¼ãããªã³ã¯ã¨ãã¦ä¸¦ã¹ãã 3467 * 3468 * æ±äºº id ã¨é ä½ã鏿è¢ãã®ãã®ã«æãããã`href` ãæã¤é¸æè¢ã¯ 3469 * `handleOptionClick` ãéããªãã®ã§ãå¤ã®æååã« id ãåãã¦å¾ã§åãåºãã 3470 * ã¨ããå£ããããå½¢ã«ããªãã 3471 */ const toJobOptions = (jobs)=>jobs.map((job, index)=>({ 3472 label: [ 3473 job.companyName, 3474 job.title 3475 ].filter(Boolean).join(" / ") || "æ±äººãè¦ã", 3476 value: `jobhunting_ai_job_${job.jobId}`, 3477 href: job.linkUrl ?? `/jobs/${job.jobId}`, 3478 jobId: job.jobId, 3479 position: index, 3480 hasReason: job.matchReason.length > 0 || job.matchDetail.length > 0 3481 })); 3482const toChatOptions = (options)=>options.map((option)=>{ 3483 const href = MAILBOX_OPTION_HREFS[option.value]; 3484 return href ? { 3485 label: option.label, 3486 value: option.value, 3487 href 3488 } : { 3489 label: option.label, 3490 value: option.value 3491 }; 3492 }); 3493/** 3494 * FAQ å´ã®åºå£ï¼é¸æè¢ï¼ã®æ£æ¬ã¯ `@/lib/support-chatbot/faq-exits` ã«ç½®ãã 3495 * 就活ã¡ã¼ã« AI å´ã¨åãå½¢ã«ãã¦ãå¥ç´ãå ¨çµç«¯ãç¶²ç¾ çã«æ¤æ»ã§ããããã«ãã¦ããã 3496 */ /** 3497 * bot æ¬æã ããæ´å½¢ã㦠React è¦ç´ ã«ããã 3498 * åå²ã»æ£è¦å㯠`@hei/shared` ã®ç´é¢æ°ã«å¯ãããã㯠JSX ã¸ã®ååã ããæã¤ã 3499 */ function renderBotMessageContent(content) { 3500 const lines = splitFormattedLines(content); 3501 return lines.map((segments, lineIndex)=>/*#__PURE__*/ (0,jsx_runtime.jsxs)(react.Fragment, { 3502 children: [ 3503 segments.map((segment, index)=>segment.kind === "bold" ? /*#__PURE__*/ (0,jsx_runtime.jsx)("strong", { 3504 children: segment.value 3505 }, `segment-${index}`) : /*#__PURE__*/ (0,jsx_runtime.jsx)(react.Fragment, { 3506 children: segment.value 3507 }, `segment-${index}`)), 3508 lineIndex < lines.length - 1 ? /*#__PURE__*/ (0,jsx_runtime.jsx)("br", {}) : null 3509 ] 3510 }, `line-${lineIndex}`)); 3511} 3512/** 3513 * bot å´ã®çºè¨è åã 3514 * 3515 * ãã® 1 ã¤ã®ã¦ã£ã¸ã§ããã FAQã»ã¡ã¼ã«ç¸è«ã»å°±æ´»ç¸è«ã® 3 ã¢ã¼ããå ¼ããã®ã§ã 3516 * ã¢ã¼ããã¨ã«åä¹ãåããªãï¼ã¢ã¼ããå¤ãããã³ã«ååãå¤ããæ¹ãæ··ä¹±ããï¼ã 3517 * 3518 * **ããµãã¼ããã ãã«ããªãã** æ¥æ¬èªã®ããµãã¼ããã¯äººã®å± ãçªå£ã¨ãã¦èªããã 3519 * 3 ã¢ã¼ãã®ãã¡ 2 ã¤ã¯ LLM ã®åºåã§ãæ®ã 1 ã¤ãå®åããã¼ãªã®ã§ãã©ãã人ã§ã¯ãªãã 3520 * AI ã§ããæ¨ã¯æåã® 1 éï¼`JOBHUNTING_AI_INTRO_MESSAGE` / `MAILBOX_INTRO_MESSAGE`ï¼ã 3521 * åä¹ããããã㯠1 åããã§ãè¿ä¿¡ã®å é ã¸å¯ããæ°ããã¹ã¯ãã¼ã«ã§ã¯ä»¥åãã 3522 * æ©ãç»é¢å¤ã¸åºããè¡ãã¨ã®åä¹ãã®å´ã§äºå®ãæã¤ã 3523 */ const BOT_SENDER_LABEL = "ãµãã¼ãï¼èªåå¿çï¼"; 3524/** 3525 * å¦çå´ã®çºè¨è åã**èªã¿ä¸ãå°ç¨**ï¼`sr-only`ï¼ã 3526 * 3527 * è¦ãç®ã§ã¯å³å¯ãã¨èæ¯è²ã§è¶³ãã¦ããã®ã§ç»é¢ã«ã¯åºããªããæ¯æ´æè¡ã«ã¯ 3528 * åºãå¿ è¦ãããââ`role="log"` ãé ã«èªãã¨ããå³å¯ããè²ãèªã¿ä¸ããããªãããã 3529 * bot ã«ã ãåä¹ããããã¨èªåã®çºè¨ãç¡åã®ã¾ã¾æµããï¼AC-25ï¼ã 3530 */ const USER_SENDER_LABEL = "ããªã"; 3531/** 3532 * è¿ä¿¡ã® 1 è¡ç®ã viewport ã®ä¸ç«¯ã´ã£ããã«ä»ããªãä½ç½ï¼pxï¼ã 3533 * 3534 * 0 ã«ãã㨠1 è¡ç®ãæ ã®ç¸ã«è§¦ãã¦ãä¸ã«ç¶ããããã®ãåãã¦ããã®ãåãããªãã 3535 */ const REPLY_ANCHOR_OFFSET_PX = 8; 3536/** ãã以ä¸ã¾ã ä¸ã«æ®ã£ã¦ããã°ãææ°ã¸ããåºãã */ const JUMP_TO_LATEST_THRESHOLD_PX = 24; 3537/** 3538 * ããã¾é²ãã§ããããã¨ãã®**èµ·ç¹**ãã® idã 3539 * 3540 * å¦çã®åæã¯ããã£ããã®çµãããèµ·ç¹ã«ãªã£ã¦ããã**ä¼è©±ã®ãã£ããéå§èµ·ç¹**ã« 3541 * ãã¦ã»ããï¼ä¸è¬çãªAI chatç³»ã¨ä¸ç·ï¼ããä¸è¬ç㪠AI ãã£ãããä¸ç«¯ã«åºå®ããã®ã¯ 3542 * è¿ä¿¡ã® 1 è¡ç®ã§ã¯ãªãã**èªåãéã£ã質å**ãåçã¯ãã®ä¸ã«ä¼¸ã³ãã ããªã®ã§ã
3543 * ç»é¢ãè·³ãããä½ãèããã®ãããã£ã¨è¦ãã¦ããã 3544 * 3545 * ä¸åº¦ã¯ãè¿ä¿¡ã® 1 è¡ç®ããèµ·ç¹ã«ããããããã ã¨éä¿¡ç´å¾ã«è³ªåã viewport ã®ä¸ç«¯ã« 3546 * ãããè¿ä¿¡ãå±ããç¬éã« viewport 1 ç»é¢ã¶ãéããã¦**èªåã®è³ªåãç»é¢å¤ã¸æ¶ãã**ã 3547 * èããå 容ãè¦ããªãã¾ã¾é·ãåçã ããæ®ãã®ã§ãå¦çã®è¨ããéå§èµ·ç¹ãã«ãªã£ã¦ããªãã 3548 * 3549 * `ChatMessage` 㯠turn ã® id ãæããªãï¼`lib/support-chatbot/types.ts`ï¼ãæãã㦠3550 * å ¨ writer ãç´ãããã**æ«å°¾ããé£ç¶ãã bot ã®ä¸¦ã³ã® 1 ã¤æåã®å¦çã®çºè¨**ã 3551 * èµ·ç¹ã¨è¦ãªãæ¹ã確å®ã§ãwriter ã 1 ã¤ã触ããã«æ¸ãã 3552 * 3553 * - æ«å°¾ãå¦çã®çºè¨ â ãã®çºè¨ï¼éä¿¡ããç¬éã«ä¸ç«¯ã¸ä¸ããï¼ 3554 * - æ«å°¾ã bot â ãã®è¿ä¿¡ãçãã å¦çã®çºè¨ 3555 * - åã«å¦çã®çºè¨ãç¡ãï¼æåã®æ¨æ¶ï¼â 1 éç® 3556 * - 空ã®ä¼è©± â null 3557 */ /** 3558 * ä¼è©±ãçµãã£ã段ãããããéãã¦ãé¢è±ã¨ãã¦æ°ããªãï¼å®äºæä½ãé¢è±çã¸å ¥ããªãï¼ã 3559 */ const TERMINAL_STEPS = new Set([ 3560 "resolved", 3561 "escalated" 3562]); 3563/** ç¢ºèª poll ãããããã¦å©ç¨è ã¸ç¥ãããã¾ã§ã®é£ç¶å¤±ææ°ï¼5 ç§ééï¼ç´ 1 åï¼ã */ const CONFIRMATION_POLL_FAILURE_LIMIT = 12; 3564const CONFIRMATION_POLL_FAILED_MESSAGE = "ä¿®æ£æ¡ã®ç¢ºèªç¶æ³ãåå¾ã§ãã¾ããã§ããããã°ã¤ã³ãç´ããããã¼ã¸ãåèªã¿è¾¼ã¿ãã¦ããããä¸åº¦ã試ããã ããã";
3565function resolveTurnAnchorId(messages) { 3566 let anchorId = null; 3567 for(let index = messages.length - 1; index >= 0; index -= 1){ 3568 if (messages[index].metadata?.startsNewTurn) return messages[index].id; 3569 if (messages[index].role !== "bot") return messages[index].id; 3570 anchorId = messages[index].id; 3571 } 3572 return anchorId; 3573} 3574/** 3575 * è¿ä¿¡ãå±ããã¨ãã® `scrollTop` ã®è¡ãå ã 3576 * 3577 * DOM ã触ããªãç´é¢æ°ã«ãã¦ããã®ã¯ã**å¯ä¸ã®ä»£å ¥å **ãããã«éãã¦åä½ã§åºå®ããããã 3578 * åå²ãã¨ã« `scrollTop` ãæ¸ãå½¢ã ã¨ã`return` ã 1 è¡è½ã¨ãã ãã§æ§æåãæ»ãã 3579 * ã½ã¼ã¹æååãè¦ãå¥ç´ã§ã¯æ°ä»ããªãã 3580 * 3581 * - ç®å°ã®è¦ç´ ãç¡ãï¼æ«å°¾ãå¦çã®çºè¨ / åãè¿ä¿¡ã®ç¶ã / ã¾ã æããã¦ããªãï¼ 3582 * â æä¸é¨ãèªåã®çºè¨ã¨å ¥åä¸ã®ç¹ãè¦ãã¦ã»ããã 3583 * - ç®å°ããã â ãã®è¦ç´ ã®ä¸ç«¯ã viewport ã®ä¸ç«¯ã¸ããã ã**æä¸é¨ãè¶ããªã** 3584 * ï¼è¶ããã¨ãä¸ã«ä½ãç¡ã空ç½ã¸ã¹ã¯ãã¼ã«ããããã«è¦ããï¼ã 3585 * 3586 * ä¸é 0 ãæã¤ããã©ã¦ã¶ã® `scrollTop` setter ã¯è² å¤ã丸ãããããã®é¢æ°ã¯ 3587 * åä½ã§æãç«ã¤å¤ãè¿ãã 3588 */ function resolveReplyScrollTop(input) { 3589 const clamp = (value)=>Math.max(0, Math.min(value, input.maxScrollTop)); 3590 // ãç¶ããã¯ç®å°ã使ããªããã**ç®å°ãè¦ã¤ãããªãã£ãã®ã¨ã¯å¥**ã 3591 if (input.keepPosition) return clamp(input.scrollTop); 3592 if (!input.hasAnchorNode) return input.maxScrollTop; 3593 return clamp(input.scrollTop + input.anchorDelta - REPLY_ANCHOR_OFFSET_PX); 3594} 3595/** 3596 * ã¡ãã»ã¼ã¸ 1 ä»¶ã¶ãã®ä¸ä½ç½ï¼ãªã¼ãã¼å ±å 2026-08-27ãåãç®ããããã«ãããï¼ã 3597 * 3598 * 1 åã®è¿ä¿¡ã 4ã6 åã®ããã«ã«åãããã®ã§ãå ¨é¨ãçééï¼æ§ `space-y-3`ï¼ã§ 3599 * ç©ãã¨ãã©ãã¾ã§ã 1 ã¤ã®è¿ä¿¡ãªã®ããä½ç½ããèªããªãã 3600 * **åã話è ã®ç¶ãã¯è©°ãã話è ãå¤ããã¨ããã§å¤§ãã空ããã** 3601 */ function resolveMessageGapClass(input) { 3602 if (input.index === 0) return ""; 3603 /** 3604 * ç´åã鏿è¢ãæã¤ãªããåã話è ã®ç¶ãã§ã空ããã 3605 * 3606 * `pushJobhuntingOutcome` ã¯ãæ±äººè©³ç´°ï¼ãªã³ã¯ 5 æ¬ãã®ããã«ã®ç´å¾ã« 3607 * ãæ°ã«ãªããã®ãããã°éãã¦ã¿ã¦ãã ãããããç©ããã©ã¡ãã bot ãªã®ã§ 3608 * ç¶ãæ±ãã® 6px ã«ãªããããªã³ã¯ã¯æ ä»ãã®ãã¿ã³ã次ã®ããã«ãæ ä»ãã®ç©å½¢ã§ã 3609 * 6px ã ã¨å¢ç®ãèªããªãï¼ãªã¼ãã¼å ±åãåãç®ããããã«ãããã®æªåååï¼ã 3610 */ // 話è ãå¤ããã¨ããããã¡ã°ã大ããåãç®ã鏿è¢ã®æç¡ããåªå ããã 3611 if (input.startsNewTurn || input.previousRole !== input.role) return "mt-5"; 3612 if (input.previousHasOptions) return "mt-4"; 3613 return "mt-1.5"; 3614} 3615function generateId() { 3616 return crypto.randomUUID(); 3617} 3618function createBotMessage(content, metadata) { 3619 return { 3620 id: generateId(), 3621 role: "bot", 3622 content, 3623 metadata, 3624 created_at: new Date().toISOString() 3625 }; 3626} 3627function createUserMessage(content) { 3628 return { 3629 id: generateId(), 3630 role: "user", 3631 content, 3632 created_at: new Date().toISOString() 3633 }; 3634} 3635/** REQ-07: 端æ«å¥ããªã¼ã®å¤å®ã«ä½¿ããåå¾ã§ããªãã¨ã㯠undefinedï¼ãµã¼ãã pc ã¸åãï¼ã */ function getViewportWidth() { 3636 if (false) {} 3637 return window.innerWidth; 3638} 3639function getDeviceInfo() { 3640 if (false) {} 3641 return { 3642 userAgent: navigator.userAgent, 3643 screen: `${screen.width}x${screen.height}`, 3644 language: navigator.language, 3645 url: window.location.href 3646 }; 3647} 3648function SupportChatWidget() { 3649 const pathname = (0,navigation.usePathname)(); 3650 const [isOpen, setIsOpen] = (0,react.useState)(false); 3651 /** ãã°ãèµ·ããç»é¢ã¯ããã£ãããéãã¦ãã SPA é·ç§»ãã¦ãåãå¤ã使ãã */ const openedAtUrlRef = (0,react.useRef)(null); 3652 const openChat = (0,react.useCallback)(()=>{ 3653 openedAtUrlRef.current = false ? 0 : window.location.href; 3654 setIsOpen(true); 3655 }, []); 3656 const [messages, setMessages] = (0,react.useState)([]);
3657 const [step, setStep] = (0,react.useState)("select_user_type"); 3658 const [sessionId, setSessionId] = (0,react.useState)(null); 3659 // å¿åã»ãã·ã§ã³ã®ã¨ã¹ã«ã¬ã¼ã·ã§ã³ææè ç §åã«ä½¿ãï¼ãµã¼ãã session_token ã¨çªåããï¼ã 3660 const [sessionToken, setSessionToken] = (0,react.useState)(null); 3661 const [pendingFixConfirmation, setPendingFixConfirmation] = (0,react.useState)(null); 3662 const [fixConfirmationPresented, setFixConfirmationPresented] = (0,react.useState)(false); 3663 /** éããå¾ã«å¤ã poll ãè¿ã£ã¦ãã¦ããæ°ããä¼è©±ã¸ç¢ºèªã«ã¼ããæ··ããªãã */ const fixConfirmationRequestVersionRef = (0,react.useRef)(0); 3664 const fixConfirmationSubmittingRef = (0,react.useRef)(false); 3665 const [userType, setUserType] = (0,react.useState)(null); 3666 /** 3667 * REQ-09 / REQ-12: é¸ãã ã«ãã´ãªã®ãã¼ã¿ãæªè§£æ±ºæã®è¡ãå ã¨ç¬¬ 3 éå±¤ã®æç¡ã決ããã 3668 * ref ã«ãæã¤ã®ã¯ã`showUnresolved` ã宣è¨é ã®é½åã§ state ãèªããªãä½ç½®ã«ããããã 3669 */ const selectedRouteRef = (0,react.useRef)("escalation"); 3670 /** FAQ åçå¾ã ããFAQ èªèº«ã® if_failed ãã«ãã´ãªæ¢å®ããåªå ããã */ const faqFailureRouteRef = (0,react.useRef)(null); 3671 /** 3672 * 第 3 é層ã§ä»æ§ã©ããã®æå¦ã確å®ãããã**確å®ãã¦ãããããã®ãã¨ã«è¦ã
3672 FAQ ã® 3673 * `if_failed` ã§ãã°å ±åã¸åããã¨ã許ããªã**ï¼å¤å®ã¯ `routing.ts` ãæã¤ï¼ã 3674 * state ã§ã¯ãªã ref ãªã®ã¯ã`showUnresolved` ã®ä¾åé åãå¢ãããªãããã 3675 */ const expectedRejectionRef = (0,react.useRef)(false); 3676 /** 3677 * ãã®æå¦ã確å®ãããã«ãã´ãªã 3678 * 3679 * **確å®ãä¼è©±ã®çµããã¾ã§æã¡è¶ããªãã** æå¦ã®ãã¡ deep link ãæããªã 3 㤠3680 *ï¼ç· åè¶ éã»å®å¡ã»ã»ãã·ã§ã³åãï¼ã¯ FAQ åè£ã¸é²ã¿ãããããèªç±å ¥åã¸è½ã¡ãã 3681 * èªç±å ¥åã®æ¤ç´¢ã¯è¡¨ç¤ºå¯è½ãªå ¨ã«ãã´ãªã対象ã«ããã®ã§ãå¦çãç¶ãã¦**å¥ã®è©±é¡**ã® 3682 * FAQ ãèªãã§ã解決ãã¦ãã¾ããããæ¼ãã¨ãæå¦ã¨ã¯ç¡é¢ä¿ãªæ¬ç©ã®ä¸å ·åå ±åã¾ã§ 3683 * ãã°å ±åãã©ã¼ã ã¸è¡ããªããªãï¼æ§é åå ±åï¼ã¹ã¯ã·ã§ã»é »åº¦ã»å½±é¿ãåºããªãï¼ã 3684 * FAQ ãå¥ã«ãã´ãªã®ãã®ã¸ç§»ã£ãã確å®ãè½ã¨ãã 3685 */ const expectedRejectionCategoryRef = (0,react.useRef)(null); 3686 const [thirdTierSlug, setThirdTierSlug] = (0,react.useState)(null); 3687 const [thirdTierChoice, setThirdTierChoice] = (0,react.useState)(null); 3688 const [bugWhatHappened, setBugWhatHappened] = (0,react.useState)(""); 3689 const [bugErrorText, setBugErrorText] = (0,react.useState)(""); 3690 const [bugEmail, setBugEmail] = (0,react.useState)(""); 3691 const [bugFrequency, setBugFrequency] = (0,react.useState)("sometimes"); 3692 const [bugImpact, setBugImpact] = (0,react.useState)("blocked"); 3693 const [bugScreenshots, setBugScreenshots] = (0,react.useState)([]); 3694 const [bugSubmitError, setBugSubmitError] = (0,react.useState)(null); 3695 /** ãã°ã¤ã³ä¸ãã©ããããµã¼ããè¿ããèªè¨¼ç¶æ ãæ§ããï¼ã¡ã¼ã«å¿ é ã®åºãåãã«ä½¿ãï¼ã */ const [isAuthenticated, setIsAuthenticated] = (0,react.useState)(false); 3696 /** REQ-10: ç´è¿æä½ã®åæã**æ¢å® OFF**ã§ãéä¿¡ãã¨ã«åãç´ãï¼ä¿åããªãï¼ã */ const [recentEventsConsent, setRecentEventsConsent] = (0,react.useState)(false); 3697 const recentEventsRef = (0,react.useRef)([]); 3698 /** id -> ã«ãã´ãªã®ãã¼ã¿ã鏿è¢ã¯ label/value ããéã°ãªãã®ã§ããã§å¼ãã */ const categoryMetaRef = (0,react.useRef)(new Map()); 3699 const faqPresentationRef = (0,react.useRef)(null); 3700 const faqTraceRef = (0,react.useRef)([]); 3701 const enterMailboxModeRef = (0,react.useRef)(null); 3702 const enterJobhuntingAiModeRef = (0,react.useRef)(null); 3703 /** åå¾ããã«ãã´ãªã®ãã¼ã¿ãæ§ããï¼é¸æè¢ã¯ label/value ããéã°ãªãããï¼ã */ const rememberCategories = (0,react.useCallback)((rows)=>{ 3704 const next = new Map(categoryMetaRef.current); 3705 for (const row of rows)next.set(row.id, row); 3706 categoryMetaRef.current = next; 3707 }, []); 3708 const [selectedCategoryId, setSelectedCategoryId] = (0,react.useState)(null); 3709 const [freeInputCount, setFreeInputCount] = (0,react.useState)(0); 3710 const [freeInputText, setFreeInputText] = (0,react.useState)(""); 3711 const [escalationEmail, setEscalationEmail] = (0,react.useState)(""); 3712 const [escalationReason, setEscalationReason] = (0,react.useState)(""); 3713 const [isLoading, setIsLoading] = (0,react.useState)(false); 3714 const scrollRef = (0,react.useRef)(null); 3715 /* -------- 就活ã¡ã¼ã« AI ã¢ã¼ãï¼TASK-2083ï¼ -------- */ const [mailboxInput, setMailboxInput] = (0,react.useState)(""); 3716 const [mailboxTurnCount, setMailboxTurnCount] = (0,react.useState)(0); 3717 const [mailboxAllowInput, setMailboxAllowInput] = (0,react.useState)(true); 3718 const [mailboxScopeLabel, setMailboxScopeLabel] = (0,react.useState)(null); 3719 /** 3720 * 追質åã®æèã**ãµã¼ãã«ä¿åããªã**ã®ã§ãã¯ã©ã¤ã¢ã³ããæã¡åãå¯ä¸ã®ç½®ãå ´ã 3721 * `messages` ããä½ãç´ããªãã®ã¯ãdegrade æè¨ã¾ã§æèã«æ··ããªãããã 3722 */ const mailboxHistoryRef = (0,react.useRef)([]); 3723 /** å試è¡å¯¾è±¡ãæåå±¥æ´ã¨ã¯åããååé信失æã§ãç´åã®è³ªåã失ããªãã */ const lastMailboxQuestionRef = (0,react.useRef)(null); 3724 /** ãªã»ããåã»å¾ã®éåæåçãæ··ããªãããã®ä¸ä»£çªå·ã */ const mailboxRequestVersionRef = (0,react.useRef)(0); 3725 /* -------- 就活ç¸è« AI ã¢ã¼ãï¼SPEC-9773 / TASK-widget-3c90ï¼ -------- */ const [jobhuntingInput, setJobhuntingInput] = (0,react.useState)(""); 3726 const [jobhuntingAllowInput, setJobhuntingAllowInput] = (0,react.useState)(true); 3727 /** ã¡ã¼ã«å´ã¨**åãã**ãçããç¸æãéãã®ã§ãæèãæ
3727··ããã¨åã¿åããªãçãã«ãªãã */ const jobhuntingHistoryRef = (0,react.useRef)([]); 3728 const lastJobhuntingQuestionRef = (0,react.useRef)(null); 3729 const jobhuntingRequestVersionRef = (0,react.useRef)(0); 3730 /** ç´åã«å é ã¨ãã¦å¯ããè¿ä¿¡ã® 1 è¡ç®ãç¶ãã®è¡ã¨æ°ããè¿ä¿¡ãè¦åããããã«æã¤ã */ const lastAnchorIdRef = (0,react.useRef)(null); 3731 /** ç´åã®æ«å°¾ã®è©±è ããè¿ä¿¡ãå±ãããã¨ã鏿è¢ã§ 1 è¡è¶³ãããããè¦åããããã«æã¤ã */ const lastTailRoleRef = (0,react.useRef)(null); 3732 /** æä¸é¨ããé¢ãã¦ãããï¼é¢ãã¦ããéã ããææ°ã¸ããåºãï¼ã */ const [showJumpToLatest, setShowJumpToLatest] = (0,react.useState)(false); 3733 /** 3734 * ãµãã¼ãã»ãã·ã§ã³ä½æã®ä¸ä»£çªå·ã 3735 * 3736 * AI å¿çç¨ã®ã«ã¦ã³ã¿ã¯**質åã®ãã³ã«é²ã**ã®ã§æµç¨ã§ããªããæµç¨ããã¨ã 3737 * seed 質åã¤ãã§éããç¬éã«ã«ã¦ã³ã¿ãé²ã¿ãæ£å¸¸ãªçµè·¯ã§ãæ¯åã»ãã·ã§ã³ã 3738 * æ¨ã¦ãããï¼åãåããå°ç·ãæ»ã¬ï¼ãé²ãã®ã¯ãªã»ããæã ãã«ããã 3739 */ const sessionRequestVersionRef = (0,react.useRef)(0); 3740 /** ç¢ºèª poll ã®é£ç¶å¤±ææ°ãæä¹ ã¨ã©ã¼ãé»ã£ã¦å試è¡ãç¶ããªãããã®è¨æ°ã */ const fixConfirmationFailureRef = (0,react.useRef)(0); 3741 /** 3742 * è¿ä¿¡ãå±ããã¨ãã®æ¢ã¾ãä½ç½®ï¼ãªã¼ãã¼å ±å 2026-08-27ï¼ã 3743 * 3744 * ãã¢ãªã³ã°ã®åæã¯ããµãã¼ããã£ããããã£ããã®çµãããèµ·ç¹ã«ãªã£ã¦ããã 3745 * ä¼è©±ã®ãã£ããéå§èµ·ç¹ã«ãã¦ã»ããï¼ä¸è¬çãªAI chatç³»ã¨ä¸ç·ï¼ãã 3746 * 3747 * æ§å®è£ 㯠`scrollTop = scrollHeight` ã§**常ã«ä¼è©±ã®æ«å°¾**ã¸é£ãã§ããã 3748 * ãã®ç»é¢ã® 1 åã®è¿ä¿¡ã¯ 4ã6 åã®ããã«ã«åãããï¼`pushJobhuntingOutcome` ã 3749 * 段è½ãã¨ã»æ±äººãã¨ã»ç· ãã®ä¸è¨ã¨åãã¦ç©ãï¼ã®ã§ãæ«å°¾ã¸é£ã¶ã¨**è¿ä¿¡ã®æå¾ã® 3750 * 鏿è¢ã®ä¸**ã«çããçãã®æ¬æã¯ç»é¢ã®ä¸ã¸æµãå»ã£ã¦ãããèªãã«ã¯æ¯å 3751 * èªåã§ä¸ã¸æ»ãå¿ è¦ããã£ãã 3752 * 3753 * ## èµ·ç¹ã¯ãèªåãéã£ã質åã 3754 * 3755 * ä¸è¬ç㪠AI ãã£ãããä¸ç«¯ã«åºå®ããã®ã¯è¿ä¿¡ã® 1 è¡ç®ã§ã¯ãªã**èªåã®è³ªå**ã§ã 3756 * åçã¯ãã®ä¸ã«ä¼¸ã³ãã ããã ããç»é¢ãè·³ãããä½ãèããã®ãããã£ã¨è¦ãã¦ããã
3757 * èµ·ç¹ã®æ±ãæ¹ã¯ `resolveTurnAnchorId` ã«ããï¼writer ã 1 ã¤ã触ããã«æ¸ãå½¢ï¼ã 3758 * 3759 * - éä¿¡ããç¬é â ãã®çºè¨ãä¸ç«¯ã¸ï¼è¿ä¿¡ãå¾ ã¤éããã£ã¨è¦ãã¦ããï¼ 3760 * - è¿ä¿¡ãå±ã â ä½ç½®ã¯åããªãï¼åçãä¸ã«ä¼¸ã³ãã ãï¼ 3761 * 3762 * ä¸ç«¯ã¸å¯ããçµæãæä¸é¨ãè¶ããï¼ä¼è©±ãçãï¼å ´åã¯æä¸é¨ã§æ¢ããã 3763 * è¶ãã¦æ¢ããã¨ãä¸ã«ä½ãç¡ã空ç½ã¸ã¹ã¯ãã¼ã«ããããã«è¦ããã 3764 * 3765 * ## ä¸ã«ç¶ãããããã¨ãè¦ãã 3766 * 3767 * 質åãä¸ç«¯ã¸åºå®ããã¨ãé·ãè¿ä¿¡ï¼æ¬æ 2 段è½ï¼æ±äººè©³ç´°ï¼ãªã³ã¯ï¼ç· ãã®ä¸è¨ã§ 3768 * 1000px ãè¶ ããï¼ã®**åºå£ãã¿ã³ãå¿ ãç»é¢ã®å¤**ã¸åºããæ«å°¾ã¸é£ãã§ããé 㯠3769 * 常ã«è¦ãã¦ããã®ã§ãããã¯æ°ããæ¬ è½ã`assertNotDeadEnd` ç³»ã®å¥ç´ã¯ DOM ä¸ã® 3770 * åå¨ããè¦ãªãã®ã§æ°ä»ããªããæä¸é¨ããé¢ãã¦ããéã ããææ°ã¸ããåºãã 3771 * 3772 * å¿ç㯠SSE ã§ã¯ãªã JSON ã§å®æå½¢ãè¿ãï¼`.claude/rules/ai-chat-rules.md` 3773 * ãã¹ããªã¼ãã³ã°ã®æ±ããï¼ã®ã§ãæåã®æç»æç¹ã§è¿ä¿¡ã®å ¨ä½ã確å®ãã¦ããã 3774 * éä¸ã§ä½ç½®ãåãç´ãå¿ è¦ã¯ç¡ãã 3775 */ /** æ¬æã® scrollerãRadix 㯠viewport ãå å´ã«æã¤ã */ const getViewport = (0,react.useCallback)(()=>scrollRef.current?.querySelector("[data-radix-scroll-area-viewport]") ?? null, []); 3776 const jumpToLatest = (0,react.useCallback)(()=>{ 3777 const viewport = getViewport(); 3778 if (!viewport) return; 3779 viewport.scrollTo({ 3780 top: viewport.scrollHeight, 3781 behavior: "smooth" 3782 }); 3783 }, [ 3784 getViewport 3785 ]); 3786 (0,react.useEffect)(()=>{ 3787 const viewport = getViewport(); 3788 if (!viewport) return; 3789 const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight);
3790 const anchorId = resolveTurnAnchorId(messages); 3791 /** 3792 * **åãããã¨ãã伸ã³ãã ãã®ã¨ãã¯ãèµ·ç¹ã¸æ»ããä»ã®ä½ç½®ãä¿ã¤ã** 3793 * 3794 * 鏿è¢ã®ä¸é¨ã¯ãå¦çã®çºè¨ãæã¾ãã« bot ã® 1 è¡ã ããè¶³ã 3795 * ï¼`handleOptionClick` ã® `jobhunting_ai_view_suggested` çï¼ãããã¨èµ·ç¹ã¯ 3796 * å¤ãããªãã®ã§ãå¯ãç´ãã¨èªãã§ããä½ç½®ã失ãããæ¼ãã¦å¢ããè¡ã¯ 3797 * æãè¿ãã®ä¸ã«é ãããå¦çã«ã¯ãæ¼ãã¦ãä½ãèµ·ããªããã«è¦ããã 3798 * 3799 * èµ·ç¹ãå¤ãã£ãï¼æ°ããããã¨ããå¤ãããªãï¼ç¶ããã§åããã 3800 */ const tailRole = messages.length > 0 ? messages[messages.length - 1].role : null; 3801 /** 3802 * ãç¶ããã¨è¨ããã®ã¯ã**èµ·ç¹ãåã ã㤠ç´åãä»ãæ«å°¾ã bot** ã®ã¨ãã ãã 3803 * 3804 * èµ·ç¹ãå¦çã®çºè¨ã«ããçµæã`anchorId` ã¯ãéä¿¡ããã¨ããã¨ãè¿ä¿¡ãå±ããã¨ããã§ 3805 * åãã«ãªããæ«å°¾ã®è©±è ãè¦ãã«ãåããªãåãããªããã¨ããã¨ãè¿ä¿¡ãå±ããç¬éã« 3806 * ç®å°ãæ¨ã¦ã¦æä¸é¨ã¸é£ã³ã**質åãä¸ç«¯ã«åºå®ãã**ã¨ããå½ã®ç®çãéæãããªãã 3807 */ const isSameReply = anchorId !== null && anchorId === lastAnchorIdRef.current && lastTailRoleRef.current === "bot" && tailRole === "bot"; 3808 lastAnchorIdRef.current = anchorId; 3809 lastTailRoleRef.current = tailRole; 3810 const node = anchorId && !isSameReply ? viewport.querySelector(`[data-support-chat-message="${anchorId}"]`) : null; 3811 /** 3812 * ä»£å ¥ã¯**1 åã ã**ã«ãããåå²ãã¨ã« `scrollTop` ãæ¸ãã¦éä¸ã§ `return` ããå½¢ã¯ã 3813 * ãã® `return` ã 1 è¡è½ã¨ãã ãã§æä¸é¨ã®ä»£å ¥ã¾ã§æµããæ§æåï¼è¿ä¿¡ã®æ«å°¾ã¸é£ã¶ï¼ã 3814 * ãã®ã¾ã¾æ»ãããããè¦ãç®ã®ã½ã¼ã¹ã¯ãå é ã¸å¯ãããã¾ã¾ãªã®ã§ãæååãè¦ã 3815 * å¥ç´ã§ã¯æ°ä»ããªãï¼å®éã«å¤ç°è©¦é¨ã§éãæããï¼ã 3816 * 3817 * è¡ãå ã®æ±ºå®ã¯ `resolveReplyScrollTop`ï¼ç´é¢æ°ã»åä½ã§åºå®ãã¦ããï¼ã«ä»»ãã 3818 * ããã¯æ±ºã¾ã£ãå¤ã 1 ãæã¸æ¸ãã ãã«ããã 3819 */ viewport.scrollTop = resolveReplyScrollTop({ 3820 hasAnchorNode: node !== null, 3821 keepPosition: isSameReply, 3822 scrollTop: viewport.scrollTop, 3823 anchorDelta: node ? node.getBoundingClientRect().top - viewport.getBoundingClientRect().top : 0, 3824 maxScrollTop 3825 }); 3826 }, [ 3827 messages, 3828 getViewport 3829 ]); 3830 /** 3831 * æä¸é¨ããé¢ãã¦ããããè¦å¼µãããææ°ã¸ããåºãæ¡ä»¶ã¯ããã ãã 3832 * 3833 * **è¡ãå ãæ±ºãã广ããå¾ãã«ç½®ããã¨ã** React ã¯å®£è¨é ã«å¹æãèµ°ãããã®ã§ã 3834 * åã«ç½®ãã¨ãæ°ããè¿ä¿¡ãæ¥ãã¨ãã«**åããåã®ä½ç½®**ãèªãã§ãã¾ãã 3835 * 質åãä¸ç«¯ã¸åºå®ããç´å¾ããåºå£ãç»é¢å¤ã«ããã®ã«ãããã§åºãªããã¨ã«ãªã 3836 * ï¼æ¬¡ã«ã¹ã¯ãã¼ã«ããã¾ã§åºãªãï¼ã 3837 * 3838 * è¡ãå ãæ±ºããå´ã¨ã¯å¥ã®çµè·¯ã«ãã¦ããããã¡ãã¯ä»£å ¥ãã1 ãæã ããã§ãããã¨ã 3839 * å¥ç´ãæ°ãã¦ãããç£è¦ã®ããã«ä»£å ¥ãå¢ããã¨ãã®æ¯æ¢ããç·©ãã 3840 * 3841 * ï¼ããã«ä»£å ¥ã®å¼ãã®ãã®ãæ¸ããªããã¨ãå¥ç´ã¯ã½ã¼ã¹ãæååã¨ãã¦æ°ããã®ã§ã 3842 * 説æã¨ãã¦æ¸ããå¼ã 1 ã¤ã¨ãã¦æ°ãããããå®éã«ä¸åº¦ãããªã£ããï¼ 3843 */ (0,react.useEffect)(()=>{ 3844 const viewport = getViewport(); 3845 if (!viewport) return; 3846 const sync = ()=>{ 3847 const maxScrollTop = Math.max(0, viewport.scrollHeight - viewport.clientHeight); 3848 setShowJumpToLatest(maxScrollTop - viewport.scrollTop > JUMP_TO_LATEST_THRESHOLD_PX); 3849 }; 3850 sync(); 3851 viewport.addEventListener("scroll", sync, { 3852 passive: true 3853 }); 3854 return ()=>viewport.removeEventListener("scroll", sync); 3855 }, [ 3856 getViewport, 3857 messages, 3858 isOpen 3859 ]);
3860 // ãã£ãããéããæã®åæã¡ãã»ã¼ã¸ 3861 (0,react.useEffect)(()=>{ 3862 if (!isOpen || messages.length > 0) return; 3863 let cancelled = false; 3864 const askForUserType = ()=>{ 3865 if (cancelled) return; 3866 setMessages([ 3867 createBotMessage(INITIAL_MESSAGE, { 3868 step: "select_user_type", 3869 options: [ 3870 { 3871 label: "å¦ç", 3872 value: "student" 3873 }, 3874 { 3875 label: "伿¥", 3876 value: "company" 3877 } 3878 ] 3879 }) 3880 ]); 3881 }; 3882 /** 3883 * REQ-07 / AC-01: ãã°ã¤ã³ä¸ã¯ãã¼ã«ããµã¼ããç¥ã£ã¦ããã®ã§ç¨®å¥ãè¨ããªãã 3884 * å¤å®ã§ããªãã¨ãï¼æªãã°ã¤ã³ã»é信失æã»migration æªé©ç¨ï¼ã¯å¾æ¥ã©ããè¨ã 3885 * ââ ãµãã¼ããéããªãããªãå´ã¸åãã 3886 */ void (async ()=>{ 3887 try { 3888 const result = await getCategories({ 3889 viewportWidth: getViewportWidth() 3890 }); 3891 if (cancelled) return; 3892 rememberCategories(result.categories); 3893 setIsAuthenticated(result.authState === "authenticated"); 3894 if (result.askUserType !== false) { 3895 askForUserType(); 3896 return; 3897 } 3898 const resolved = result.actorType === "company" ? "company" : "student"; 3899 setUserType(resolved); 3900 const { sessionId: sid, sessionToken: stoken } = await startSession(resolved, getDeviceInfo()); 3901 if (cancelled) return; 3902 setSessionId(sid); 3903 setSessionToken(stoken); 3904 setStep("select_category"); 3905 const categoryOutcome = resolveCategorySelectionOutcome(result.categories, true); 3906 setMessages([ 3907 createBotMessage(categoryOutcome.message, { 3908 step: "select_category", 3909 options: [ 3910 ...categoryOutcome.options 3911 ] 3912 }) 3913 ]); 3914 } catch { 3915 askForUserType(); 3916 } 3917 })(); 3918 return ()=>{ 3919 cancelled = true; 3920 }; 3921 }, [ 3922 isOpen, 3923 messages.length, 3924 rememberCategories 3925 ]); 3926 const addBotMessage = (0,react.useCallback)((content, metadata)=>{ 3927 const msg = createBotMessage(content, metadata); 3928 setMessages((prev)=>[ 3929 ...prev, 3930 msg 3931 ]); 3932 }, []); 3933 const addUserMessage = (0,react.useCallback)((content)=>{ 3934 const msg = createUserMessage(content); 3935 setMessages((prev)=>[ 3936 ...prev, 3937 msg 3938 ]); 3939 if (sessionId) { 3940 saveMessage(sessionId, content, sessionToken).catch(()=>{}); 3941 } 3942 }, [ 3943 sessionId, 3944 sessionToken 3945 ]); 3946 /** 3947 * 就活ã¡ã¼ã« AI ã¢ã¼ãå°ç¨ã®ã¡ãã»ã¼ã¸è¿½å ï¼TASK-2083ï¼ã 3948 * 3949 * `addBotMessage` / `addUserMessage` 㯠`sessionId` ãããã¨å¿ ã 3950 * `api.saveMessage` ãå¼ã¶ã`support_chat_messages` ã® SELECT ããªã·ã¼ã¯ 3951 * `USING (true)`ï¼`202902210001_create_support_chatbot_tables.sql`ï¼ãªã®ã§ã 3952 * 伿¥åã»é¢è«æ¥ç¨ã»ä»¶åã«ç±æ¥ããåçãããã¸æ¸ãã¨èª°ããã§ãèªããè¡ã«ãªãã 3953 * 3954 * æ¢å颿°ã« `persist?: boolean` ãè¶³ãå½¢ã«ããªãã®ã¯ãæ¢å®å¤ã®ä»ãå¿ãã§ 3955 * ä¿åããã¦ãã¾ãä½å°ãæ®ããªããããä¿åããªãçµè·¯ã¯ä¿åããè¡ãæããªãã 3956 */ const pushLocalMessage = (0,react.useCallback)((role, content, metadata)=>{ 3957 const msg = role === "bot" ? createBotMessage(content, metadata) : { 3958 ...createUserMessage(content), 3959 metadata 3960 }; 3961 setMessages((prev)=>[ 3962 ...prev, 3963 msg 3964 ]); 3965 }, []); 3966 /**
3967 * éããã¨ãã«ã©ã®æ®µã§é¢è±ããããæ®ãï¼REQ-15ï¼ã 3968 * æ¬çªå®æ¸¬ã§ã¯ 40 ã»ãã·ã§ã³ãã¡ãã»ã¼ã¸ã 1 ä»¶ãæ®ããéãã¦ããã 3969 */ const trackAbandon = (0,react.useCallback)(()=>{ 3970 // çµç«¯ step ããéããã®ã¯å®äºã§ãã£ã¦é¢è±ã§ã¯ãªããããã§å¼¾ããªãã¨ãFAQ ã§ 3971 // 解決ãã人ã»ãã°å ±åãåºãçµãã人ããéããããæ¼ããã³ã«é¢è±ã¨ãã¦æ°ãããã 3972 // REQ-15 ã®é層å¥é¢è±çãå®äºæä½ã®æ°ã ãè¨ãããå¼ã³åºãå´ï¼å ±é closeã» 3973 // ãããã® Ãã»çµç«¯ step ã®åå²ï¼ã¸åå¥ã«æ¡ä»¶ãæ¸ãã¨å¿ ãã©ãããæ¼ããã®ã§ã 3974 // çºç«ç¹ãã®ãã®ã§è½ã¨ãã 3975 if (TERMINAL_STEPS.has(step)) return; 3976 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_step_abandoned", { 3977 step, 3978 device_type: (0,tree/* resolveDeviceType */.p_)(getViewportWidth()) 3979 }); 3980 }, [ 3981 step 3982 ]); 3983 // åã¹ã¿ã¼ã 3984 const handleRestart = (0,react.useCallback)(()=>{ 3985 if (pendingFixConfirmation?.isGuest && pendingFixConfirmation.sessionId) { 3986 void skipFixConfirmation({ 3987 sessionId: pendingFixConfirmation.sessionId, 3988 sessionToken: pendingFixConfirmation.sessionToken, 3989 keepalive: true 3990 }); 3991 } 3992 setPendingFixConfirmation(null); 3993 setFixConfirmationPresented(false); 3994 fixConfirmationRequestVersionRef.current += 1; 3995 fixConfirmationSubmittingRef.current = false; 3996 mailboxRequestVersionRef.current += 1; 3997 jobhuntingRequestVersionRef.current += 1; 3998 sessionRequestVersionRef.current += 1; 3999 setIsLoading(false); 4000 setMessages([]); 4001 setStep("select_user_type"); 4002 setSessionId(null); 4003 setSessionToken(null); 4004 setUserType(null); 4005 setIsAuthenticated(false); 4006 setSelectedCategoryId(null); 4007 setFreeInputCount(0); 4008 setFreeInputText(""); 4009 setEscalationEmail(""); 4010 setEscalationReason(""); 4011 setBugWhatHappened(""); 4012 setBugErrorText(""); 4013 setBugEmail(""); 4014 setBugFrequency("sometimes"); 4015 setBugImpact("blocked"); 4016 setBugScreenshots([]); 4017 setBugSubmitError(null); 4018 setRecentEventsConsent(false); 4019 recentEventsRef.current = []; 4020 setThirdTierSlug(null); 4021 setThirdTierChoice(null); 4022 selectedRouteRef.current = "escalation"; 4023 faqFailureRouteRef.current = null; 4024 expectedRejectionRef.current = false; 4025 expectedRejectionCategoryRef.current = null; 4026 categoryMetaRef.current = new Map(); 4027 faqPresentationRef.current = null; 4028 faqTraceRef.current = []; 4029 setMailboxInput(""); 4030 setMailboxTurnCount(0); 4031 setMailboxAllowInput(true); 4032 setMailboxScopeLabel(null); 4033 mailboxHistoryRef.current = []; 4034 lastMailboxQuestionRef.current = null; 4035 setJobhuntingInput(""); 4036 setJobhuntingAllowInput(true); 4037 jobhuntingHistoryRef.current = []; 4038 lastJobhuntingQuestionRef.current = null; 4039 }, [ 4040 pendingFixConfirmation 4041 ]); 4042 /** 4043 * é¸ãã ã«ãã´ãªã®ãã¼ã¿ãåãè¾¼ã¿ãæªè§£æ±ºæã®è¡ãå ã確å®ããï¼REQ-09ï¼ã 4044 * 第 3 é層ãæã¤ã«ãã´ãªãªãããã®é¸æè¢ãè¿ãï¼REQ-12ï¼ã 4045 */ const applyCategorySelection = (0,react.useCallback)((categoryId)=>{ 4046 const meta = categoryMetaRef.current.get(categoryId); 4047 selectedRouteRef.current = (0,routing/* resolveUnresolvedRoute */.Vo)({ 4048 routeOnUnresolved: meta?.route_on_unresolved ?? null, 4049 intent: meta?.intent ?? null 4050 }); 4051 const slug = meta?.slug ?? null; 4052 const choices = meta?.intent === "dynamic" ? (0,routing/* resolveThirdTier */.An)(slug) : null; 4053 return { 4054 meta, 4055 slug, 4056 choices 4057 }; 4058 }, []); 4059 /** 第 3 é層ãåºãï¼REQ-12ï¼ãæã¤ã®ã¯ `intent = dynamic` ã® 2 ã«ãã´ãªã ãã */ const showThirdTier = (0,react.useCallback)((slug, choices)=>{ 4060 setThirdTierSlug(slug); 4061 setThirdTierChoice(null); 4062 setStep("select_error_code"); 4063 addBotMessage(THIRD_TIER_MESSAGE, { 4064 step: "select_error_code", 4065 options: choices.map((choice)=>({ 4066 label: choice.label, 4067 value: choice.value 4068 })) 4069 }); 4070 }, [ 4071 addBotMessage 4072 ]); 4073 /** æ§é åãã°å ±åã®ãã©ã¼ã ãåºãï¼REQ-11ï¼ã */ const showBugReportForm = (0,react.useCallback)(()=>{ 4074 setStep("bug_report_form"); 4075 addBotMessage(BUG_REPORT_INTRO_MESSAGE, { 4076 step: "bug_report_form" 4077 }); 4078 }, [ 4079 addBotMessage 4080 ]); 4081 /** 4082 * ãä»ã®å ¥åã§ã¯çããåºããªããã¨ãã®å¯ä¸ã®åºå£ã 4083 * 4084 * ä¸éå¤å®ã¯ `resolveNextStepAfterSearch` ã«ä¸æ¬åããã0 ä»¶åå²ã»ãã©ãã§ããªããã» 4085 * ã解決ãã¦ãã¾ãããã® 3 çµè·¯ãåãå¤å®ãéãã®ã§ãæ¤ç´¢ã 0 ä»¶ãè¿ãç¶ãã人ã«ã 4086 * å¿ ã `escalation_confirm` ãç¾ããã 4087 */ const showUnresolved = (0,react.useCallback)((usedSearchCount, routeOverride)=>{ 4088 // REQ-09: æªè§£æ±ºã®è¡ãå ã¯ã«ãã´ãªã®ãã¼ã¿ã§æ±ºãããFAQ å´ã®æªè§£æ±ºçµè·¯ã¯ 4089 // ãã¹ã¦ããã¸éã¾ã£ã¦ããã®ã§ãåå²ã¯ãã® 1 ç®æã ãã«ç½®ãï¼å handler ã¸æ£ãããªãï¼ã
4090 const route = (0,routing/* resolveUnresolvedRouteWithFaqOverride */.Ts)({ 4091 categoryRoute: selectedRouteRef.current, 4092 faqRoute: routeOverride, 4093 expectedRejection: expectedRejectionRef.current 4094 }); 4095 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_unresolved_routed", { 4096 route 4097 }); 4098 if (route === "mailbox_mode" && enterMailboxModeRef.current) { 4099 enterMailboxModeRef.current(); 4100 return; 4101 } 4102 if (route === "jobhunting_mode" && enterJobhuntingAiModeRef.current) { 4103 enterJobhuntingAiModeRef.current(); 4104 return; 4105 } 4106 if (route === "bug_report") { 4107 showBugReportForm(); 4108 return; 4109 } 4110 if (route === "faq_only") { 4111 const outcome = resolveFaqOnlyOutcome(); 4112 setStep(outcome.step); 4113 addBotMessage(outcome.message, { 4114 step: outcome.step, 4115 options: [ 4116 ...outcome.options 4117 ] 4118 }); 4119 return; 4120 } 4121 const outcome = resolveFaqUnresolvedOutcome({ 4122 freeInputCount: usedSearchCount 4123 }); 4124 setStep(outcome.step); 4125 addBotMessage(outcome.message, { 4126 step: outcome.step, 4127 options: [ 4128 ...outcome.options 4129 ] 4130 }); 4131 }, [ 4132 addBotMessage, 4133 showBugReportForm 4134 ]); 4135 // FAQåè£è¡¨ç¤º 4136 const showFaqCandidates = (0,react.useCallback)((faqs, usedSearchCount, topScore)=>{ 4137 const outcome = resolveNextStepAfterSearch({ 4138 hitCount: faqs.length, 4139 freeInputCount: usedSearchCount 4140 }); 4141 if (outcome.step !== "show_faqs") { 4142 showUnresolved(usedSearchCount); 4143 return; 4144 } 4145 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_faq_presented", { 4146 candidate_count: faqs.length, 4147 top_score: topScore, 4148 accepted: false 4149 }); 4150 faqPresentationRef.current = { 4151 candidateCount: faqs.length, 4152 topScore 4153 }; 4154 setStep("show_faqs"); 4155 const options = [ 4156 ...faqs.map((f)=>({ 4157 label: f.question, 4158 value: f.id 4159 })), 4160 { 4161 label: "ã©ãã§ããªã", 4162 value: "__none__" 4163 } 4164 ]; 4165 addBotMessage(FAQ_CANDIDATES_MESSAGE, { 4166 step: "show_faqs", 4167 options 4168 }); 4169 }, [ 4170 addBotMessage, 4171 showUnresolved 4172 ]); 4173 // ã«ãã´ãªä¸è¦§ã¸æ»ãï¼æ¤ç´¢ã空æ¯ãããã¨ãã»éä¿¡ã«å¤±æããã¨ãã®åºå£ï¼ 4174 const handleBackToCategories = (0,react.useCallback)(async ()=>{ 4175 if (!userType) { 4176 handleRestart(); 4177 return; 4178 } 4179 setIsLoading(true); 4180 try { 4181 const { categories } = await getCategories({ 4182 userType, 4183 viewportWidth: getViewportWidth() 4184 }); 4185 rememberCategories(categories); 4186 setStep("select_category"); 4187 const categoryOutcome = resolveCategorySelectionOutcome(categories, Boolean(sessionId)); 4188 addBotMessage(categoryOutcome.message, { 4189 step: "select_category", 4190 options: [ 4191 ...categoryOutcome.options 4192 ] 4193 }); 4194 } catch { 4195 addBotMessage("ã«ãã´ãªãèªã¿è¾¼ãã¾ããã§ããã", { 4196 options: [ 4197 ...buildErrorOptions(Boolean(sessionId)) 4198 ] 4199 }); 4200 } finally{ 4201 setIsLoading(false); 4202 } 4203 }, [ 4204 addBotMessage, 4205 handleRestart, 4206 rememberCategories, 4207 sessionId, 4208 userType 4209 ]); 4210 // ã¦ã¼ã¶ã¼ç¨®å¥é¸æ 4211 const handleSelectUserType = (0,react.useCallback)(async (type)=>{ 4212 addUserMessage(type === "student" ? "å¦ç" : "伿¥"); 4213 setUserType(type); 4214 setIsLoading(true); 4215 // å¿çãå¾ ã£ã¦ããéã«éãããããããã®å¿çã¯æ¨ã¦ããæ¨ã¦ãªãã¨ãéããä¼è©±ã® 4216 // ç¶ãã¨ã»ãã·ã§ã³ãå¾ãã復活ããåå ¥å ´æã®åæåï¼`messages.length > 0` ã§ 4217 // ææ¢ãããï¼ãèµ°ããªãã®ã§ãå¦çã«ã¯ååã®éä¸ããå§ã¾ã£ãããã«è¦ããã 4218 const sessionVersion = sessionRequestVersionRef.current; 4219 try { 4220 const categoryResult = await getCategories({ 4221 userType: type, 4222 viewportWidth: getViewportWidth() 4223 }); 4224 if (sessionVersion !== sessionRequestVersionRef.current) return; 4225 const resolvedType = categoryResult.actorType === "company" ? "company" : "student"; 4226 setUserType(resolvedType); 4227 setIsAuthenticated(categoryResult.authState === "authenticated"); 4228 const { sessionId: sid, sessionToken: stoken } = await startSession(resolvedType, getDeviceInfo()); 4229 if (sessionVersion !== sessionRequestVersionRef.current) return; 4230 setSessionId(sid); 4231 setSessionToken(stoken); 4232 const { categories } = categoryResult; 4233 rememberCategories(categories); 4234 setStep("select_category");
4235 const categoryOutcome = resolveCategorySelectionOutcome(categories, true); 4236 addBotMessage(categoryOutcome.message, { 4237 step: "select_category", 4238 options: [ 4239 ...categoryOutcome.options 4240 ] 4241 }); 4242 } catch { 4243 if (sessionVersion !== sessionRequestVersionRef.current) return; 4244 addBotMessage("æ¥ç¶ã¨ã©ã¼ãçºçãã¾ãããããä¸åº¦ã試ããã ããã", { 4245 options: [ 4246 ...buildErrorOptions(false) 4247 ] 4248 }); 4249 } finally{ 4250 setIsLoading(false); 4251 } 4252 }, [ 4253 addBotMessage, 4254 addUserMessage, 4255 rememberCategories 4256 ]); 4257 // ã«ãã´ãªé¸æ 4258 const handleSelectCategory = (0,react.useCallback)(async (categoryId, label)=>{ 4259 addUserMessage(label); 4260 setSelectedCategoryId(categoryId); 4261 setThirdTierSlug(null); 4262 setThirdTierChoice(null); 4263 faqFailureRouteRef.current = null; 4264 expectedRejectionRef.current = false; 4265 expectedRejectionCategoryRef.current = null; 4266 const selection = applyCategorySelection(categoryId); 4267 // props 㯠slugã»åé¡ã³ã¼ãã»çå½å¤ã ããã©ãã«ãèªç±è¨è¿°ã¯è¼ããªãã 4268 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_category_selected", { 4269 level: "1", 4270 category_slug: selection.slug ?? undefined, 4271 intent: selection.meta?.intent ?? undefined, 4272 auth_state: isAuthenticated ? "authenticated" : "guest", 4273 device_type: (0,tree/* resolveDeviceType */.p_)(getViewportWidth()) 4274 }); 4275 if (selection.choices) { 4276 showThirdTier(selection.slug, selection.choices); 4277 return; 4278 } 4279 setIsLoading(true); 4280 try { 4281 const { subcategories } = await getSubcategories(categoryId, { 4282 userType: userType ?? undefined, 4283 viewportWidth: getViewportWidth() 4284 }); 4285 rememberCategories(subcategories); 4286 if (subcategories.length > 0) { 4287 setStep("select_subcategory"); 4288 addBotMessage(SUBCATEGORY_SELECT_MESSAGE, { 4289 step: "select_subcategory", 4290 options: subcategories.map((s)=>({ 4291 label: s.label, 4292 value: s.id 4293 })) 4294 }); 4295 } else { 4296 // ãµãã«ãã´ãªããªãå ´åã¯ç´æ¥FAQ表示 4297 const { faqs, topScore = 0 } = await getFaqs(categoryId, null, { 4298 userType: userType ?? undefined, 4299 viewportWidth: getViewportWidth() 4300 }); 4301 showFaqCandidates(faqs, freeInputCount, topScore); 4302 } 4303 } catch { 4304 addBotMessage("ã¨ã©ã¼ãçºçãã¾ãããããä¸åº¦ã試ããã ããã", { 4305 options: [ 4306 ...buildErrorOptions(Boolean(sessionId)) 4307 ] 4308 }); 4309 } finally{ 4310 setIsLoading(false); 4311 } 4312 }, [ 4313 addBotMessage, 4314 addUserMessage, 4315 applyCategorySelection, 4316 freeInputCount, 4317 isAuthenticated, 4318 rememberCategories, 4319 sessionId, 4320 showFaqCandidates, 4321 showThirdTier, 4322 userType 4323 ]); 4324 // ãµãã«ãã´ãªé¸æ 4325 const handleSelectSubcategory = (0,react.useCallback)(async (subcategoryId, label)=>{ 4326 addUserMessage(label); 4327 setSelectedCategoryId(subcategoryId); 4328 setThirdTierSlug(null); 4329 setThirdTierChoice(null); 4330 faqFailureRouteRef.current = null; 4331 expectedRejectionRef.current = false; 4332 expectedRejectionCategoryRef.current = null; 4333 const selection = applyCategorySelection(subcategoryId); 4334 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_category_selected", { 4335 level: "2", 4336 subcategory_slug: selection.slug ?? undefined, 4337 intent: selection.meta?.intent ?? undefined, 4338 auth_state: isAuthenticated ? "authenticated" : "guest", 4339 device_type: (0,tree/* resolveDeviceType */.p_)(getViewportWidth()) 4340 }); 4341 if (selection.choices) { 4342 showThirdTier(selection.slug, selection.choices); 4343 return; 4344 } 4345 setIsLoading(true); 4346 try { 4347 const { faqs, topScore = 0 } = await getFaqs(subcategoryId, null, { 4348 userType: userType ?? undefined, 4349 viewportWidth: getViewportWidth() 4350 }); 4351 showFaqCandidates(faqs, freeInputCount, topScore); 4352 } catch { 4353 addBotMessage("ã¨ã©ã¼ãçºçãã¾ãããããä¸åº¦ã試ããã ããã", { 4354 options: [ 4355 ...buildErrorOptions(Boolean(sessionId)) 4356 ] 4357 }); 4358 } finally{ 4359 setIsLoading(false); 4360 } 4361 }, [ 4362 addBotMessage, 4363 addUserMessage, 4364 applyCategorySelection, 4365 freeInputCount, 4366 isAuthenticated, 4367 sessionId, 4368 showFaqCandidates, 4369 showThirdTier, 4370 userType 4371 ]); 4372 /**
4373 * 第 3 é層ã®é¸æï¼REQ-12 / AC-08ï¼ã 4374 * 4375 * **仿§ã©ããã®æå¦ããã°å ±åã¸æµããªãã** `onboarding_required` ãªã©ã¯å®è£ ãæå³ã㦠4376 * åºãã¦ãããã®ã§æ¬ é¥ã§ã¯ãªãããã該å½ç»é¢ã¸èªå°ãã¦çµããã 4377 */ const handleSelectErrorCode = (0,react.useCallback)(async (value)=>{ 4378 const choice = (0,routing/* findThirdTierChoice */.Wu)(thirdTierSlug, value); 4379 if (!choice) return; 4380 addUserMessage(choice.label); 4381 setThirdTierChoice(choice.value); 4382 faqFailureRouteRef.current = null; 4383 expectedRejectionRef.current = (0,routing/* isExpectedRejectionChoice */.zs)(choice); 4384 expectedRejectionCategoryRef.current = expectedRejectionRef.current ? selectedCategoryId : null; 4385 selectedRouteRef.current = choice.route; 4386 if (choice.deepLink) { 4387 setStep("resolved"); 4388 addBotMessage(EXPECTED_REJECTION_MESSAGE, { 4389 step: "resolved", 4390 options: [ 4391 { 4392 label: "該å½ã®ç»é¢ãéã", 4393 value: "third_tier_deep_link", 4394 href: choice.deepLink 4395 }, 4396 { 4397 label: "ãµãã¼ãã«åãåããã", 4398 value: "escalate" 4399 }, 4400 { 4401 label: "éãã", 4402 value: "close" 4403 } 4404 ] 4405 }); 4406 return; 4407 } 4408 const categoryId = selectedCategoryId; 4409 if (!categoryId) { 4410 showUnresolved(freeInputCount); 4411 return; 4412 } 4413 setIsLoading(true); 4414 try { 4415 const { faqs, topScore = 0 } = await getFaqs(categoryId, choice.errorCode, { 4416 userType: userType ?? undefined, 4417 viewportWidth: getViewportWidth() 4418 }); 4419 showFaqCandidates(faqs, freeInputCount, topScore); 4420 } catch { 4421 addBotMessage("ã¨ã©ã¼ãçºçãã¾ãããããä¸åº¦ã試ããã ããã", { 4422 options: [ 4423 ...buildErrorOptions(Boolean(sessionId)) 4424 ] 4425 }); 4426 } finally{ 4427 setIsLoading(false); 4428 } 4429 }, [ 4430 addBotMessage, 4431 addUserMessage, 4432 freeInputCount, 4433 selectedCategoryId, 4434 sessionId, 4435 showFaqCandidates, 4436 showUnresolved, 4437 thirdTierSlug, 4438 userType 4439 ]); 4440 // FAQ鏿 4441 const handleSelectFaq = (0,react.useCallback)(async (faqId, label)=>{ 4442 if (faqId === "__none__") { 4443 addUserMessage("ã©ãã§ããªã"); 4444 showUnresolved(freeInputCount); 4445 return; 4446 } 4447 addUserMessage(label); 4448 const presentation = faqPresentationRef.current; 4449 if (presentation) { 4450 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_faq_presented", { 4451 candidate_count: presentation.candidateCount, 4452 top_score: presentation.topScore, 4453 accepted: true 4454 }); 4455 } 4456 setIsLoading(true); 4457 try { 4458 const { faq } = await getFaqDetail(faqId, { 4459 userType: userType ?? undefined, 4460 viewportWidth: getViewportWidth() 4461 }); 4462 if (!faqTraceRef.current.includes(faq.id)) { 4463 faqTraceRef.current = [ 4464 ...faqTraceRef.current, 4465 faq.id 4466 ].slice(-10); 4467 } 4468 faqFailureRouteRef.current = faq.ifFailed; 4469 // **å¥ã®è©±é¡ã¸ç§»ã£ããæå¦ã®ç¢ºå®ãæã¡è¶ããªãã** èªç±å ¥åã®æ¤ç´¢ã¯å ¨ã«ãã´ãªã 4470 // 対象ã«ããã®ã§ãæå¦ã確å®ãããã«ãã´ãªä»¥å¤ã® FAQ ãèªãã æç¹ã§ããã®ä¼è©±ã¯ 4471 // ãã仿§ã©ããã®æå¦ã®è©±ã§ã¯ãªããæã¡è¶ãã¨æ¬ç©ã®ä¸å ·åå ±åãåãä»ããããªãã 4472 // ã«ãã´ãªãèªããªãã¨ãã¯è½ã¨ããªãï¼å¤æææãç¡ãã®ã§æå¦å´ãä¿ã¤ï¼ã 4473 if (expectedRejectionRef.current && faq.categoryId && faq.categoryId !== expectedRejectionCategoryRef.current) { 4474 expectedRejectionRef.current = false;
4475 expectedRejectionCategoryRef.current = null; 4476 } 4477 // **æ¤ç´¢ã§é¸ãã FAQ ã®ã«ãã´ãªã¸æããã** èªç±å ¥åã®æ¤ç´¢ã¯è¡¨ç¤ºå¯è½ãªå ¨ã«ãã´ãªã 4478 // 対象ã«ããã®ã§ãã«ãã´ãª A ãã B ã® FAQ ãé¸ã¶ãã¨ããããæããªãã¨å ±åã«ã¯ 4479 // A ã® id ãéãããA ãé常ã«ãã´ãªãªã red ã¸éé¿ãããA ããã°çµè·¯ãªã 4480 // A ã® riskã»areaã»slug ã§èª¤åé¡ãããã 4481 if (faq.categoryId) setSelectedCategoryId(faq.categoryId); 4482 setStep("faq_detail"); 4483 addBotMessage(formatFaqDetail(faq), { 4484 faqId: faq.id, 4485 options: faq.deepLink ? [ 4486 { 4487 label: "é¢é£ããç»é¢ãéã", 4488 value: "faq_deep_link", 4489 href: faq.deepLink 4490 } 4491 ] : undefined 4492 }); 4493 // è§£æ±ºç¢ºèª 4494 addBotMessage(RESOLVED_CHECK_MESSAGE, { 4495 step: "faq_detail", 4496 options: [ 4497 { 4498 label: "ã¯ãã解決ãã¾ãã", 4499 value: "resolved" 4500 }, 4501 { 4502 label: "ãããã解決ãã¦ãã¾ãã", 4503 value: "unresolved" 4504 } 4505 ] 4506 }); 4507 } catch { 4508 addBotMessage("åçãèªã¿è¾¼ãã¾ããã§ããã", { 4509 options: [ 4510 ...buildErrorOptions(Boolean(sessionId)) 4511 ] 4512 }); 4513 } finally{ 4514 setIsLoading(false); 4515 } 4516 }, [ 4517 addBotMessage, 4518 addUserMessage, 4519 freeInputCount, 4520 sessionId, 4521 showUnresolved, 4522 userType 4523 ]); 4524 // 解決確èªãã³ãã© 4525 const handleResolutionCheck = (0,react.useCallback)(async (value)=>{ 4526 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_resolution_reported", { 4527 resolved: value === "resolved" 4528 }); 4529 if (value === "resolved") { 4530 addUserMessage("ã¯ãã解決ãã¾ãã"); 4531 setStep("resolved"); 4532 if (sessionId) { 4533 resolveSession(sessionId, true, sessionToken).catch(()=>{}); 4534 } 4535 addBotMessage("解決ã§ãã¦ããã£ãã§ããä»ã«ãå°ãã®ãã¨ãããã°ããã¤ã§ããå©ç¨ãã ããã", { 4536 step: "resolved", 4537 options: [ 4538 ...RESOLVED_OPTIONS 4539 ] 4540 }); 4541 } else { 4542 addUserMessage("ãããã解決ãã¦ãã¾ãã"); 4543 showUnresolved(freeInputCount, faqFailureRouteRef.current); 4544 } 4545 }, [ 4546 addBotMessage, 4547 addUserMessage, 4548 freeInputCount, 4549 sessionId, 4550 sessionToken, 4551 showUnresolved 4552 ]); 4553 // èªç±å ¥åæ¤ç´¢ 4554 const handleFreeInput = (0,react.useCallback)(async ()=>{ 4555 const query = freeInputText.trim(); 4556 if (!query || !userType) return; 4557 // ä¸éå¤å®ã«ã¯ãä»åã¶ããå«ãã ãåæ°ã使ãã`freeInputCount` 㯠setState åã® 4558 // å¤ãªã®ã§ããã®ã¾ã¾æ¸¡ãã¨å¸¸ã« 1 åã¶ãè¶³ããä¸éã«å°éããªãã 4559 const usedSearchCount = freeInputCount + 1; 4560 addUserMessage(query); 4561 setFreeInputText(""); 4562 setFreeInputCount(usedSearchCount); 4563 setIsLoading(true); 4564 try { 4565 const { faqs, topScore = 0 } = await searchFaqs(query, userType, { 4566 categoryId: selectedCategoryId, 4567 viewportWidth: getViewportWidth() 4568 }); 4569 showFaqCandidates(faqs, usedSearchCount, topScore); 4570 } catch { 4571 addBotMessage("æ¤ç´¢ä¸ã«ã¨ã©ã¼ãçºçãã¾ããã", { 4572 options: [ 4573 ...buildErrorOptions(Boolean(sessionId)) 4574 ] 4575 }); 4576 } finally{ 4577 setIsLoading(false); 4578 } 4579 }, [ 4580 freeInputCount, 4581 freeInputText, 4582 selectedCategoryId, 4583 sessionId, 4584 userType, 4585 addBotMessage, 4586 addUserMessage, 4587 showFaqCandidates 4588 ]); 4589 /* ---------------- 就活ã¡ã¼ã« AI ã¢ã¼ãï¼TASK-2083ï¼ ---------------- */ /** 4590 * åçï¼0 段è½ä»¥ä¸ï¼ã¨ degrade æè¨ãã¾ã¨ãã¦åºãã 4591 * **æå¾ã® 1 ä»¶ã«å¿ ãåºå£ãæ·»ãã**ï¼`resolveMailboxOutcome` ã¯ã©ã®åå²ã§ã 4592 * 鏿è¢ã 2 ã¤ä»¥ä¸è¿ãã®ã§ãoptions ç¡ãã§çµããçµè·¯ãä½ããªã
4592ï¼ã 4593 */ const pushMailboxOutcome = (0,react.useCallback)((paragraphs, outcome)=>{ 4594 setMailboxAllowInput(outcome.allowInput); 4595 const bodies = [ 4596 ...paragraphs, 4597 ...outcome.message === null ? [] : [ 4598 outcome.message 4599 ] 4600 ]; 4601 const lines = bodies.length > 0 ? bodies : [ 4602 MAILBOX_EMPTY_ANSWER_MESSAGE 4603 ]; 4604 lines.forEach((text, index)=>{ 4605 pushLocalMessage("bot", text, index === lines.length - 1 ? { 4606 step: "mailbox_chat", 4607 options: toChatOptions(outcome.options) 4608 } : { 4609 step: "mailbox_chat" 4610 }); 4611 }); 4612 }, [ 4613 pushLocalMessage 4614 ]); 4615 const handleMailboxAsk = (0,react.useCallback)(async (question)=>{ 4616 const trimmed = question.trim(); 4617 if (!trimmed) return; 4618 // ä¸éå¤å®ã«ã¯ä»åã¶ããå«ãã åæ°ã使ãï¼FAQ å´ã¨åãçç±ï¼ã 4619 const turnCount = mailboxTurnCount + 1; 4620 pushLocalMessage("user", trimmed); 4621 setMailboxInput(""); 4622 setMailboxTurnCount(turnCount); 4623 setIsLoading(true); 4624 lastMailboxQuestionRef.current = trimmed; 4625 const requestVersion = mailboxRequestVersionRef.current + 1; 4626 mailboxRequestVersionRef.current = requestVersion; 4627 try { 4628 const result = await askMailboxChat({ 4629 question: trimmed, 4630 history: mailboxHistoryRef.current 4631 }); 4632 if (requestVersion !== mailboxRequestVersionRef.current) return; 4633 if (result.status === "unauthorized") { 4634 pushMailboxOutcome([], resolveMailboxUnauthorizedOutcome()); 4635 return; 4636 } 4637 if (result.status === "rate_limited") { 4638 pushMailboxOutcome([], resolveMailboxOutcome({ 4639 notice: "rate_limited", 4640 hasAnswer: false, 4641 turnCount, 4642 retryAfterSec: result.retryAfterSec 4643 })); 4644 return; 4645 } 4646 if (result.status !== "ok") { 4647 pushMailboxOutcome([], resolveMailboxNetworkFailureOutcome(turnCount)); 4648 return; 4649 } 4650 const { answerParagraphs, scope, notice } = result.answer; 4651 // ãç´è¿ N éããè¦ã¦ããªãããå¿ ãç»é¢ã«åºããå ¨ä»¶æ¤ç´¢ã¨èª¤è§£ãããã¨ã 4652 // ãè¦å½ããã¾ãããããæ¬å½ã«ç¡ããã¨èªã¾ãã¦ãã¾ãã 4653 setMailboxScopeLabel(scope.count > 0 ? digest_describeMailboxScope(scope) : null); 4654 pushMailboxOutcome(answerParagraphs, resolveMailboxOutcome({ 4655 notice, 4656 hasAnswer: answerParagraphs.length > 0, 4657 turnCount 4658 })); 4659 mailboxHistoryRef.current = [ 4660 ...mailboxHistoryRef.current, 4661 { 4662 role: "user", 4663 content: trimmed 4664 }, 4665 ...answerParagraphs.length > 0 ? [ 4666 { 4667 role: "assistant", 4668 content: answerParagraphs.join("\n\n") 4669 } 4670 ] : [] 4671 ].slice(-MAILBOX_CHAT_MAX_HISTORY_MESSAGES); 4672 } finally{ 4673 if (requestVersion === mailboxRequestVersionRef.current) { 4674 setIsLoading(false); 4675 } 4676 } 4677 }, [ 4678 mailboxTurnCount, 4679 pushLocalMessage, 4680 pushMailboxOutcome 4681 ]); 4682 /* ---------------- 就活ç¸è« AI ã¢ã¼ãï¼SPEC-9773 / TASK-widget-3c90ï¼ ---------------- */ /** 4683 * åçã»æ¨è¦æã»æ±äººãªã³ã¯ã»åºå£ãã¾ã¨ãã¦åºãã 4684 * 4685 * **æå¾ã® 1 ä»¶ã«å¿ ãåºå£ãæ·»ãã**ï¼`resolveJobhuntingAiExits` ã¯ã©ã®åå²ã§ã 4686 * 2 ã¤ä»¥ä¸è¿ãã®ã§ãoptions ç¡ãã§çµããçµè·¯ãä½ããªãï¼ã 4687 * æ±äººã¯æ¬æã®ä¸ã«ãªã³ã¯ã¨ãã¦ä¸¦ã¹ããæ¼ããããã¨ã¯ OPS-07 ã®ææ¨ã«ãªãã 4688 */ const pushJobhuntingOutcome = (0,react.useCallback)((result)=>{ 4689 setJobhuntingAllowInput(result.allowInput); 4690 const bodies = result.paragraphs.filter((text)=>text.trim().length > 0); 4691 const lines = bodies.length > 0 ? bodies : [ 4692 "ãã¾ããçãã§ãã¾ããã§ãããããä¸åº¦ã試ããã ããã" 4693 ]; 4694 if (result.contextDegraded === true) { 4695 // API ã®åçæ¬æã¨ã¯åãã¦è¡¨ç¤ºããjobhuntingHistoryRef ã«ã¯æ··ããªãã 4696 // 追質åã§ãã®æ³¨ææã AI ã®ä¼è©±å±¥æ´ã¸æ»ãã¨ãåçå å
4696®¹ã¨ãã¦èª¤è§£ãããã 4697 pushLocalMessage("bot", JOBHUNTING_AI_DEGRADED_NOTICE, { 4698 step: "jobhunting_ai" 4699 }); 4700 } 4701 lines.forEach((text, index)=>{ 4702 const isLast = index === lines.length - 1 && result.jobs.length === 0; 4703 pushLocalMessage("bot", text, isLast ? { 4704 step: "jobhunting_ai", 4705 options: toJobhuntingChatOptions(result.exits) 4706 } : { 4707 step: "jobhunting_ai" 4708 }); 4709 }); 4710 if (result.jobs.length > 0) { 4711 // æ¨è¦æã¯æ±äººãªã³ã¯ã®ç´åã«ç½®ããçç±ã®ç¡ãæ±äººä¸è¦§ã¯æ¼ãããªã 4712 // ï¼å°±æ´»ç®¡çã®ããããæ ã¯ 26 é±ã§ 502 impression / 1 clickï¼ã 4713 const detail = result.jobs.map((job)=>{ 4714 const heading = [ 4715 job.companyName, 4716 job.title 4717 ].filter(Boolean).join(" / "); 4718 const reason = job.matchDetail || job.matchReason; 4719 return reason ? `${heading}\n${reason}` : heading; 4720 }).join("\n\n"); 4721 pushLocalMessage("bot", detail, { 4722 step: "jobhunting_ai", 4723 options: toJobOptions(result.jobs) 4724 }); 4725 pushLocalMessage("bot", "æ°ã«ãªããã®ãããã°éãã¦ã¿ã¦ãã ããã", { 4726 step: "jobhunting_ai", 4727 options: toJobhuntingChatOptions(result.exits) 4728 }); 4729 } 4730 }, [ 4731 pushLocalMessage 4732 ]); 4733 const handleJobhuntingAsk = (0,react.useCallback)(async (question)=>{ 4734 const trimmed = question.trim(); 4735 if (!trimmed) return; 4736 pushLocalMessage("user", trimmed); 4737 setJobhuntingInput(""); 4738 setIsLoading(true); 4739 lastJobhuntingQuestionRef.current = trimmed; 4740 const requestVersion = jobhuntingRequestVersionRef.current + 1; 4741 jobhuntingRequestVersionRef.current = requestVersion; 4742 try { 4743 const result = await askJobhuntingAi({ 4744 question: trimmed, 4745 history: jobhuntingHistoryRef.current 4746 }); 4747 // ããç´ãå¾ã«åã®åçãå±ãã¦ãæ··ããªãã 4748 if (requestVersion !== jobhuntingRequestVersionRef.current) return; 4749 if (result.status === "ok") { 4750 const { answer } = result; 4751 pushJobhuntingOutcome({ 4752 paragraphs: answer.answer.split("\n\n"), 4753 jobs: answer.jobs, 4754 exits: answer.exits, 4755 allowInput: true, 4756 contextDegraded: answer.contextDegraded 4757 }); 4758 jobhuntingHistoryRef.current = [ 4759 ...jobhuntingHistoryRef.current, 4760 { 4761 role: "user", 4762 content: trimmed 4763 }, 4764 ...answer.answer ? [ 4765 { 4766 role: "assistant", 4767 content: answer.answer 4768 } 4769 ] : [] 4770 ].slice(-MAILBOX_CHAT_MAX_HISTORY_MESSAGES); 4771 return; 4772 } 4773 // 失æã§ãæ¼ããåºå£ã 2 ã¤ä»¥ä¸æ®ãããããä¸åº¦èããã ããåºãã¨ã 4774 // åã失æãç¹°ãè¿ãããå°ç·ããæ®ããªãã 4775 const exits = resolveJobhuntingAiExits({ 4776 hasAnswer: false, 4777 hasJobs: false 4778 }); 4779 if (result.status === "rate_limited") { 4780 pushJobhuntingOutcome({ 4781 paragraphs: [ 4782 `ç¶ãã¦ã®ãå©ç¨ã¯${result.retryAfterSec}ç§ã»ã©ãå¾ ã¡ãã ããã` 4783 ], 4784 jobs: [], 4785 exits, 4786 allowInput: true 4787 }); 4788 return; 4789 } 4790 if (result.status === "unauthorized") { 4791 pushJobhuntingOutcome({ 4792 paragraphs: [ 4793 "ãã°ã¤ã³ã®æå¹æéãåãã¦ããããã§ãããã°ã¤ã³ãç´ãã¦ãããããä¸åº¦ã試ããã ããã" 4794 ], 4795 jobs: [], 4796 exits, 4797 allowInput: false 4798 }); 4799 return; 4800 } 4801 if (result.status === "disabled") { 4802 // ãã©ã° OFFãæ©è½ãç¡ããã¨ããæ éã®ããã«è¦ããªãã 4803 pushJobhuntingOutcome({ 4804 paragraphs: [ 4805 "ãã®æ©è½ã¯ãã ãã¾æºåä¸ã§ããæ±äººã¯ä¸è¦§ããã覧ããã ãã¾ãã" 4806 ], 4807 jobs: [], 4808 exits, 4809 allowInput: false 4810 }); 4811 return; 4812 } 4813 pushJobhuntingOutcome({ 4814 paragraphs: [ 4815 "ãã¾ããçãã§ãã¾ããã§ãããæéãããã¦ããä¸åº¦ã試ããã ããã" 4816 ], 4817 jobs: [], 4818 exits, 4819 allowInput: true 4820 }); 4821 } finally{ 4822 if (requestVersion === jobhuntingRequestVersionRef.current) { 4823 setIsLoading(false); 4824 } 4825 } 4826 }, [ 4827 pushJobhuntingOutcome, 4828 pushLocalMessage 4829 ]); 4830 /** 4831 * 就活ç¸è«ã¢ã¼ããéãã 4832 * 4833 * `seedQuestion` ãããã°ãã®ã¾ã¾ 1 åç®ã¨ãã¦æããã空æ¬ããå§ããã¨ã 4834 * ä½ãèããã®ãåãããªãã¾ã¾éãããããå¼ã³åºãå´ï¼å°±æ´»ç®¡çï¼ã 4835 * ãã®å¦çã®ç¶æ³ã«åãåããæ¸¡ãã 4836 */ const enterJobhuntingAiMode = (0,react.useCallback)((seedQuestion)=>{ 4837 handleRestart(); 4838 openChat(); 4839 setUserType("student"); 4840 setStep("jobhunting_ai"); 4841 setMessages([ 4842 createBotMessage(JOBHUNTING_AI_INTRO_MESSAGE, { 4843 step: "jobhunting_ai" 4844 }) 4845 ]); 4846 // ã»ãã·ã§ã³ã¯ããµãã¼ãã«åãåãããããæ¼ããããã«ããããã ãã«ä½ãã 4847 // `getDeviceInfo()` ãæ¸¡ããªãï¼url ã«ä¼æ¥åãè¼ãå¾ããTASK-2083 ã¨åãçç±ï¼ã 4848 // éãã¦ããéããã»ããç´ãã»å¥ã¢ã¼ãã¸ç§»ãã¨ã`handleRestart` ãæ¶ãã 4849 // å¾ã«å¤ãå¿çãã»ãã·ã§ã³ã復活ããã以éã®åãåãããç»é¢ä¸ã®ä¼è©±ã¨ã¯
4850 // å¥ã®ãµãã¼ãã»ãã·ã§ã³ã¸ä¿åããããAI å¿çã¨åãä¸ä»£çªå·ã§å¼¾ãã 4851 const sessionVersion = sessionRequestVersionRef.current; 4852 startSession("student").then(({ sessionId: sid, sessionToken: stoken })=>{ 4853 if (sessionVersion !== sessionRequestVersionRef.current) return; 4854 setSessionId(sid); 4855 setSessionToken(stoken); 4856 }).catch(()=>{ 4857 // ã»ãã·ã§ã³ãç¡ãã¦ã質åã¯ã§ããï¼å¿ è¦ãªã®ã¯åãåããå°ç·ã ãï¼ã 4858 }); 4859 if (seedQuestion?.trim()) { 4860 void handleJobhuntingAsk(seedQuestion); 4861 } 4862 }, [ 4863 handleRestart, 4864 handleJobhuntingAsk, 4865 openChat 4866 ]); 4867 /** 4868 * å¤é¨ï¼é¸è管çãããã®ãã¿ã³ï¼ããã¢ã¼ããã¨éãå ¥å£ã 4869 * 4870 * ã»ãã·ã§ã³ã¯ããµãã¼ãã«åãåãããããæ¼ããããã«ããããã ãã«ä½ãã 4871 * `getDeviceInfo()` ã**渡ããªã** â ãã® `url` 㯠`?company=æ ªå¼ä¼ç¤¾â¯â¯` ã 4872 * å«ã¿å¾ãããã伿¥åããµãã¼ãã®ã»ãã·ã§ã³è¡ã«è¼ã£ã¦ãã¾ãã 4873 */ const enterMailboxMode = (0,react.useCallback)(()=>{ 4874 handleRestart(); 4875 openChat(); 4876 setUserType("student"); 4877 setStep("mailbox_chat"); 4878 setMessages([ 4879 createBotMessage(MAILBOX_INTRO_MESSAGE, { 4880 step: "mailbox_chat" 4881 }) 4882 ]); 4883 startSession("student").then(({ sessionId: sid, sessionToken: stoken })=>{ 4884 setSessionId(sid); 4885 setSessionToken(stoken); 4886 }).catch(()=>{ 4887 // ã»ãã·ã§ã³ãç¡ãã¦ã質åã¯ã§ããï¼å¿ è¦ãªã®ã¯åãåããå°ç·ã ãï¼ã 4888 }); 4889 }, [ 4890 handleRestart, 4891 openChat 4892 ]); 4893 const enterFixConfirmationMode = (0,react.useCallback)((target)=>{ 4894 handleRestart(); 4895 setSessionId(target.sessionId ?? null); 4896 setSessionToken(null); 4897 setIsAuthenticated(true); 4898 setStep("escalated"); 4899 setMessages([ 4900 createBotMessage(CONFIRMATION_PREPARING_MESSAGE, { 4901 step: "escalated", 4902 startsNewTurn: true, 4903 options: [ 4904 { 4905 label: "éãã", 4906 value: "close" 4907 } 4908 ] 4909 }) 4910 ]); 4911 setPendingFixConfirmation({ 4912 sessionId: target.sessionId ?? null, 4913 sessionToken: null, 4914 reportId: target.reportId ?? null, 4915 isGuest: false 4916 }); 4917 setFixConfirmationPresented(false); 4918 openChat(); 4919 }, [ 4920 handleRestart, 4921 openChat 4922 ]); 4923 (0,react.useEffect)(()=>{ 4924 return (0,open_event/* subscribeSupportChatOpen */.iy)((detail)=>{ 4925 if (detail.mode === "mailbox") { 4926 enterMailboxMode(); 4927 return; 4928 } 4929 if (detail.mode === "jobhunting") { 4930 enterJobhuntingAiMode(detail.seedQuestion); 4931 return; 4932 } 4933 if (detail.mode === "fix_confirmation") { 4934 enterFixConfirmationMode(detail.fixReportId ? { 4935 reportId: detail.fixReportId 4936 } : { 4937 sessionId: detail.fixSessionId 4938 }); 4939 return; 4940 } 4941 handleRestart(); 4942 openChat(); 4943 }); 4944 }, [ 4945 enterFixConfirmationMode, 4946 enterMailboxMode, 4947 enterJobhuntingAiMode, 4948 handleRestart, 4949 openChat 4950 ]); 4951 // ã¨ã¹ã«ã¬ã¼ã·ã§ã³ç¢ºèª 4952 const handleEscalationConfirm = (0,react.useCallback)((value)=>{ 4953 if (value === "yes") { 4954 addUserMessage("ã¯ããåãåããã"); 4955 setStep("escalation_form"); 4956 addBotMessage("ã¡ã¼ã«ã¢ãã¬ã¹ã¨ãåãåããå 容ãå ¥åãã¦ãã ããã", { 4957 step: "escalation_form" 4958 }); 4959 } else { 4960 addUserMessage("ããããèªåã§è§£æ±ºãã¾ã"); 4961 setStep("resolved"); 4962 addBotMessage("ãããã¾ãã¾ãããä»ã«ãå°ãã®ãã¨ãããã°ããã¤ã§ããå©ç¨ãã ããã", { 4963 step: "resolved", 4964 options: [ 4965 ...RESOLVED_OPTIONS 4966 ] 4967 }); 4968 } 4969 }, [ 4970 addBotMessage, 4971 addUserMessage 4972 ]); 4973 // ã¨ã¹ã«ã¬ã¼ã·ã§ã³éä¿¡ 4974 /** 4975 * REQ-10: åæããå¦çã®ç´è¿æä½ã ããéããã**å ¥åå¤ã¯èªã¾ãªã** 4976 * ï¼`describeTarget` ãèå¥åããåããªãï¼ãåæãå¤ãããå³åº§ã«ãããã¡ãæ¨ã¦ãã 4977 */ (0,react.useEffect)(()=>{ 4978 if (!recentEventsConsent || !isAuthenticated) { 4979 recentEventsRef.current = []; 4980 return; 4981 } 4982 const record = (kind)=>(event)=>{ 4983 // `instanceof` ã§çµãï¼åã®æ¡ãæ½°ãã使ããªãï¼ãElement 㯠id / tagName / 4984 // getAttribute ãæã¤ã®ã§ `describeTarget` ã®å¼æ°åããã®ã¾ã¾æºããã 4985 if (!(event.target instanceof Element)) return; 4986 recentEventsRef.current = appendRecentEvent(recentEventsRef.current, { 4987 kind, 4988 target: describeTarget(event.target), 4989 at: Date.now() 4990 }); 4991 }; 4992 const onClick = record("click"); 4993 const onSubmit = record("submit"); 4994 window.addEventListener("click", onClick, true); 4995 window.addEventListener("submit", onSubmit, true); 4996 return ()=>{ 4997 window.removeEventListener("click", onClick, true); 4998 window.removeEventListener("submit", onSubmit, true); 4999 }; 5000 }, [ 5001 isAuthenticated, 5002 recentEventsConsent 5003 ]); 5004 /** åæä¸ã ã pathname ã®å¤åãè¨é²ãããquery / hash ã¨å¯å¤ ID ã¯ä¿åããªãã */ (0,react.useEffect)(()=>{ 5005 if (!recentEventsConsent || !isAuthenticated) return; 5006 const target = describeNavigationTarget(pathname); 5007 const previous = recentEventsRef.current.at(-1);
5008 if (previous?.kind === "navigation" && previous.target === target) return; 5009 recentEventsRef.current = appendRecentEvent(recentEventsRef.current, { 5010 kind: "navigation", 5011 target, 5012 at: Date.now() 5013 }); 5014 }, [ 5015 isAuthenticated, 5016 pathname, 5017 recentEventsConsent 5018 ]); 5019 /** 5020 * `showUnresolved`ï¼REQ-09ï¼ã¯ãã® 2 ã¤ããåã«å®£è¨ããã¦ããã®ã§ãref çµç±ã§å¼ã¶ã 5021 * 颿°ã®ä¸¦ã³é 㯠`mailbox-chat-privacy` ã®å¥ç´ãç¯å²ã§æ¤æ»ãã¦ããããåãããªãã 5022 */ (0,react.useEffect)(()=>{ 5023 enterMailboxModeRef.current = enterMailboxMode; 5024 enterJobhuntingAiModeRef.current = enterJobhuntingAiMode; 5025 }, [ 5026 enterJobhuntingAiMode, 5027 enterMailboxMode 5028 ]); 5029 const handleEscalationSubmit = (0,react.useCallback)(async ()=>{ 5030 if (!sessionId || !escalationReason.trim()) return; 5031 addUserMessage(`ã¡ã¼ã«: ${escalationEmail || "æªå ¥å"}\nå 容: ${escalationReason}`); 5032 setIsLoading(true); 5033 try { 5034 const result = await escalate(sessionId, escalationReason, escalationEmail || undefined, sessionToken); 5035 setStep("escalated"); 5036 // TASK-2078: éä¿¡çµæãè¦ã¦ããæé¢ãé¸ã¶ãæ§å®è£ ã¯çµæãå¾ ããã«å¸¸ã« 5037 // ããµãã¼ãæ å½ããã¡ã¼ã«ã§ãé£çµ¡ãããã¾ãããåºãã¦ããããéç¥ã¯ 5038 // 1 éãå±ãã¦ããªãã£ããæ¥ãªãé£çµ¡ãå¾ ãããªãã 5039 addBotMessage(result?.delivery === "sent" ? ESCALATION_COMPLETE_MESSAGE : ESCALATION_COMPLETE_DEGRADED_MESSAGE, { 5040 step: "escalated", 5041 options: [ 5042 { 5043 label: "éãã", 5044 value: "close" 5045 } 5046 ] 5047 }); 5048 } catch { 5049 // å ¥åæ¬ã¯ finally ã§ç©ºã«ããã®ã§ãæ¼ããåºå£ãå¿ ãæ·»ããã 5050 addBotMessage("éä¿¡ä¸ã«ã¨ã©ã¼ãçºçãã¾ããã", { 5051 options: [ 5052 ...buildErrorOptions(Boolean(sessionId)) 5053 ] 5054 }); 5055 } finally{ 5056 setIsLoading(false); 5057 setEscalationEmail(""); 5058 setEscalationReason(""); 5059 } 5060 }, [ 5061 sessionId, 5062 sessionToken, 5063 escalationEmail, 5064 escalationReason, 5065 addBotMessage, 5066 addUserMessage 5067 ]); 5068 /** 5069 * ä¿®æ£å 容ã®ç¢ºèªï¼SPEC-XNB12ATSR4 REQ-09 / REQ-10ï¼ã 5070 * 5071 * **æ¿èªãæ±ããªãã** è¨ãã®ã¯ãå°ã£ã¦ããäºè±¡ã®çè§£ãåã£ã¦ããããã ãã§ã 5072 * ãã¼ã¸ã®å¯å¦ã§ã¯ãªãï¼ãã¼ã¸ã¯å¸¸ã«äººéï¼ããã¬ãã¥ã¼ãæªå®ãªãæºåä¸ãåºãã 5073 * 空ã®ç¢ºèª UI ãåºããªãã 5074 */ const showFixConfirmation = (0,react.useCallback)(async (target, requestVersion)=>{ 5075 try { 5076 const result = await getFixConfirmation(target); 5077 if (requestVersion !== fixConfirmationRequestVersionRef.current) return; 5078 fixConfirmationFailureRef.current = 0; 5079 if (result.state === "none" || result.state === "settled") { 5080 setPendingFixConfirmation(null); 5081 fixConfirmationRequestVersionRef.current += 1; 5082 addBotMessage("ãã®å ±åã«ã¤ãã¦ãç¾å¨ç¢ºèªãã¦ããã ãä¿®æ£æ¡ã¯ããã¾ããã", { 5083 step: "escalated", 5084 startsNewTurn: true, 5085 options: [ 5086 { 5087 label: "éãã", 5088 value: "close" 5089 } 5090 ] 5091 }); 5092 return; 5093 } 5094 if (result.state !== "ready" || !result.confirmation) return; 5095 const { confirmation } = result; 5096 const preview = buildConfirmationPreviewDisplay(confirmation.previewKind, confirmation.previewPayload); 5097 setStep("fix_confirmation"); 5098 setFixConfirmationPresented(true); 5099 addBotMessage(confirmation.previewKind === "unavailable" ? `${CONFIRMATION_UNAVAILABLE_MESSAGE}\n\n${confirmation.question}` : confirmation.question, { 5100 step: "fix_confirmation", 5101 startsNewTurn: true, 5102 previewText: preview.text ?? undefined, 5103 previewImages: preview.images, 5104 options: CONFIRMATION_OPTIONS.map((option)=>({ 5105 label: option.label, 5106 value: option.value 5107 })) 5108 }); 5109 } catch { 5110 if (requestVersion !== fixConfirmationRequestVersionRef.current) return; 5111 // 䏿éå®³ã¯æ²é»ã㦠5 ç§å¾ã® poll ãæ¾ãããã ã**æä¹ ã¨ã©ã¼ãé»ã£ã¦å試
5111è¡ã 5112 // ç¶ããªã** ââ èªè¨¼æéåããªã©ã§ 403/404 ãåºå®ããã¨ãç»é¢ã«ã¯ 5113 // ãæºåãã§ããããç¥ãããã¾ããã ããæ®ãã復æ§ã®ææããã 1 ã¤ãç¡ãã 5114 fixConfirmationFailureRef.current += 1; 5115 if (fixConfirmationFailureRef.current < CONFIRMATION_POLL_FAILURE_LIMIT) return; 5116 setPendingFixConfirmation(null); 5117 fixConfirmationRequestVersionRef.current += 1; 5118 fixConfirmationFailureRef.current = 0; 5119 addBotMessage(CONFIRMATION_POLL_FAILED_MESSAGE, { 5120 step: "escalated", 5121 startsNewTurn: true, 5122 options: [ 5123 { 5124 label: "éãã", 5125 value: "close" 5126 } 5127 ] 5128 }); 5129 } 5130 }, [ 5131 addBotMessage 5132 ]); 5133 /** å¨å¸ä¸ã ãç¢ºèªæºåã追ããã¿ããé表示ã®éã¯éä¿¡ãããæ»ã£ãæã«åéããã */ (0,react.useEffect)(()=>{ 5134 if (!isOpen || !pendingFixConfirmation || fixConfirmationPresented) return; 5135 let cancelled = false; 5136 let timer = null; 5137 const poll = async ()=>{ 5138 if (cancelled) return; 5139 if (typeof document === "undefined" || document.visibilityState !== "hidden") { 5140 await showFixConfirmation(pendingFixConfirmation, fixConfirmationRequestVersionRef.current); 5141 } 5142 if (!cancelled) timer = setTimeout(()=>void poll(), 5000); 5143 }; 5144 void poll(); 5145 return ()=>{ 5146 cancelled = true; 5147 if (timer) clearTimeout(timer); 5148 }; 5149 }, [ 5150 fixConfirmationPresented, 5151 isOpen, 5152 pendingFixConfirmation, 5153 showFixConfirmation 5154 ]); 5155 /** ãã¼ã¸èªä½ãé¢ããæªãã°ã¤ã³å ±åè ãã確èªå¾ ã¡ã«æ®ããªãã */ (0,react.useEffect)(()=>{ 5156 if (!pendingFixConfirmation?.isGuest || !pendingFixConfirmation.sessionId) return; 5157 const sessionId = pendingFixConfirmation.sessionId; 5158 const skipOnPageHide = ()=>{ 5159 void skipFixConfirmation({ 5160 sessionId, 5161 sessionToken: pendingFixConfirmation.sessionToken, 5162 keepalive: true 5163 }); 5164 }; 5165 window.addEventListener("pagehide", skipOnPageHide); 5166 return ()=>window.removeEventListener("pagehide", skipOnPageHide); 5167 }, [ 5168 pendingFixConfirmation 5169 ]); 5170 /** ãã°ã¤ã³éç¥ã® URL ãããauth user + report ID ã®æææ¨©æ¤æ»ãéã£ã¦ç¢ºèªã¸æ»ãã */ (0,react.useEffect)(()=>{ 5171 if (false) {} 5172 const url = new URL(window.location.href); 5173 const targetReportId = url.searchParams.get("support_fix_report"); 5174 if (!targetReportId || !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(targetReportId)) { 5175 return; 5176 } 5177 url.searchParams.delete("support_fix_report"); 5178 window.history.replaceState(window.history.state, "", `${url.pathname}${url.search}${url.hash}`); 5179 enterFixConfirmationMode({ 5180 reportId: targetReportId 5181 }); 5182 }, [ 5183 enterFixConfirmationMode 5184 ]); 5185 const handleFixConfirmation = (0,react.useCallback)(async (value)=>{ 5186 const target = pendingFixConfirmation; 5187 if (!target || fixConfirmationSubmittingRef.current) return; 5188 fixConfirmationSubmittingRef.current = true; 5189 fixConfirmationRequestVersionRef.current += 1; 5190 const confirmed = value === "support_fix_confirm_yes"; 5191 setIsLoading(true); 5192 try { 5193 await confirmFix({ 5194 sessionId: target.sessionId, 5195 sessionToken: target.sessionToken, 5196 reportId: target.reportId, 5197 confirmed 5198 }); 5199 setPendingFixConfirmation(null); 5200 addUserMessage(confirmed ? "åã£ã¦ãã¾ã" : "éãã¾ã"); 5201 setFixConfirmationPresented(false); 5202 setStep("resolved"); 5203 addBotMessage(confirmed ? "ãããã¨ããããã¾ããããã ããå 容ããã¨ã«æ¤è¨ãã¾ãã" : "ãããã¨ããããã¾ããèªèãéã£ã¦ãããããªã®ã§ãããããã¦ç¢ºèªãã¾ãã", { 5204 step: "resolved", 5205 options: [ 5206 ...RESOLVED_OPTIONS 5207 ] 5208 }); 5209 } catch { 5210 addBotMessage("確èªçµæãè¨é²ã§ãã¾ããã§ãããéä¿¡ã確èªãã¦ãããä¸åº¦ã試ããã ããã", { 5211 step: "fix_confirmation", 5212 startsNewTurn: true 5213 }); 5214 } finally{ 5215 fixConfirmationSubmittingRef.current = false;
5216 setIsLoading(false); 5217 } 5218 }, [ 5219 addBotMessage, 5220 addUserMessage, 5221 pendingFixConfirmation 5222 ]); 5223 /** 5224 * ãã°å ±åã®éä¿¡ï¼REQ-11ï¼ã 5225 * 5226 * **åä»è¨é²ãåããã¨ãã ãåä» ID ãåºãã** åä»ã§ããªãã£ãã¨ãã« 5227 * ãåãä»ãã¾ãããã¨è¨ããªãï¼fail-closedï¼ããå±ãããã¨ãæå®ããªã ââ 5228 * åä»ã¨æ å½è ã®å¯¾å¿ã¯å¥ã ããã 5229 */ const handleBugReportSubmit = (0,react.useCallback)(async ()=>{ 5230 if (!sessionId || !bugWhatHappened.trim()) return; 5231 setBugSubmitError(null); 5232 setIsLoading(true); 5233 try { 5234 const meta = selectedCategoryId ? categoryMetaRef.current.get(selectedCategoryId) : undefined; 5235 const result = await submitBugReport({ 5236 sessionId, 5237 sessionToken, 5238 report: { 5239 rawUrl: openedAtUrlRef.current, 5240 device: { 5241 type: (0,tree/* resolveDeviceType */.p_)(getViewportWidth()), 5242 os: typeof navigator === "undefined" ? "unknown" : navigator.platform, 5243 browser: typeof navigator === "undefined" ? "unknown" : navigator.userAgent, 5244 viewport: `${getViewportWidth() ?? "unknown"}`, 5245 orientation: typeof screen === "undefined" ? "unknown" : screen.orientation?.type ?? "unknown" 5246 }, 5247 whatHappened: bugWhatHappened, 5248 errorText: bugErrorText, 5249 frequency: bugFrequency, 5250 impact: bugImpact, 5251 userEmail: isAuthenticated ? undefined : bugEmail, 5252 screenName: meta?.label ?? null, 5253 // risk / area / slug ã¯ãµã¼ããã«ãã´ãªè¡¨ããå¼ãç´ããid ã ãæ¸¡ãã 5254 categoryId: selectedCategoryId, 5255 thirdTierChoice, 5256 faqTrace: faqTraceRef.current, 5257 screenshots: bugScreenshots.map((file)=>({ 5258 contentType: file.contentType, 5259 base64: file.base64 5260 })), 5261 recentEvents: buildRecentEventsPayload({ 5262 consented: recentEventsConsent, 5263 isAuthenticated, 5264 buffer: recentEventsRef.current, 5265 nowMs: Date.now() 5266 }), 5267 recentEventsConsent 5268 } 5269 }); 5270 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_bug_report_submitted", { 5271 success: Boolean(result.reportId), 5272 device_type: (0,tree/* resolveDeviceType */.p_)(getViewportWidth()) 5273 }); 5274 void (0,analytics/* trackAnalyticsEvent */.KG)("support_report_recent_events_consent", { 5275 consented: recentEventsConsent 5276 }); 5277 if (result.reportId) { 5278 addUserMessage(bugWhatHappened); 5279 setStep("escalated"); 5280 addBotMessage(`${BUG_REPORT_RECEIVED_MESSAGE}\nåä» ID: ${result.reportId}`, { 5281 step: "escalated", 5282 options: [ 5283 ...RESOLVED_OPTIONS 5284 ] 5285 }); 5286 // èªåä¿®æ£ã®å¯¾è±¡å¤ï¼red ã«ãã´ãªï¼ã§ãæºåä¸ãã¨æ¡å ããã¨ã`get_fix_confirmation` 5287 // ãå³ settled ãè¿ãããæ°ç§å¾ã«ãä¿®æ£æ¡ã¯ããã¾ããããå¿ ãç¶ããç¸åãã 2 éã並ã¶ã 5288 // 対象ãã©ããã¯ãµã¼ããã«ãã´ãªè¡¨ããå¼ãç´ãã risk ã§æ±ºã¾ãã®ã§ããã®å¤å®ã使ãã 5289 if (result.autoFixEligible !== false) { 5290 addBotMessage(CONFIRMATION_PREPARING_MESSAGE, { 5291 step: "escalated", 5292 startsNewTurn: true, 5293 options: [ 5294 { 5295 label: "éãã", 5296 value: "close" 5297 } 5298 ] 5299 }); 5300 setPendingFixConfirmation({ 5301 sessionId, 5302 sessionToken, 5303 reportId: null, 5304 isGuest: !isAuthenticated 5305 }); 5306 setFixConfirmationPresented(false); 5307 } 5308 } else { 5309 setBugSubmitError(`${BUG_REPORT_UNAVAILABLE_MESSAGE} å ¥åå 容ã¯ä¿æããã¦ãã¾ãã`); 5310 } 5311 } catch {
5312 void (0,analytics/* trackAnalyticsEvent */.KG)("support_chat_bug_report_submitted", { 5313 success: false, 5314 device_type: (0,tree/* resolveDeviceType */.p_)(getViewportWidth()) 5315 }); 5316 setBugSubmitError(`${BUG_REPORT_UNAVAILABLE_MESSAGE} å ¥åå 容ã¯ä¿æããã¦ãã¾ãã`); 5317 } finally{ 5318 setIsLoading(false); 5319 } 5320 }, [ 5321 addBotMessage, 5322 addUserMessage, 5323 bugEmail, 5324 bugErrorText, 5325 bugFrequency, 5326 bugImpact, 5327 bugScreenshots, 5328 bugWhatHappened, 5329 isAuthenticated, 5330 recentEventsConsent, 5331 selectedCategoryId, 5332 sessionId, 5333 sessionToken, 5334 thirdTierChoice 5335 ]); 5336 // 鏿è¢ã¯ãªãã¯æã®ã«ã¼ãã£ã³ã° 5337 const handleOptionClick = (0,react.useCallback)((value, label, msgStep)=>{ 5338 if (value === "restart") { 5339 handleRestart(); 5340 return; 5341 } 5342 if (value === "close") { 5343 trackAbandon(); 5344 setIsOpen(false); 5345 handleRestart(); 5346 return; 5347 } 5348 // ããµãã¼ãã«åãåãããããã«ãã´ãªããæ¢ãç´ããã¯ã©ã®ã¹ãããããã§ãæ¼ããã 5349 // è¡ãæ¢ã¾ããä½ããªãããã®åºå£ãªã®ã§ãmsgStep ã®ã¹ã¤ããããåã§å¦çããã 5350 if (value === "escalate") { 5351 addUserMessage("ãµãã¼ãã«åãåããã"); 5352 if (!sessionId) { 5353 // ã»ãã·ã§ã³ãç¡ãã¨åä»å ãç¡ããé»ã£ã¦ç¡åå¿ã«ããããç´ãã¸æ»ãã 5354 handleRestart(); 5355 return; 5356 } 5357 setStep("escalation_confirm"); 5358 addBotMessage(ESCALATION_CONFIRM_MESSAGE, { 5359 step: "escalation_confirm", 5360 options: [ 5361 ...ESCALATION_CONFIRM_OPTIONS 5362 ] 5363 }); 5364 return; 5365 } 5366 if (value === "back_to_categories") { 5367 addUserMessage("ã«ãã´ãªããæ¢ãç´ã"); 5368 handleBackToCategories(); 5369 return; 5370 } 5371 // 就活ã¡ã¼ã« AI ã®ãããä¸åº¦è©¦ãããç´åã®è³ªåãæãç´ã 5372 // ï¼è¦ãã¦ããã ãã®é£¾ãã«ããªãï¼ã 5373 if (value === "mailbox_retry") { 5374 const lastQuestion = lastMailboxQuestionRef.current; 5375 if (!lastQuestion) { 5376 setMailboxAllowInput(true); 5377 pushLocalMessage("bot", "ããä¸åº¦ãèããããã¨ãå ¥åãã¦ãã ããã", { 5378 step: "mailbox_chat" 5379 }); 5380 return; 5381 } 5382 handleMailboxAsk(lastQuestion); 5383 return; 5384 } 5385 // 就活ç¸è« AI ã®åºå£ãé·ç§»ãããã®ï¼æ±äººä¸è¦§ã»å°±æ´»ã¡ã¼ã«ï¼ã¯ 5386 // href ãæã¤ã¢ã³ã«ã¼ã¨ãã¦æãããã®ã§ãããã«ã¯æ¥ãªãã 5387 if (value === "jobhunting_ai_retry") { 5388 const lastQuestion = lastJobhuntingQuestionRef.current; 5389 if (!lastQuestion) { 5390 setJobhuntingAllowInput(true); 5391 pushLocalMessage("bot", "ããä¸åº¦ãèããããã¨ãå ¥åãã¦ãã ããã", { 5392 step: "jobhunting_ai" 5393 }); 5394 return; 5395 } 5396 void handleJobhuntingAsk(lastQuestion); 5397 return; 5398 } 5399 if (value === "jobhunting_ai_close") { 5400 trackAbandon(); 5401 setIsOpen(false); 5402 handleRestart(); 5403 return; 5404 } 5405 if (value === "jobhunting_ai_view_suggested") { 5406 // ææ¡ã¯ç´åã®ã¡ãã»ã¼ã¸ã«ãªã³ã¯ã¨ãã¦ä¸¦ãã§ãããæ¼ãã¦ãä½ãèµ·ããªã 5407 // 鏿è¢ã«ããªãããããã®å ´æãè¨èã§æãã 5408 pushLocalMessage("bot", "ä¸ã«ä¸¦ãã æ±äººããéãã¾ãã", { 5409 step: "jobhunting_ai" 5410 }); 5411 return; 5412 } 5413 switch(msgStep){ 5414 case "select_user_type": 5415 handleSelectUserType(value); 5416 break; 5417 case "select_category": 5418 handleSelectCategory(value, label); 5419 break; 5420 case "select_subcategory": 5421 handleSelectSubcategory(value, label); 5422 break; 5423 case "select_error_code": 5424 handleSelectErrorCode(value); 5425 break; 5426 case "fix_confirmation": 5427 handleFixConfirmation(value); 5428 break; 5429 case "show_faqs": 5430 handleSelectFaq(value, label); 5431 break; 5432 case "faq_detail": 5433 handleResolutionCheck(value); 5434 break; 5435 case "escalation_confirm": 5436 handleEscalationConfirm(value); 5437 break; 5438 case "resolved": 5439 case "escalated": 5440 if (value === "close") { 5441 trackAbandon(); 5442 setIsOpen(false); 5443 handleRestart(); 5444 } else if (value === "restart") { 5445 handleRestart(); 5446 } 5447 break; 5448 } 5449 }, [ 5450 addBotMessage, 5451 addUserMessage, 5452 handleBackToCategories, 5453 handleRestart, 5454 handleSelectUserType, 5455 handleSelectCategory, 5456 handleSelectSubcategory, 5457 handleSelectErrorCode, 5458 handleFixConfirmation, 5459 trackAbandon, 5460 handleSelectFaq, 5461 handleResolutionCheck, 5462 handleEscalationConfirm, 5463 handleMailboxAsk, 5464 handleJobhuntingAsk, 5465 pushLocalMessage, 5466 sessionId 5467 ]); 5468 return /*#__PURE__*/ (0,jsx_runtime.jsxs)(jsx_runtime.Fragment, { 5469 children: [ 5470 !isOpen && /*#__PURE__*/ (0,jsx_runtime.jsx)("button", { 5471 onClick: openChat, 5472 className: "fixed bottom-[calc(env(safe-area-inset-bottom)+max(1rem,var(--app-bottom-nav-height,0px)))] mb-[var(--app-bottom-action-bar-height,0px)] right-4 z-50 flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg transition-transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 md:bottom-6", 5473 "aria-label": "ãµãã¼ããã£ãããéã", 5474 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("svg", { 5475 xmlns: "http://www.w3.org/2000/svg", 5476 width: "24", 5477 height: "24",
5478 viewBox: "0 0 24 24", 5479 fill: "none", 5480 stroke: "currentColor", 5481 strokeWidth: "2", 5482 strokeLinecap: "round", 5483 strokeLinejoin: "round", 5484 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("path", { 5485 d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" 5486 }) 5487 }) 5488 }), 5489 isOpen && /*#__PURE__*/ (0,jsx_runtime.jsxs)(card/* Card */.Zp, { 5490 className: "fixed bottom-[calc(env(safe-area-inset-bottom)+5rem)] left-1/2 z-50 flex h-[600px] w-[380px] max-h-[calc(100vh-3rem)] max-w-[calc(100vw-2rem)] -translate-x-1/2 flex-col shadow-xl sm:bottom-6 sm:left-auto sm:h-[600px] sm:w-[420px] sm:translate-x-0 sm:right-6", 5491 children: [ 5492 /*#__PURE__*/ (0,jsx_runtime.jsxs)(card/* CardHeader */.aR, { 5493 className: "flex flex-row items-center justify-between border-b px-4 py-3", 5494 children: [ 5495 /*#__PURE__*/ (0,jsx_runtime.jsx)(card/* CardTitle */.ZB, { 5496 className: "text-base font-semibold", 5497 children: "ãµãã¼ããã£ãã" 5498 }), 5499 /*#__PURE__*/ (0,jsx_runtime.jsx)("button", { 5500 onClick: ()=>{ 5501 // éããã¨ãã«ä¼è©±ãæ¨ã¦ããæ§å®è£ 㯠`setIsOpen(false)` ã ãã§ 5502 // `messages` ãæ®ããããéãç´ãã¦ãåæã¡ãã»ã¼ã¸ãåæå ¥ããã 5503 // çµãã£ãä¼è©±ããã®ã¾ã¾å¾©å ããã¦ããï¼é¸æè¢ãæ¼ãã¦ã 5504 // ãã®æç¹ã® step ã¨åã¿åããªãï¼ã 5505 trackAbandon(); 5506 setIsOpen(false); 5507 handleRestart(); 5508 }, 5509 className: "rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-accent-foreground", 5510 "aria-label": "ãã£ãããéãã", 5511 children: /*#__PURE__*/ (0,jsx_runtime.jsxs)("svg", { 5512 xmlns: "http://www.w3.org/2000/svg", 5513 width: "18", 5514 height: "18",
5515 viewBox: "0 0 24 24", 5516 fill: "none", 5517 stroke: "currentColor", 5518 strokeWidth: "2", 5519 strokeLinecap: "round", 5520 strokeLinejoin: "round", 5521 children: [ 5522 /*#__PURE__*/ (0,jsx_runtime.jsx)("line", { 5523 x1: "18", 5524 y1: "6", 5525 x2: "6", 5526 y2: "18" 5527 }), 5528 /*#__PURE__*/ (0,jsx_runtime.jsx)("line", { 5529 x1: "6", 5530 y1: "6", 5531 x2: "18", 5532 y2: "18" 5533 }) 5534 ] 5535 }) 5536 }) 5537 ] 5538 }), 5539 /*#__PURE__*/ (0,jsx_runtime.jsxs)(card/* CardContent */.Wu, { 5540 className: "flex flex-1 flex-col overflow-hidden p-0", 5541 children: [ 5542 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5543 className: "relative flex min-h-0 flex-1 flex-col", 5544 children: [ 5545 /*#__PURE__*/ (0,jsx_runtime.jsx)(scroll_area/* ScrollArea */.F, { 5546 className: "flex-1 px-4 py-3", 5547 ref: scrollRef, 5548 children: /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5549 role: "log", 5550 "aria-label": "ããåã", 5551 "data-support-chat-list": "", 5552 children: [ 5553 messages.map((msg, index)=>/*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5554 "data-support-chat-message": msg.id, 5555 className: (0,utils.cn)("min-w-0", resolveMessageGapClass({ 5556 index, 5557 role: msg.role, 5558 previousRole: index > 0 ? messages[index - 1].role : null, 5559 startsNewTurn: msg.metadata?.startsNewTurn, 5560 previousHasOptions: index > 0 ? Boolean(messages[index - 1].metadata?.options?.length) : false 5561 })), 5562 children: [ 5563 index === 0 || messages[index - 1].role !== msg.role || msg.metadata?.startsNewTurn ? msg.role === "bot" ? /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 5564 className: "mb-1 text-[12px] font-bold text-muted-foreground", 5565 children: BOT_SENDER_LABEL 5566 }) : msg.role === "user" ? /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 5567 className: "sr-only", 5568 children: USER_SENDER_LABEL 5569 }) : null : null, 5570 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 5571 "data-support-chat-bubble": "", 5572 className: (0,utils.cn)("w-fit max-w-[88%] break-words rounded-[14px] px-3.5 py-2.5 text-[15px] leading-[1.75] whitespace-pre-wrap", msg.role === "user" ? "ml-auto rounded-br-[4px] bg-primary text-primary-foreground" : // ã»ã¼ç½ï¼#f5f5f5ï¼ãªã®ã§ãå¡ãã ãã§ã¯å¢ç®ãè¦ãã
5572ªãã 5573 "rounded-bl-[4px] border border-border bg-muted text-foreground"), 5574 children: msg.role === "bot" ? renderBotMessageContent(msg.content) : msg.content 5575 }), 5576 msg.metadata?.previewText ? /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 5577 className: "mt-2 rounded-lg border border-border bg-background p-3 text-[13px] leading-relaxed whitespace-pre-wrap", 5578 children: msg.metadata.previewText 5579 }) : null, 5580 msg.metadata?.previewImages?.length ? /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 5581 className: "mt-2 grid gap-2", 5582 "aria-label": "ä¿®æ£æ¡ã®ç»é¢æ¯è¼", 5583 children: msg.metadata.previewImages.map((preview)=>// private storage ã®çå½ URL ãªã®ã§ç»åæé©åãµã¼ãã¸ä¸ç¶ããªãã 5584 // eslint-disable-next-line @next/next/no-img-element 5585 /*#__PURE__*/ (0,jsx_runtime.jsx)("img", { 5586 src: preview.src, 5587 alt: preview.alt, 5588 referrerPolicy: "no-referrer", 5589 className: "h-auto w-full rounded-lg border border-border" 5590 }, preview.src)) 5591 }) : null, 5592 msg.metadata?.options && /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 5593 className: "mt-2 flex flex-col gap-2", 5594 children: msg.metadata.options.map((opt)=>/* 5595 * é·ç§»ããåºå£ã¯æ¬ç©ã®ãªã³ã¯ã«ããï¼TASK-2083ï¼ã 5596 * `window.location` ã®ä»£å ¥ã ã¨ãæ¼ããçµæã©ãã¸è¡ãããã 5597 * å¤ãã確ããããããç¡åå¿ã§ãæ°ä»ããªãã 5598 */ opt.href ? /*#__PURE__*/ (0,jsx_runtime.jsx)("a", { 5599 href: opt.href, 5600 onClick: ()=>{ 5601 // æ±äººãªã³ã¯ã ãè¨é²ãããOPS-07 ã®ã¯ãªãã¯ææ¨ã§ã 5602 // ä¸ä½ã ããæ¼ãããã®ãä¸è¦§å ¨ä½ã使ãããã®ããè¦ãã 5603 if (!opt.jobId) return; 5604 trackJobhuntingAiJobClick({ 5605 jobId: opt.jobId, 5606 position: opt.position ?? 0, 5607 hasReason: opt.hasReason === true 5608 }); 5609 }, 5610 className: (0,utils.cn)((0,ui_button/* buttonVariants */.r)({ 5611 variant: "outline", 5612 size: "sm" 5613 }), "h-auto justify-start whitespace-normal break-words py-2.5 text-left text-[14px] leading-snug"), 5614 children: opt.label 5615 }, opt.value) : /*#__PURE__*/ (0,jsx_runtime.jsx)(ui_button/* Button */.$, { 5616 variant: "outline", 5617 size: "sm", 5618 /* 5619 * base ã® `whitespace-nowrap` 㨠size=sm ã® `h-9` ãæã¡æ¶ãã
5620 * FAQ ã®è³ªåæã¯ 1 è¡ã«åã¾ããªãã®ã§ãæãè¿ãã¦é«ãã伸ã°ãã 5621 */ className: "h-auto justify-start whitespace-normal break-words py-2.5 text-left text-[14px] leading-snug", 5622 disabled: isLoading, 5623 onClick: ()=>handleOptionClick(opt.value, opt.label, msg.metadata?.step), 5624 children: opt.label 5625 }, opt.value)) 5626 }) 5627 ] 5628 }, msg.id)), 5629 isLoading && // ç¹ã 3 ã¤è·³ããã ãã§ã¯ãèªã¿ä¸ãã§ã¯ä½ãèµ·ãã¦ããªãã®ã¨åãã 5630 // è¿ä¿¡ãä½ã£ã¦ãããã¨ãæåã§æã¤ï¼æ°ããã¹ã¯ãã¼ã«ã®é£ã³å ã 5631 // èªã¿ä¸ãã«ã¯è¦ããªãã®ã§ããããå¯ä¸ã®åå³ã«ãªãï¼ã 5632 // 5633 // æåã¯**ä¸èº«**ã¨ãã¦ç½®ãããã®é åã®èªã¿ä¸ãã¯æ¿å ¥ãããä¸èº«ãã 5634 // ä½ãããã®ã§ãååã ãã屿§ã§ä¸ãã¦ãä½ãèªã¾ããªãï¼ç¹ 3 ã¤ã¯ 5635 // 飾ãã§ãæåã 1 ã¤ãæããªãï¼ãååã¨ä¸èº«ã®ä¸¡æ¹ã«åãæãç½®ã㨠5636 // ä»åº¦ã¯ 2 åèªã¾ããã®ã§ã屿§ã®å´ã¯æãããªãã 5637 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5638 role: "status", 5639 // ä¸è¦§ã®éé㯠1 ä»¶ãã¤æã¤å½¢ã«ããã®ã§ãããã«ãèªåã§ä½ç½ãç½®ã 5640 // ï¼çééã®æå®ãå¤ããã¨ãããã®å¡ã ãæå¾ã®ããã«ã¸å¯çãã¦ããï¼ã 5641 className: "mt-5 flex items-center gap-1 text-muted-foreground", 5642 children: [ 5643 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 5644 className: "sr-only", 5645 children: "åçã使ãã¦ãã¾ã" 5646 }), 5647 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 5648 className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground [animation-delay:0ms]" 5649 }), 5650 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 5651 className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground [animation-delay:150ms]" 5652 }), 5653 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 5654 className: "h-2 w-2 animate-bounce rounded-full bg-muted-foreground [animation-delay:300ms]" 5655 }) 5656 ] 5657 }) 5658 ] 5659 }) 5660 }), 5661 showJumpToLatest ? /*#__PURE__*/ (0,jsx_runtime.jsxs)("button", { 5662 type: "button", 5663 onClick: jumpToLatest, 5664 className: "absolute bottom-3 right-4 z-10 inline-flex h-9 items-center gap-1 rounded-full border border-border bg-background px-3 text-[13px] font-bold text-foreground shadow-md hover:bg-muted", 5665 children: [ 5666 /*#__PURE__*/ (0,jsx_runtime.jsx)(chevron_down/* default */.A, { 5667 className: "h-4 w-4", 5668 "aria-hidden": "true" 5669 }), 5670 "ææ°ã¸" 5671 ] 5672 }) : null 5673 ] 5674 }), 5675 step === "free_input" && /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5676 className: "border-t px-4 py-3", 5677 children: [ 5678 /*#__PURE__*/ (0,jsx_runtime.jsxs)("form", { 5679 onSubmit: (e)=>{ 5680 e.preventDefault(); 5681 handleFreeInput(); 5682 }, 5683 className: "flex gap-2", 5684 children: [ 5685 /*#__PURE__*/ (0,jsx_runtime.jsx)(input/* Input */.p, { 5686 value: freeInputText, 5687 onChange: (e)=>setFreeInputText(e.target.value), 5688 placeholder: "ãã¼ã¯ã¼ããå ¥å...", 5689 disabled: isLoading, 5690 // iOS Safari 㯠16px æªæºã®å ¥åæ¬ã«ãã©ã¼ã«ã¹ãã㨠5691 // ãã¼ã¸å ¨ä½ãèªåã§ãºã¼ã ãããå¦çã®ä¸»ç«¯æ«ã§ç»é¢ãæ¡å¤§ãããã 5692 className: "flex-1 text-base" 5693 }), 5694 /*#__PURE__*/ (0,jsx_runtime.jsx)(ui_button/* Button */.$, { 5695 type: "submit", 5696 size: "sm", 5697 disabled: isLoading || !freeInputText.trim(), 5698 children: "æ¤ç´¢" 5699 }) 5700 ] 5701 }), 5702 /*#__PURE__*/ (0,jsx_runtime.jsxs)("p", { 5703 className: "mt-1 text-xs text-muted-foreground", 5704 children: [ 5705 "æ®ãæ¤ç´¢åæ°: ", 5706 remainingFreeInputSearches(freeInputCount) 5707 ] 5708 }) 5709 ] 5710 }), 5711 step === "mailbox_chat" && mailboxAllowInput && /*#__PURE__*/ (0,jsx_runtime.jsx)(MailboxChatPanel, { 5712 value: mailboxInput, 5713 onChange: setMailboxInput, 5714 onSubmit: ()=>handleMailboxAsk(mailboxInput), 5715 disabled: isLoading, 5716 scopeLabel: mailboxScopeLabel, 5717 turnCount: mailboxTurnCount 5718 }), 5719 step === "jobhunting_ai" && jobhuntingAllowInput && /*#__PURE__*/ (0,jsx_runtime.jsx)(MailboxChatPanel, {
5720 value: jobhuntingInput, 5721 onChange: setJobhuntingInput, 5722 onSubmit: ()=>void handleJobhuntingAsk(jobhuntingInput), 5723 disabled: isLoading, 5724 scopeLabel: null, 5725 turnCount: 0, 5726 placeholder: JOBHUNTING_AI_INPUT_PLACEHOLDER, 5727 ariaLabel: "就活ã®é²ãæ¹ã«ã¤ãã¦ã®è³ªå", 5728 showRemainingTurns: false 5729 }), 5730 step === "bug_report_form" && // 親㯠`overflow-hidden` ã® flex åã§ãã«ã¼ã㯠`max-h-[calc(100vh-3rem)]`ã 5731 // èªåã§ã¹ã¯ãã¼ã«é åãæããªãã¨ã縦ã®çã端æ«ï¼æ¨ªåãã®é»è©±ãªã©ï¼ã§ 5732 // æ«å°¾ã®ãå ±åããããåãã¦æ¼ããªããªããDOM ã«ã¯å¨ãã®ã§ 5733 // ãè¡ãæ¢ã¾ããä½ããªããç³»ã®å¥ç´ã§ã¯æ°ä»ããªãã 5734 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5735 className: "border-t px-4 py-3 space-y-2 max-h-[60vh] overflow-y-auto", 5736 children: [ 5737 /*#__PURE__*/ (0,jsx_runtime.jsx)("textarea", { 5738 value: bugWhatHappened, 5739 onChange: (e)=>{ 5740 setBugWhatHappened(e.target.value); 5741 setBugSubmitError(null); 5742 }, 5743 placeholder: "ä½ãèµ·ãã¾ãããï¼ï¼å¿ é ï¼", 5744 disabled: isLoading, 5745 rows: 3, 5746 className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm r
5746ing-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 resize-none" 5747 }), 5748 /*#__PURE__*/ (0,jsx_runtime.jsx)(input/* Input */.p, { 5749 value: bugErrorText, 5750 onChange: (e)=>{ 5751 setBugErrorText(e.target.value); 5752 setBugSubmitError(null); 5753 }, 5754 placeholder: "表示ãããã¨ã©ã¼æè¨ï¼ä»»æï¼", 5755 disabled: isLoading, 5756 className: "text-sm" 5757 }), 5758 !isAuthenticated && /*#__PURE__*/ (0,jsx_runtime.jsx)(input/* Input */.p, { 5759 value: bugEmail, 5760 onChange: (e)=>{ 5761 setBugEmail(e.target.value); 5762 setBugSubmitError(null); 5763 }, 5764 placeholder: "ã¡ã¼ã«ã¢ãã¬ã¹ï¼å¿ é ï¼", 5765 type: "email", 5766 disabled: isLoading, 5767 className: "text-sm" 5768 }), 5769 /*#__PURE__*/ (0,jsx_runtime.jsxs)("label", { 5770 className: "block text-xs text-muted-foreground", 5771 children: [ 5772 "èµ·ããé »åº¦", 5773 /*#__PURE__*/ (0,jsx_runtime.jsx)("select", { 5774 value: bugFrequency, 5775 onChange: (e)=>setBugFrequency(e.target.value), 5776 disabled: isLoading, 5777 className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground disabled:cursor-not-allowed disabled:opacity-50", 5778 children: FREQUENCY_VALUES.map((value)=>/*#__PURE__*/ (0,jsx_runtime.jsx)("option", { 5779 value: value, 5780 children: FREQUENCY_LABELS[value] 5781 }, value)) 5782 }) 5783 ] 5784 }), 5785 /*#__PURE__*/ (0,jsx_runtime.jsxs)("label", { 5786 className: "block text-xs text-muted-foreground", 5787 children: [ 5788 "å½±é¿", 5789 /*#__PURE__*/ (0,jsx_runtime.jsx)("select", { 5790 value: bugImpact, 5791 onChange: (e)=>setBugImpact(e.target.value), 5792 disabled: isLoading, 5793 className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground disabled:cursor-not-allowed disabled:opacity-50", 5794 children: IMPACT_VALUES.map((value)=>/*#__PURE__*/ (0,jsx_runtime.jsx)("option", { 5795 value: value, 5796 children: IMPACT_LABELS[value] 5797 }, value)) 5798 }) 5799 ] 5800 }), 5801 /*#__PURE__*/ (0,jsx_runtime.jsx)("p", { 5802 className: "text-xs text-muted-foreground", 5803 children: BUG_REPORT_SCREENSHOT_PAUSED_NOTICE 5804 }), 5805 isAuthenticated && /*#__PURE__*/ (0,jsx_runtime.jsxs)("label", { 5806 className: "flex items-start gap-2 text-xs text-muted-foreground", 5807 children: [ 5808 /*#__PURE__*/ (0,jsx_runtime.jsx)("input", { 5809 type: "checkbox", 5810 checked: recentEventsConsent, 5811 onChange: (e)=>setRecentEventsConsent(e.target.checked), 5812 disabled: isLoading, 5813 className: "mt-0.5" 5814 }), 5815 /*#__PURE__*/ (0,jsx_runtime.jsx)("span", { 5816 children: RECENT_EVENTS_CONSENT_LABEL 5817 }) 5818 ] 5819 }), 5820 bugSubmitError && /*#__PURE__*/ (0,jsx_runtime.jsxs)("p", { 5821 role: "alert", 5822 className: "text-xs text-destructive", 5823 children: [ 5824 bugSubmitError, 5825 " éä¿¡ã確èªãã¦ãããä¸åº¦ãå ±åããããæ¼ãã¦ãã ããã" 5826 ] 5827 }), 5828 /*#__PURE__*/ (0,jsx_runtime.jsx)(ui_button/* Button */.$, { 5829 onClick: handleBugReportSubmit, 5830 size: "sm", 5831 disabled: isLoading || !bugWhatHappened.trim() || !isAuthenticated && !bugEmail.trim(), 5832 className: "w-full", 5833 children: "å ±åãã" 5834 }) 5835 ] 5836 }), 5837 step === "escalation_form" && // åä¸ããã¡ããéä
5837¿¡ãã¿ã³ãæ«å°¾ã«ããã 5838 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 5839 className: "border-t px-4 py-3 space-y-2 max-h-[60vh] overflow-y-auto", 5840 children: [ 5841 /*#__PURE__*/ (0,jsx_runtime.jsx)(input/* Input */.p, { 5842 value: escalationEmail, 5843 onChange: (e)=>setEscalationEmail(e.target.value), 5844 placeholder: "ã¡ã¼ã«ã¢ãã¬ã¹ï¼ä»»æï¼", 5845 type: "email", 5846 disabled: isLoading, 5847 className: "text-sm" 5848 }), 5849 /*#__PURE__*/ (0,jsx_runtime.jsx)("textarea", { 5850 value: escalationReason, 5851 onChange: (e)=>setEscalationReason(e.target.value), 5852 placeholder: "ãåãåããå 容ãå ¥åãã¦ãã ãã...", 5853 disabled: isLoading, 5854 rows: 3, 5855 className: "w-full rounded-md border border-input bg-background px-3 py-2 text-sm r
5855ing-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 resize-none" 5856 }), 5857 /*#__PURE__*/ (0,jsx_runtime.jsx)(ui_button/* Button */.$, { 5858 onClick: handleEscalationSubmit, 5859 size: "sm", 5860 disabled: isLoading || !escalationReason.trim(), 5861 className: "w-full", 5862 children: "éä¿¡ãã" 5863 }) 5864 ] 5865 }) 5866 ] 5867 }) 5868 ] 5869 }) 5870 ] 5871 }); 5872} 5873 5874;// ./lib/layout/student-chrome-hint.ts 5875/** 5876 * SPEC-TYDJVYT101: å¦çã®ã·ã§ã«ï¼å·¦ã®ãµã¤ããã¼ã¨ä¸ã®ãã¼ï¼ããèªè¨¼ã®ç¢ºå®ãå¾ ããã«åºãã 5877 * 5878 * å ±éã¯ãã¼ã ï¼`components/app-chrome.tsx`ï¼ã¯ãå¦çã®ã·ã§ã«ãåºããã©ããã 5879 * `useAuth()` ã® `ready` ã§æ±ºãã¦ããã`ready` ãç«ã¤ã®ã¯ããã©ã¦ã¶ã§ 5880 * `/api/auth/bootstrap` ãè¿ã£ã¦ãããã¨ï¼effect ã®ä¸ï¼ãªã®ã§ããµã¼ãæç»ã¨ 5881 * æåã®æç»ã¯**å¿ ã**å ¬éãããã¼ï¼ãã°ã¤ã³ / æ°è¦ç»é²ï¼ã«ãªãããã°ã¤ã³ãã¦ãã 5882 * å¦çã«ã¯ãèªã¿è¾¼ã¿ã®ãã³ã«å ¬éãããã¼ãåºã¦ãããµã¤ããã¼ã¸å ¥ãæ¿ãã£ã¦è¦ãã 5883 * ï¼heidayo ã®å ±å 2026-10-03ã»åç»ããï¼ãå ¥ãæ¿ããã¯å¥ã®æ¨ã¸ã®å·®ãæ¿ããªã®ã§ã 5884 * ãã¼ã¸ã®ä¸èº«ãããã§ä½ãç´ãããã 5885 * 5886 * ããã§ããã®ç«¯æ«ã§ååã¯å¦çã¨ãã¦å ¥ã£ã¦ããããã¨ã ãã cookie ã«æ®ãã 5887 * ã«ã¼ãã¬ã¤ã¢ã¦ãããããèªãã§ã確å®åã®æç»ãå¦çã®ã·ã§ã«ã«ããã 5888 * 確å®ãããã¨ã¯ä»ã¾ã§ã©ãã `useAuth()` ã®å¤ã決ããã 5889 * 5890 * **ããã¯è¡¨ç¤ºã®ç®å°ã§ãã£ã¦èªè¨¼ã§ã¯ãªãã** å¤ã¯å©ç¨è ãèªç±ã«æ¸ãæããããã®ã§ã 5891 * ç»é¢ã®åºãåãï¼ãµã¤ããã¼ãåºãããããã¿ãåºããï¼ä»¥å¤ã«ä½¿ããªãã 5892 * æ¸ãæãã¦ãã確å®åã®ä¸ç¬ã®è¦ãç®ãå¤ããã ãã§ãè¦ããããã®ã¯ 1 ã¤ãå¢ããªã 5893 * ï¼å¦çã®ã·ã§ã«ã¯å©ç¨è ã®æ å ±ãã確å®ããã¾ã§ 1 ã¤ãæããªãï¼ã 5894 * 5895 * ãã®ã¢ã¸ã¥ã¼ã«ã¯ React ã«ã Next ã«ãä¾åããªãï¼å¥ç´ãæç»ããã«ç´æ¥å©ãï¼ã 5896 */ /** ç®å°ã® cookie ã®ååãèªè¨¼ã® cookieï¼`sb-` ã§å§ã¾ãï¼ã¨æ··ãããªãååã«ããã */ const STUDENT_CHROME_HINT_COOKIE = "gkt_student_chrome"; 5897const HINT_VALUE = "1"; 5898/** å¦çã¨ãã¦ç¢ºå®ãããã³ã«æ¸ãç´ãã®ã§ã使ã£ã¦ããéã¯åããªãã */ const HINT_MAX_AGE_SECONDS = 60 * 60 * 24 * 30; 5899/** cookie ã®å¤ãç®å°ã¨ãã¦èªããæ±ºããå¤ã¨å®å ¨ã«ä¸è´ããã¨ãã ãçã */ function readStudentChromeHint(value) { 5900 return value === HINT_VALUE; 5901} 5902/** 5903 * `document.cookie` ã¸æ¸¡ã 1 è¡ãçµã¿ç«ã¦ããå¦çã§ãªããã°æ¶ãè¡ã«ãªãã 5904 * 5905 * `HttpOnly` ãä»ããªãï¼ãã©ã¦ã¶ãæ¸ã cookie ãªã®ã§ä»ããããªãï¼ãä¸èº«ã¯ 5906 * ç®å° 1 ã¤ã§ãå©ç¨è ã®æ å ±ãæããªãã®ã§ãèªã¾ãã¦ãå°ããã®ãç¡ãã 5907 * `Domain` ãä»ããªãï¼ãã®ç®å°ãèªãã®ã¯ apps/web ã ãï¼ã 5908 */ function buildStudentChromeHintCookie(isStudent, secure) { 5909 const attributes = [ 5910 "Path=/", 5911 "SameSite=Lax", 5912 ...secure ? [ 5913 "Secure" 5914 ] : [] 5915 ]; 5916 if (isStudent) { 5917 return [ 5918 `${STUDENT_CHROME_HINT_COOKIE}=${HINT_VALUE}`, 5919 `Max-Age=${HINT_MAX_AGE_SECONDS}`, 5920 ...attributes 5921 ].join("; "); 5922 } 5923 return [ 5924 `${STUDENT_CHROME_HINT_COOKIE}=`, 5925 "Max-Age=0", 5926 ...attributes 5927 ].join("; "); 5928} 5929/** `document.cookie` ã®æååã«ç®å°ãç«ã£ã¦ãããã */ function hasStudentChromeHint(cookieHeader) { 5930 return cookieHeader.split(";").some((part)=>part.trim() === `${STUDENT_CHROME_HINT_COOKIE}=${HINT_VALUE}`); 5931} 5932/** 5933 * å¦çã®ã·ã§ã«ãåºããã確å®ãããèªè¨¼ã®å¤ã ããæ±ºãã確å®åã¯ç®å°ã決ããã 5934 * 5935 * 確å®å¾ã«ç®å°ãè¦ãªã ââ è¦ãã¨ããã°ã¢ã¦ãããå¦çã伿¥ã®å©ç¨è ã« 5936 * å¦çã®ã·ã§ã«ãæ®ãã 5937 */ function shouldShowStudentChrome(state) { 5938 if (!state.isStudentRoute) return false;
5939 if (state.ready) return Boolean(state.isLoggedIn) && state.userType === "student"; 5940 return state.hint; 5941} 5942/** 5943 * ããã¿ãåºããããã°ã¤ã³ãã¦ããéã¯åºããªãã 5944 * 5945 * 確å®åã¯ä»ã¾ã§ãåºããã«åãã¦ãããç®å°ãç«ã£ã¦ããï¼ï¼ãã°ã¤ã³ãã¦ããã¯ãï¼ã¨ã㯠5946 * åºããªãå´ã¸åããåããªãã¨ãå¦çã®ã·ã§ã«ã®ä¸ã«ããã¿ãä¸ç¬åºã¦ã確å®ããç¬éã«æ¶ããã 5947 */ function shouldShowFooterForAuth(state) { 5948 if (state.ready) return state.isLoggedIn === false; 5949 return !state.hint; 5950} 5951/** 5952 * 確å®ããèªè¨¼ã®çµæãç®å°ã¸åããå¦çãªãæ¸ãï¼æéãå»¶ã°ãï¼ãå¦çã§ãªããã° 5953 * ç«ã£ã¦ããã¨ãã ãæ¶ãï¼ãã°ã¤ã³ãã¦ããªã訪åè ã« cookie ãæ¸ããªãï¼ã 5954 */ function syncStudentChromeHint(isStudent, doc = typeof document === "undefined" ? undefined : document, location = false ? 0 : window.location) { 5955 if (!doc) return; 5956 if (!isStudent && !hasStudentChromeHint(doc.cookie)) return; 5957 const secure = location?.protocol === "https:"; 5958 doc.cookie = buildStudentChromeHintCookie(isStudent, secure); 5959} 5960 5961// EXTERNAL MODULE: ./lib/layout/viewport-fit-routes.ts 5962var viewport_fit_routes = __webpack_require__(30940); 5963;// ./lib/use-session-heartbeat.ts 5964/* __next_internal_client_entry_do_not_use__ useSessionHeartbeat auto */ 5965 5966const DEFAULT_INTERVAL_MS = 5 * 60 * 1000 // 5 åã㨠5967; 5968/** 5969 * Cookie ãã¼ã¹ã®ã»ãã·ã§ã³ãç¶æããããã®å¿æç£è¦ããã¯ã 5970 * 5971 * ã¯ã©ã¤ã¢ã³ãã§ refreshSession ããã¨ãã¼ã¯ã³ãã¼ãã¼ã·ã§ã³ã 5972 * ãµã¼ã Cookie ã¨ãºã¬ã¦èªè¨¼ãå¤ãããããBFF ã軽ãå©ã㦠5973 * ãµã¼ãå´ã§å¿ è¦ãªæ´æ°ã ãè¡ãã 5974 * 5975 * SPEC-9663 FR-24: ãã®ããã¯ã¯ã¬ã¹ãã³ã¹ãä¸åè¦ã¦ããªãã£ãã 5976 * `/api/auth/bootstrap` ã¯ã»ãã·ã§ã³ã失å¹ãããã¨ã `authState: "invalidated"` ãè¿ãã 5977 * åãã¬ã¹ãã³ã¹ã§ auth cookie ãåé¤ããããããèªã¾ãªãã¨ããµã¼ãå´ã§ã¯ 5978 * ãã°ã¢ã¦ãæ¸ã¿ãªã®ã«ç»é¢ã¯ãã°ã¤ã³ä¸ã®ã¾ã¾ãã¨ããç¶æ ã 5 åãã¨ã«çã¾ããã 5979 * 5980 * 5xx ã¯**æ±ããªã**ãä¸éæ§ã®é害ã§ãã°ã¢ã¦ããããªãããï¼FR-03 / FR-04 ã®æ å½é åï¼ã 5981 * é·ç§»ã®å¤æãããã«ã¯ç½®ããªãï¼ãªãã¤ã¬ã¯ãå ã®ä¸æ¬å㯠FR-26ï¼ã 5982 */ function useSessionHeartbeat(enabled = true) { 5983 const { isLoggedIn, handleSessionInvalidated } = (0,auth_context/* useAuth */.As)(); 5984 const tickingRef = (0,react.useRef)(false); 5985 (0,react.useEffect)(()=>{ 5986 if (!enabled || !isLoggedIn) return; 5987 let cancelled = false; 5988 const runHeartbeat = async ()=>{ 5989 if (tickingRef.current || cancelled) return; 5990 tickingRef.current = true; 5991 try { 5992 const res = await fetch("/api/auth/bootstrap", { 5993 method: "GET", 5994 credentials: "include", 5995 cache: "no-store" 5996 }); 5997 if (cancelled) return; 5998 // 5xx / ãããã¯ã¼ã¯ä¸èª¿ã¯æ¡ããããã§ç¶æ ãè½ã¨ãã¨ä¸éæ§ã®é害ã 5999 // ãã®ã¾ã¾ãã°ã¢ã¦ãã«ãªãã 6000 if (!res.ok) return; 6001 const payload = await res.json().catch(()=>null); 6002 if (cancelled) return; 6003 if (payload?.authState === "invalidated") { 6004 handleSessionInvalidated(); 6005 } 6006 } catch (error) { 6007 console.error("[auth-heartbeat] bootstrap failed", error); 6008 } finally{ 6009 tickingRef.current = false; 6010 } 6011 }; 6012 // ååãã§ã㯠6013 void runHeartbeat(); 6014 const timer = window.setInterval(runHeartbeat, DEFAULT_INTERVAL_MS); 6015 return ()=>{ 6016 cancelled = true; 6017 window.clearInterval(timer); 6018 }; 6019 }, [ 6020 enabled, 6021 isLoggedIn, 6022 handleSessionInvalidated 6023 ]); 6024} 6025 6026;// ./components/app-chrome.tsx 6027/* __next_internal_client_entry_do_not_use__ default auto */ 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042const STUDENT_ROUTE_PREFIXES = [ 6043 '/dashboard', 6044 '/analysis', 6045 '/career-backcast', 6046 '/selection', 6047 '/case', 6048 '/calendar', 6049 '/deadline-calendar', 6050 '/interested-events', 6051 '/library', 6052 '/diagnosis', 6053 '/ES', 6054 '/favorites', 6055 '/jobs', 6056 '/media', 6057 '/scouts', 6058 '/applications', 6059 '/career-edit', 6060 '/profile', 6061 '/companies', 6062 '/chat', 6063 '/resume', 6064 '/demo', 6065 '/offers', 6066 '/jobhunting', 6067 '/features' 6068]; 6069function AppChrome({ children, studentChromeHint = false }) { 6070 const { ready, isLoggedIn, userType, user, logout, sessionUnavailable } = (0,auth_context/* useAuth */.As)(); 6071 const pathname = (0,navigation.usePathname)() ?? ""; 6072 const router = (0,navigation.useRouter)(); 6073 useSessionHeartbeat(ready && Boolean(isLoggedIn)); 6074 // 確å®ããçµæãç®å°ã¸åããæ¬¡ã«ææ¸ãèªã¿è¾¼ãã ã¨ãããµã¼ãæç»ã®æç¹ãã 6075 // å¦çã®ã·ã§ã«ã§åºããããã«ãããããèªè¨¼ãµã¼ãã¹ã¸ã¤ãªãããªãã£ãã¨ã
6076 // ï¼`sessionUnavailable`ï¼ã¯çµæãåãããªãã®ã§ãç®å°ãæ¶ããã«æ®ãã 6077 (0,react.useEffect)(()=>{ 6078 if (!ready || sessionUnavailable) return; 6079 syncStudentChromeHint(Boolean(isLoggedIn) && userType === "student"); 6080 }, [ 6081 ready, 6082 sessionUnavailable, 6083 isLoggedIn, 6084 userType 6085 ]); 6086 const isStandaloneLanding = // TASK-2099: ãããã就活管ç LP ã«ãªã£ãã®ã§ãLP èªåã®ãã/ããã¿ã¼ã¨ 6087 // å ±éãããã¼ãäºéã«åºãªããã `/` ã standalone æ±ãã«ããã 6088 pathname === "/" || pathname === "/lp/marui-internship" || pathname.startsWith("/lp/marui-internship/") || pathname === "/companylp" || pathname.startsWith("/companylp/") || pathname === "/kanrilp" || pathname.startsWith("/kanrilp/") || pathname === "/newsletter/unsubscribe" || // ESå ±æã¯ã±ã¤ãããªã㣠URL å°ç¨ã®ç»é¢ãå ±éããããµãã¼ã UI ãéããªãã 6089 pathname.startsWith("/es/share/"); 6090 const isStudentRoute = (0,react.useMemo)(()=>STUDENT_ROUTE_PREFIXES.some((prefix)=>pathname === prefix || pathname.startsWith(`${prefix}/`)), [ 6091 pathname 6092 ]); 6093 // 確å®åã¯ç®å°ã決ãããããã `ready &&` ã§å§ããã¨ããµã¼ãæç»ã¨æåã®æç»ã 6094 // å¿ ãå ¬éãããã¼ã«ãªãããã°ã¤ã³ãã¦ããå¦çã«ã¯èªã¿è¾¼ã¿ã®ãã³ã«ãµã¤ããã¼ã 6095 // é ãã¦åºãï¼SPEC-TYDJVYT101ï¼ã 6096 const showStudentSidebar = shouldShowStudentChrome({ 6097 ready, 6098 isLoggedIn, 6099 userType, 6100 isStudentRoute, 6101 hint: studentChromeHint 6102 }); 6103 const isIpoLanding = pathname === "/ipo"; 6104 const isInternshipsLanding = pathname === "/internships"; 6105 const isAdminRoute = pathname === "/admin" || pathname.startsWith("/admin/"); 6106 const isSelfAnalysisRoute = pathname === "/analysis" || pathname.startsWith("/analysis/") || pathname === "/career-backcast" || pathname.startsWith("/career-backcast/"); 6107 const shouldShowSupportChat = !pathname.startsWith("/chat") && !pathname.startsWith("/company/chat") && !isSelfAnalysisRoute; 6108 const handleNavigate = (0,react.useCallback)((route)=>{ 6109 if (route && route !== pathname) { 6110 router.push(route); 6111 } 6112 }, [ 6113 pathname, 6114 router 6115 ]); 6116 const studentUser = (0,react.useMemo)(()=>{ 6117 if (!user) return null; 6118 return { 6119 id: user.id, 6120 name: user.name, 6121 role: user.role, 6122 avatarUrl: null 6123 }; 6124 }, [ 6125 user 6126 ]); 6127 const currentRoute = pathname; 6128 const shouldShowFooter = shouldShowFooterForAuth({ 6129 ready, 6130 isLoggedIn, 6131 hint: studentChromeHint 6132 }); 6133 const whiteBackdropPrefixes = [ 6134 '/favorites', 6135 '/scouts', 6136 '/applications', 6137 '/jobs' 6138 ]; 6139 const whiteBackdropExactRoutes = [ 6140 '/jobs' 6141 ]; // keep exact list for quick lookups if needed 6142 const shouldUseWhiteBackdrop = showStudentSidebar || whiteBackdropPrefixes.some((prefix)=>pathname.startsWith(prefix)) || whiteBackdropExactRoutes.includes(pathname); 6143 const backdropVariant = shouldUseWhiteBackdrop ? 'white' : 'gradient'; 6144 /** 6145 * 1 ç»é¢ã«åããé¢ï¼`lib/layout/viewport-fit-routes.ts`ï¼ã 6146 * SPEC-MQCHWREC37 REQ-14ï¼åä¿¡ç®±ï¼/ SPEC-DMSS5J8DKTï¼èªå·±åæï¼ã 6147 * åããé¢ã§ã¯ããã®å¨ãæã£ã¦ããé«ãã®ä¸éï¼`min-h-screen` = 100vhï¼ã¨ 6148 * ä¸é¨ããã¶ãã®éãï¼`pb-16`ï¼ãã©ã¡ããæããªãã`.app-shell` 㯠6149 * `height: 100dvh` ãªã®ã§ã100vh ã®ä¸éã¯ã¢ãã¤ã«ã§ URL ãã¼ã®ã¶ãã ã 6150 * å¿ ãã¯ã¿åºããéãã¯é¢ã®å´ã 1 ç®æã§æãï¼äºéã«æãã¨åãã ãä½ãï¼ã 6151 */ const viewportFit = (0,viewport_fit_routes/* isViewportFitRoute */.jO)(pathname); 6152 /** 6153 * SPEC-DMSS5J8DKT: èªåã§æä¸é¨ã¾ã§çµµãæ·ããä¸é¨ããã¶ãã®éããèªåã§æãé¢ã 6154 * ãããéãã¦æãã¨ãçµµãçµãã£ããã¨ã«ã¡ããã©ãã®åã ãç½ãå¸¯ãæ®ãã 6155 */ const selfPaintedBottom = (0,viewport_fit_routes/* isSelfPaintedBottomRoute */.wn)(pathname); 6156 if (isStandaloneLanding) { 6157 return /*#__PURE__*/ (0,jsx_runtime.jsx)(jsx_runtime.Fragment, { 6158 children: children 6159 }); 6160 } 6161 if (isAdminRoute) { 6162 return /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6163 className: "min-h-screen w-full overflow-x-hidden bg-slate-50", 6164 children: children 6165 }); 6166 } 6167 if (showStudentSidebar) { 6168 return /*#__PURE__*/ (0,jsx_runtime.jsx)(GradientBackdrop, { 6169 variant: backdropVariant, 6170 fit: viewportFit, 6171 children: /*#__PURE__*/ (0,jsx_runtime.jsxs)(sidebar/* SidebarProvider */.GB, { 6172 defaultOpen: false, 6173 storageKey: "student:sidebar:state", 6174 style: { 6175 "--sidebar-width": "12.25rem" 6176 }, 6177 children: [ 6178 /*#__PURE__*/ (0,jsx_runtime.jsxs)(Layout/* Layout */.P, { 6179 currentRoute: currentRoute, 6180 navigate: handleNavigate, 6181 user: studentUser, 6182 onLogout: logout, 6183 children: [ 6184 /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 6185 className: (0,utils.cn)('flex flex-col', viewportFit ? 'min-h-0 flex-1' : 'min-h-screen'), 6186 children: [ 6187 /*#__PURE__*/ (0,jsx_runtime.jsx)("main", { 6188 className: (0,utils.cn)('flex-1', viewportFit ? 'flex min-h-0 flex-col' : selfPaintedBottom ? null : 'pb-16 md:pb-0'), 6189 children: children 6190 }), 6191 !viewportFit && shouldShowFooter ? isInternshipsLanding ? /*#__PURE__*/ (0,jsx_runtime.jsx)(InternshipsFooter, {}) : /*#__PURE__*/ (0,jsx_runtime.jsx)(Footer, {}) : null 6192 ] 6193 }), 6194 /*#__PURE__*/ (0,jsx_runtime.jsx)(MobileNavigation, { 6195 studentChromeHint: studentChromeHint 6196 }) 6197 ] 6198 }), 6199 shouldShowSupportChat ? /*#__PURE__*/ (0,jsx_runtime.jsx)(SupportChatWidget, {}) : null 6200 ] 6201 }) 6202 }); 6203 } 6204 return /*#__PURE__*/ (0,jsx_runtime.jsxs)(GradientBackdrop, { 6205 variant: backdropVariant, 6206 fit: viewportFit, 6207 children: [ 6208 !isIpoLanding ? /*#__PURE__*/ (0,jsx_runtime.jsx)(header/* default */.A, {}) : null, 6209 /*#__PURE__*/ (0,jsx_runtime.jsx)("main", { 6210 className: (0,utils.cn)('flex-1', viewportFit ? 'flex min-h-0 flex-col' : selfPaintedBottom ? null : 'pb-16 md:pb-0'), 6211 children: children 6212 }), 6213 !isIpoLanding && !viewportFit && shouldShowFooter ? isInternshipsLanding ? /*#__PURE__*/ (0,jsx_runtime.jsx)(InternshipsFooter, {}) : /*#__PURE__*/ (0,jsx_runtime.jsx)(Footer, {}) : null, 6214 !isIpoLanding ? /*#__PURE__*/ (0,jsx_runtime.jsx)(MobileNavigation, { 6215 studentChromeHint: studentChromeHint 6216 }) : null, 6217 shouldShowSupportChat ? /*#__PURE__*/ (0,jsx_runtime.jsx)(SupportChatWidget, {}) : null 6218 ] 6219 }); 6220} 6221/** 6222 * `fit` 㯠SPEC-DMSS5J8DKT ã®ã1 ç»é¢ã«åããé¢ãã`min-h-screen`ï¼100vhï¼ã¯ 6223 * `.app-shell` ã® `height: 100dvh` ãã大ãããªãããï¼ã¢ãã¤ã«ã® URL ãã¼ï¼ã®ã§ã 6224 * åããé¢ã§ã¯é«ãã®ä¸éãæãããã¹ã¯ãã¼ã©ã®é«ãããã®ã¾ã¾åãåãã 6225 */ function GradientBackdrop({ children, variant = 'gradient', fit = false }) { 6226 // åããé¢ã§ã¯å¤å´ã®å¨ã¨ä¸ã®åãåãé«ãã«ããã2 ã¤ã«åãã¦æã¤ã¨çæ¹ã ã 6227 // å¤ãããã¦ãã¾ããå¨ã¯åã¾ã£ã¦ããã®ã«ä¸èº«ãã¯ã¿åºãå½¢ãä½ããã 6228 const height = fit ? 'h-full min-h-0' : 'min-h-screen'; 6229 if (variant === 'white') { 6230 return /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6231 className: (0,utils.cn)('relative w-full bg-white overflow-x-hidden', height), 6232 children: /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6233 className: (0,utils.cn)('relative z-10 flex flex-col', height), 6234 children: children 6235 }) 6236 }); 6237 } 6238 return /*#__PURE__*/ (0,jsx_runtime.jsxs)("div", { 6239 className: (0,utils.cn)('relative w-full bg-gradient-to-br from-rose-50 via-white to-purple-50 overflow-x-hidden', height), 6240 children: [ 6241 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6242 className: "pointer-events-none absolute -top-48 -left-24 h-[28rem] w-[28rem] rounded-full bg-rose-200/40 blur-3xl" 6243 }), 6244 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6245 className: "pointer-events-none absolute top-1/3 -right-32 h-[22rem] w-[22rem] rounded-full bg-purple-200/30 blur-3xl" 6246 }), 6247 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6248 className: "pointer-events-none absolute bottom-[-6rem] left-1/2 h-[20rem] w-[20rem] -translate-x-1/2 roun
6248ded-full bg-amber-200/25 blur-3xl" 6249 }), 6250 /*#__PURE__*/ (0,jsx_runtime.jsx)("div", { 6251 className: (0,utils.cn)('relative z-10 flex flex-col', height), 6252 children: children 6253 }) 6254 ] 6255 }); 6256} 6257 6258 6259/***/ }), 6260 6261/***/ 37372: 6262/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 6263 6264"use strict"; 6265 6266// EXPORTS 6267__webpack_require__.d(__webpack_exports__, { 6268 r6: () => (/* reexport */ ROUTE_ON_UNRESOLVED_VALUES), 6269 Wu: () => (/* reexport */ findThirdTierChoice), 6270 zs: () => (/* reexport */ isExpectedRejectionChoice), 6271 An: () => (/* reexport */ resolveThirdTier), 6272 Vo: () => (/* reexport */ resolveUnresolvedRoute), 6273 Ts: () => (/* reexport */ resolveUnresolvedRouteWithFaqOverride) 6274}); 6275 6276// UNUSED EXPORTS: APPLY_BLOCKED_CHOICES, DEFAULT_ROUTE_ON_UNRESOLVED, JOBHUNTING_AI_CHOICES, THIRD_TIER_BY_SLUG, isRouteOnUnresolved 6277 6278;// ../../packages/shared/src/support-chatbot/routing.ts 6279/** 6280 * æªè§£æ±ºæã®è¡ãå ã¨ã第 3 é層ï¼ã¨ã©ã¼æè¨åå²ï¼ã®å®ç¾© 6281 * ï¼SPEC-WVA4F4GMQM REQ-09 / REQ-12 / AC-07ã»AC-08ï¼ã 6282 * 6283 * è¡ãå ã¯ã«ãã´ãªã®ãã¼ã¿ã§æ±ºãããwidget 㨠route ã«ãªãã©ã«ãæ£ãããªãã 6284 * IO ãæããªãï¼å¥ç´ãã¹ãããç´æ¥å©ããããã«ããï¼ã 6285 */ const ROUTE_ON_UNRESOLVED_VALUES = [ 6286 /** FAQ ãè¦ãã¦çµããï¼äººã¸ç¹ããªãï¼ã */ "faq_only", 6287 /** æ¢åã®ã¨ã¹ã«ã¬ã¼ã·ã§ã³ãæ¢å®å¤ã */ "escalation", 6288 /** æ§é åãã°å ±åï¼REQ-11ãé ç·ã¯å¾ç¶ã¹ã©ã¤ã¹ï¼ã */ "bug_report", 6289 /** 就活ã¡ã¼ã« AI ã¢ã¼ãã¸åãæ¿ããã */ "mailbox_mode", 6290 /** 就活ç¸è« AI ã¢ã¼ãã¸åãæ¿ããã */ "jobhunting_mode" 6291]; 6292/** åãç¡ã / æªè¨å® / æªç¥ã®å¤ã¯ãã¹ã¦æ¢å®ï¼æ¢åæåï¼ã¸åãã */ const DEFAULT_ROUTE_ON_UNRESOLVED = "escalation"; 6293function isRouteOnUnresolved(value) { 6294 return typeof value === "string" && ROUTE_ON_UNRESOLVED_VALUES.includes(value); 6295} 6296/** 6297 * è¡ãå ãæ±ºããã 6298 * 6299 * `intent = dynamic` ã®ã«ãã´ãªã¯ç¬¬ 3 é層ã§å® intent ã確å®ãã¦ããåå²ããã®ã§ã 6300 * ããã§ã¯æ¢å®ã¸åãï¼ç¬¬ 3 é層ã®çµæã¯ `resolveThirdTierRoute` ãè¿ãï¼ã 6301 */ function resolveUnresolvedRoute(input) { 6302 if (input.intent === "dynamic") return DEFAULT_ROUTE_ON_UNRESOLVED; 6303 return isRouteOnUnresolved(input.routeOnUnresolved) ? input.routeOnUnresolved : DEFAULT_ROUTE_ON_UNRESOLVED; 6304} 6305/** 6306 * æªè§£æ±ºã®è¡ãå ã確å®ãããFAQ èªèº«ã® `if_failed` ã¯ã«ãã´ãªæ¢å®ããåªå ãããã 6307 * **第 3 é層ã§ä»æ§ã©ããã®æå¦ã確å®ããä¼è©±ã§ã¯ããã°å ±åã¸ã®ä¸æ¸ãã許ããªãã** 6308 * 6309 * `deadline_passed` / `job_full` / `invalid_csrf` 㯠deep link ãæããªãã®ã§ã 6310 * 第 3 é層ã®ãã¨ã FAQ åè£ â 解決確èªã¨ä¼è©±ãç¶ããããã§å¦çãã解決ãã¦ãã¾ããã 6311 * ãæ¼ãã¨ãç´åã«è¦ã FAQ ã® `if_failed` ãè¡ãå ã«ãªãããã® FAQ ã `bug_report` 6312 * ã ã¨ãå®è£ ãæå³ãã¦åºãã¦ããæå¦ããã®ã¾ã¾ãã°ãã¥ã¼ã¸å ¥ãã 6313 * èªåä¿®æ£ã¯æ¢å®ã§åãã®ã§ãAI ãã仿§ã©ããã®åä½ããç´ãã«è¡ããã¨ã«ãªã 6314 *ï¼`.claude/rules/support-chatbot-rules.md`ãæ£å¸¸ãªæå¦ããä¸å ·åãã«åé¡ããªããï¼ã 6315 * 6316 * è½ã¨ãã®ã¯ `bug_report` ã¸ã®ä¸æ¸ãã ãã`mailbox_mode` / `jobhunting_mode` / 6317 * `faq_only` ã¯äººã¸ç¹ãã»æ¡å ããå´ãªã®ã§ãæå¦ã確å®ãã¦ãã¦ã妨ããªãã 6318 */ function resolveUnresolvedRouteWithFaqOverride(input) { 6319 const faqRoute = input.faqRoute ?? null; 6320 if (!faqRoute) return input.categoryRoute; 6321 if (input.expectedRejection && faqRoute === "bug_report") return input.categoryRoute; 6322 return faqRoute; 6323} 6324/** 6325 * å¿åã§ããªãï¼`apply-blocked`ï¼ã® 8 æã 6326 * 6327 * **仿§ã©ããã®æå¦ããã°ã«åé¡ããªãã** `onboarding_required` / 6328 * `already_applied` / `deadline_passed` / `job_full` / `slot_full` / `invalid_csrf` 㯠6329 * å®è£ ãæå³ãã¦åºãã¦ãããã®ã§ãæ¬ é¥ã§ã¯ãªãã該å½ç»é¢ã¸èªå°ãã¦çµããã 6330 * 6331 * **`slot_full` ã¯å°ç¨ã®é¸æè¢ãæããªãã** å¿åç»é¢ã¯ `job_full` 㨠`slot_full` ã« 6332 * åãæè¨ï¼ãåéãç· ãåããã¾ãããå¥ã®æ¥ç¨ã»æ±äººãã確èªãã ããããï¼ãåºãã®ã§ã 6333 * å¦çã«ã¯åºå¥ãä»ããªããåºå¥ãæ±ãã鏿è¢ãç½®ãã¨çããããªã質åã«ãªãããã 6334 * å®å¡ã® 1 æã両æ¹ãåãããå ±åã«è¼ã `error_code` 㯠`job_full` ã«ãªãã 6335 * åãããªãå ã«å¿åç»é¢ã®æè¨ãåããï¼å¥ SPECï¼ã 6336 */ const APPLY_BLOCKED_CHOICES = [ 6337 { 6338 label: "ãããã£ã¼ã«ã®å ¥åãæ±ãããã", 6339 value: "apply_blocked_onboarding_required", 6340 errorCode: "onboarding_required", 6341 intent: "howto", 6342 route: "escalation", 6343 deepLink: "/onboarding/profile" 6344 }, 6345 { 6346 label: "ãã§ã«å¿åæ¸ã¿ã¨è¡¨ç¤ºããã", 6347 value: "apply_blocked_already_applied", 6348 errorCode: "already_applied", 6349 intent: "howto", 6350 route: "escalation", 6351 deepLink: "/applications" 6352 }, 6353 { 6354 label: "å¿åã®ç· åãéãã¦ããã¨è¡¨ç¤ºããã", 6355 value: "apply_blocked_deadline_passed", 6356 errorCode: "deadline_passed", 6357 intent: "howto", 6358 route: "escalation" 6359 }, 6360 { 6361 label: "å®å¡ã«éãã¦ããã¨è¡¨ç¤ºããã", 6362 value: "apply_blocked_job_full", 6363 errorCode: "job_full", 6364 intent: "howto", 6365 route: "escalation" 6366 }, 6367 { 6368 label: "ã»ãã·ã§ã³ãåããã»ããä¸åº¦ã試ããã ããã¨è¡¨ç¤ºããã",
6369 value: "apply_blocked_invalid_csrf", 6370 errorCode: "invalid_csrf", 6371 intent: "howto", 6372 route: "escalation" 6373 }, 6374 { 6375 label: "æ¼ãã¦ãä½ãèµ·ããªã", 6376 value: "apply_blocked_no_response", 6377 errorCode: null, 6378 intent: "bug", 6379 route: "bug_report" 6380 }, 6381 { 6382 label: "åä½ãéãã»çµãããªã", 6383 value: "apply_blocked_slow", 6384 errorCode: null, 6385 intent: "bug", 6386 route: "bug_report" 6387 }, 6388 { 6389 label: "ä¸ã®ã©ãã§ããªã", 6390 value: "apply_blocked_other", 6391 errorCode: null, 6392 intent: "bug", 6393 route: "bug_report" 6394 } 6395]; 6396/** 6397 * 就活ç¸è« AIï¼`jobhunting-ai`ï¼ã® 3 æã 6398 * 6399 * **対象 AI æ©è½ã¯é¸ã°ããªã**ï¼çç¶ã§è¡ãå ãæ±ºã¾ãããï¼ã3 è¡ç®ã `bug` ã«åããªã ââ 6400 * AI ã®åºåå質ã¯ã³ã¼ãã®æ¬ é¥ã§ã¯ãªãããã³ããã»ã¢ãã«ã®åé¡ã§ã1 ä»¶ã®è¦æ ãæ ¹æ ã« 6401 * èªåä¿®æ£ã¸æµãã¨å£ãã¦ããªããã®ãç´ãã«è¡ãã 6402 */ const JOBHUNTING_AI_CHOICES = [ 6403 { 6404 label: "ä½¿ãæ¹ãããããªã", 6405 value: "jobhunting_ai_howto", 6406 errorCode: null, 6407 intent: "howto", 6408 route: "escalation" 6409 }, 6410 { 6411 label: "å¿çããªãã»å¦çãçµãããªã", 6412 value: "jobhunting_ai_stuck", 6413 errorCode: null, 6414 intent: "bug", 6415 route: "bug_report" 6416 }, 6417 { 6418 label: "åºã¦ããå å®¹ãæ£ãããªãã»çå¤ã", 6419 value: "jobhunting_ai_quality", 6420 errorCode: null, 6421 intent: "request", 6422 route: "escalation" 6423 } 6424]; 6425/** 6426 * 第 3 é層ãæã¤ã«ãã´ãªã**`dynamic` ã¯ãã® 2 ã¤ã ã**ï¼REQ-06ï¼ã 6427 * å¦çãèªåã§çãããã鏿è¢ãåºãããã®ã«éãã 6428 */ const THIRD_TIER_BY_SLUG = { 6429 "apply-blocked": APPLY_BLOCKED_CHOICES, 6430 "jobhunting-ai": JOBHUNTING_AI_CHOICES 6431}; 6432function resolveThirdTier(categorySlug) { 6433 if (!categorySlug) return null; 6434 return THIRD_TIER_BY_SLUG[categorySlug] ?? null; 6435} 6436function findThirdTierChoice(categorySlug, value) { 6437 const choices = resolveThirdTier(categorySlug); 6438 if (!choices) return null; 6439 return choices.find((choice)=>choice.value === value) ?? null; 6440} 6441/** 6442 * 第 3 é層ãã仿§ã©ããã®æå¦ãã¨ãã¦ç¢ºå®ããã鏿ãã 6443 * 6444 * ã¨ã©ã¼æè¨ã®ã³ã¼ããæã¡ããã¤è¡ãå ããã°å ±åã§ãªããã®ãããã«ãããã 6445 * æ¬ é¥å´ï¼ãæ¼ãã¦ãä½ãèµ·ããªãããåä½ãéãããä¸ã®ã©ãã§ããªããï¼ã¯ 6446 * `errorCode` ãæããªãã®ã§ããã®å¤å®ã«ã¯å ¥ããªãã 6447 * 6448 * **`route !== "bug_report"` ãè½ã¨ããªãã** å°æ¥ `errorCode` ãæã¤é¸æè¢ã 6449 * ãã°çµè·¯ã¸è¶³ããã¨ããã³ã¼ãã®æç¡ã ãã§è¦ã¦ããã¨ããã®å ±åã¾ã§ 6450 * ã仿§ã©ããã®æå¦ãã¨ãã¦æ±ããã¦ãã°å ±åã«è¾¿ãçããªããªãã 6451 */ function isExpectedRejectionChoice(choice) { 6452 return Boolean(choice && choice.errorCode !== null && choice.route !== "bug_report"); 6453} 6454 6455;// ./lib/support-chatbot/routing.ts 6456/** 6457 * SPEC-ZQTJAC3GJ5: æ£æ¬ã¯ `packages/shared` ã¸ç§»ããï¼æªè§£æ±ºæã®è¡ãå ã¨ç¬¬ 3 é層ã®å®ç¾©ãapps/mobile ãåããã®ãèªãï¼ã 6458 * 6459 * ããã¯**åã¨ã¯ã¹ãã¼ãã ã**ã«ãããå®è£ ãè¶³ã㨠apps/web 㨠apps/mobile ã§ 6460 * 夿ãå²ããåãä¼è©±ãé¢ãã¨ã«å¥ã®åºå£ã»å¥ã®è¡ãå ã«ãªãã 6461 * 夿´ã¯å¿ ã `packages/shared/src/support-chatbot/routing.ts` å´ã§è¡ãã 6462 */ 6463 6464 6465/***/ }), 6466 6467/***/ 39884: 6468/***/ (() => { 6469 6470// extracted by mini-css-extract-plugin 6471 6472/***/ }), 6473 6474/***/ 45386: 6475/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 6476 6477"use strict"; 6478/* harmony export */ __webpack_require__.d(__webpack_exports__, { 6479/* harmony export */ OA: () => (/* binding */ parseUtmFromSearch), 6480/* harmony export */ ef: () => (/* binding */ readStoredUtm), 6481/* harmony export */ fl: () => (/* binding */ applyNextParamUtm), 6482/* harmony export */ iu: () => (/* binding */ mergeStoredUtm), 6483/* harmony export */ mp: () => (/* binding */ ensureUtmFromLocation), 6484/* harmony export */ vw: () => (/* binding */ clearStoredUtm) 6485/* harmony export */ }); 6486/* unused harmony export persistUtmFromSearch */ 6487const STORAGE_KEY = "gkt_signup_utm"; 6488const isBrowser = ()=>"object" !== "undefined"; 6489function normalize(value) { 6490 if (!value) return null; 6491 const trimmed = value.trim(); 6492 return trimmed.length > 0 ? trimmed : null; 6493} 6494function resolveField(incoming, existing) { 6495 if (incoming === undefined) return existing ?? null; 6496 if (incoming === null) return null; 6497 return normalize(incoming); 6498} 6499function parseUtmFromSearch(search) { 6500 if (!search) return null; 6501 const params = new URLSearchParams(search); 6502 const utm = { 6503 source: normalize(params.get("utm_source")), 6504 medium: normalize(params.get("utm_medium")), 6505 campaign: normalize(params.get("utm_campaign")), 6506 content: normalize(params.get("utm_content")), 6507 code: normalize(params.get("campaign_code") ?? params.get("utm_code")), 6508 capturedAt: Date.now() 6509 }; 6510 const hasValue = Object.entries(utm).some(([key, value])=>key !== "capturedAt" && value); 6511 return hasValue ? utm : null; 6512} 6513function readStoredUtm() { 6514 if (!isBrowser()) return null; 6515 try { 6516 const raw = window.localStorage.getItem(STORAGE_KEY); 6517 if (!raw) return null; 6518 const parsed = JSON.parse(raw); 6519 if (parsed && typeof parsed === "object") { 6520 return parsed; 6521 } 6522 } catch (error) { 6523 console.warn("[utm] failed to parse stored value", error); 6524 clearStoredUtm(); 6525 } 6526 return null; 6527} 6528function persistUtmFromSearch(search) { 6529 if (!isBrowser()) return null; 6530 const parsed = parseUtmFromSearch(search); 6531 if (!parsed) return null; 6532 try { 6533 window.localStorage.setItem(STORAGE_KEY, JSON.stringify(parsed)); 6534 return parsed; 6535 } catch (error) { 6536 console.warn("[utm] failed to persist", error); 6537 } 6538 return null; 6539} 6540function ensureUtmFromLocation() { 6541 if (!isBrowser()) return null; 6542 const persisted = persistUtmFromSearch(window.location.search); 6543 if (persisted) return persisted; 6544 try { 6545 const params = new URLSearchParams(window.location.search); 6546 const nextParam = params.get("next"); 6547 if (nextParam) { 6548 const merged = applyNextParamUtm(nextParam); 6549 if (merged) return merged; 6550 } 6551 } catch (error) { 6552 console.warn("[utm] failed to parse next param", error); 6553 } 6554 return readStoredUtm(); 6555} 6556function clearStoredUtm() { 6557 if (!isBrowser()) return; 6558 try { 6559 window.localStorage.removeItem(STORAGE_KEY); 6560 } catch (error) { 6561 console.warn("[utm] failed to clear", error); 6562 } 6563} 6564function mergeStoredUtm(partial) { 6565 if (!isBrowser()) return null; 6566 const existing = readStoredUtm(); 6567 const merged = { 6568 source: resolveField(partial.source, existing?.source), 6569 medium: resolveField(partial.medium, existing?.medium), 6570 campaign: resolveField(partial.campaign, existing?.campaign), 6571 content: resolveField(partial.content, existing?.content), 6572 code: resolveField(partial.code, existing?.code), 6573 capturedAt: typeof partial.capturedAt === "number" ? partial.capturedAt : existing?.capturedAt ?? Date.now() 6574 }; 6575 try { 6576 window.localStorage.setItem(STORAGE_KEY, JSON.stringify(merged)); 6577 } catch (error) { 6578 console.warn("[utm] failed to merge", error); 6579 } 6580 return merged; 6581} 6582function parseUtmFromNextParam(raw) { 6583 if (!isBrowser()) return null; 6584 try { 6585 const baseUrl = new URL(raw, window.location?.origin || "https://example.com"); 6586 const fromSearch = parseUtmFromSearch(baseUrl.search); 6587 const pathSegments = baseUrl.pathname.split("/").filter(
6587Boolean); 6588 const codeFromPath = pathSegments.length > 1 && pathSegments[0] === "c" ? normalize(pathSegments[1]) : null; 6589 if (!fromSearch && !codeFromPath) { 6590 return null; 6591 } 6592 const capturedAt = Date.now(); 6593 return { 6594 source: fromSearch?.source ?? null, 6595 medium: fromSearch?.medium ?? null, 6596 campaign: fromSearch?.campaign ?? null, 6597 content: fromSearch?.content ?? null, 6598 code: fromSearch?.code ?? codeFromPath ?? null, 6599 capturedAt 6600 }; 6601 } catch (error) { 6602 console.warn("[utm] failed to parse next param url", error); 6603 return null; 6604 } 6605} 6606function applyNextParamUtm(nextParam) { 6607 const parsed = parseUtmFromNextParam(nextParam); 6608 if (!parsed) return null; 6609 return mergeStoredUtm(parsed); 6610} 6611 6612 6613/***/ }), 6614 6615/***/ 48398: 6616/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 6617 6618"use strict"; 6619 6620// EXPORTS 6621__webpack_require__.d(__webpack_exports__, { 6622 "default": () => (/* binding */ Providers) 6623}); 6624 6625// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/compiled/react/jsx-runtime.js 6626var jsx_runtime = __webpack_require__(10335); 6627// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/compiled/react/index.js 6628var react = __webpack_require__(82071); 6629// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/api/navigation.js 6630var navigation = __webpack_require__(30737); 6631// EXTERNAL MODULE: ../../packages/shared/src/index.ts + 27 modules 6632var src = __webpack_require__(70020); 6633// EXTERNAL MODULE: ./lib/kanrilp/oauth-error-codes.ts 6634var oauth_error_codes = __webpack_require__(83099); 6635// EXTERNAL MODULE: ./utils/analytics.ts + 1 modules 6636var analytics = __webpack_require__(28572); 6637;// ./components/analytics/route-analytics-tracker.tsx 6638/* __next_internal_client_entry_do_not_use__ RouteAnalyticsTracker auto */ 6639 6640 6641 6642function resolveGtag() { 6643 if (false) {} 6644 const candidate = window.gtag; 6645 return typeof candidate === "function" ? candidate : null; 6646} 6647function RouteAnalyticsTracker() { 6648 const pathname = (0,navigation.usePathname)(); 6649 const searchParams = (0,navigation.useSearchParams)(); 6650 const lastAnalyticsSignatureRef = (0,react.useRef)(null); 6651 const lastLandingSignatureRef = (0,react.useRef)(null); 6652 const lastSearchSignatureRef = (0,react.useRef)(null); 6653 const lastSignupSignatureRef = (0,react.useRef)(null); 6654 (0,react.useEffect)(()=>{ 6655 if ((0,analytics/* isSensitiveAnalyticsPath */.GV)(pathname)) return; 6656 // URLï¼ã¯ã¨ãªä»ãï¼ 6657 const url = pathname + (searchParams?.toString() ? `?${searchParams}` : ""); 6658 // gtag ãèªã¿è¾¼ã¾ãã¦ããããã§ã㯠6659 const gtag = resolveGtag(); 6660 if (gtag) gtag("event", "page_view", { 6661 page_path: url 6662 }); 6663 }, [ 6664 pathname, 6665 searchParams 6666 ]); 6667 (0,react.useEffect)(()=>{ 6668 if (false) {} 6669 if ((0,analytics/* isSensitiveAnalyticsPath */.GV)(pathname)) return; 6670 // SPEC-9649: Gmail 飿ºã®çµæãã©ã¡ã¼ã¿ã¯ç½²åããå¤ããåãå´ã表示å¾ã« URL ãã 6671 // åãé¤ããããå¤ããªãã¨ãã¯ã¨ãªä»ããã¨ãæé¤å¾ãã§2å page_view ãé£ã³ã 6672 // 1åã®é·ç§»ã H7 ã®é²è¦§æ°ã«2ä»¶å ¥ãï¼é£æºç´å¾ã®å¦çã ãæ°åãè¨ããï¼ã 6673 const signatureParams = new URLSearchParams(searchParams?.toString() ?? ""); 6674 for (const param of oauth_error_codes/* GMAIL_CONNECT_RESULT_PARAMS */.dz)signatureParams.delete(param); 6675 const search = signatureParams.toString(); 6676 const signature = `${pathname ?? ""}?${search}`; 6677 if (lastAnalyticsSignatureRef.current !== signature) { 6678 lastAnalyticsSignatureRef.current = signature;
6679 void (0,analytics/* trackAnalyticsEvent */.KG)("page_view"); 6680 } 6681 const resolveLpType = ()=>{ 6682 if (!pathname) return null; 6683 if (pathname.startsWith("/lp")) { 6684 const raw = pathname.replace(/^\/lp\/?/, ""); 6685 return raw || "index"; 6686 } 6687 if (pathname === "/companylp" || pathname.startsWith("/companylp/")) { 6688 const raw = pathname.replace(/^\/companylp\/?/, ""); 6689 return raw ? `companylp/${raw}` : "companylp"; 6690 } 6691 if (pathname.startsWith("/landing")) { 6692 const raw = pathname.replace(/^\/landing\/?/, ""); 6693 return raw || "index"; 6694 } 6695 return null; 6696 }; 6697 const lpType = resolveLpType(); 6698 if (lpType) { 6699 const landingSignature = `${lpType}:${signature}`; 6700 if (lastLandingSignatureRef.current !== landingSignature) { 6701 lastLandingSignatureRef.current = landingSignature; 6702 void (0,analytics/* trackAnalyticsEvent */.KG)("landing_view", { 6703 lp_type: lpType 6704 }); 6705 } 6706 } 6707 const signupPaths = [ 6708 "/signup", 6709 "/ipo-signup", 6710 "/s-ipo-signup", 6711 "/intern-entry", 6712 "/auth/register" 6713 ]; 6714 if (pathname && signupPaths.some((p)=>pathname === p || pathname.startsWith(`${p}/`))) { 6715 if (lastSignupSignatureRef.current !== signature) { 6716 lastSignupSignatureRef.current = signature; 6717 void (0,analytics/* trackAnalyticsEvent */.KG)("signup_start"); 6718 } 6719 } 6720 const queryKeys = [ 6721 "q", 6722 "query", 6723 "keyword", 6724 "search", 6725 "term" 6726 ]; 6727 const matchKey = queryKeys.find((key)=>{ 6728 const value = searchParams?.get(key); 6729 return value && value.trim().length > 0; 6730 }); 6731 if (matchKey) { 6732 const queryValue = searchParams?.get(matchKey) ?? ""; 6733 const searchSignature = `${pathname ?? ""}:${matchKey}:${queryValue}`; 6734 if (lastSearchSignatureRef.current !== searchSignature) { 6735 lastSearchSignatureRef.current = searchSignature; 6736 void (0,analytics/* trackAnalyticsEvent */.KG)("search_intent", { 6737 query_type: matchKey 6738 }); 6739 } 6740 } 6741 }, [ 6742 pathname, 6743 searchParams 6744 ]); 6745 return null; 6746} 6747 6748// EXTERNAL MODULE: ./lib/auth-context.tsx + 2 modules 6749var auth_context = __webpack_require__(98796); 6750// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected][email protected][email protected][email protected]/node_modules/next-themes/dist/index.mjs 6751var dist = __webpack_require__(13049); 6752// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected][email protected][email protected][email protected]/node_modules/sonner/dist/index.mjs 6753var sonner_dist = __webpack_require__(42393); 6754;// ./components/ui/sonner.tsx 6755/* __next_internal_client_entry_do_not_use__ Toaster auto */ 6756 6757 6758const Toaster = ({ ...props })=>{ 6759 const { theme = "system" } = (0,dist/* useTheme */.D)(); 6760 return /*#__PURE__*/ (0,jsx_runtime.jsx)(sonner_dist/* Toaster */.l$, { 6761 theme: theme, 6762 className: "toaster group", 6763 toastOptions: { 6764 classNames: { 6765 toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", 6766 description: "group-[.toast]:text-muted-foreground", 6767 actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground", 6768 cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground" 6769 } 6770 }, 6771 ...props 6772 }); 6773}; 6774 6775 6776// EXTERNAL MODULE: ./utils/utm.ts 6777var utm = __webpack_require__(45386); 6778// EXTERNAL MODULE: ./utils/tracking.ts + 1 modules 6779var tracking = __webpack_require__(87356); 6780// EXTERNAL MODULE: ../../packages/shared/src/analytics/journey.ts 6781var journey = __webpack_require__(80537); 6782// EXTERNAL MODULE: ./lib/analytics/journey-context.ts 6783var journey_context = __webpack_require__(73169); 6784;// ./lib/analytics/autocapture.ts 6785/** 6786 * SPEC-FTV8N7CCZ0: ç»é¢ãã¨ã«è¨æ¸¬ãæ¸ããªãã¦ãæ®ãèªåè¨æ¸¬ã 6787 * 6788 * 1. **ã¯ãªãã¯**ï¼`ui_click`ï¼: æ¼ããè¦ç´ ãæ¼ããããä½ãæ¼ãããï¼åºç»ã»è¦ç´ ã®ååã» 6789 * è¡ãå ã®åã»æ±äºº idã»ä¸¦ã³ã®ä½ç½®ï¼ãæ®ãããªã³ã¯ã¨ãã¿ã³ã¯ãé·ç§»å¾ ã¡ãã¨ãã¦ç«¯æ«ã« 6790 * æ®ããçãããã¼ã¸ããããæ¾ã£ã¦ç·ãã¤ãªãï¼`journey-context.ts`ï¼ã 6791 * 2. **æ±äººã®è¡¨ç¤º**ï¼`ui_impression`ï¼: æ±äººãæããªã³ã¯ï¼`/jobs/<id>`ï¼ã¨ 6792 * `data-analytics-job-id` ãæã¤è¦ç´ ããåå以ä¸ã»1 ç§ä»¥ä¸ç»é¢ã«åºããæ®ãã 6793 * åºç»ãã¨ã«ã¾ã¨ãã¦éãï¼1 ä»¶ 1 è¡ã«ããªãï¼ã 6794 * 3. **ååãæã¤åºç»ã®è¡¨ç¤º**ï¼`ui_impression`ã»`items` ç¡ãï¼: `data-analytics-area` ã 6795 * æã¤åºç»ããåå以ä¸ï¼ã¾ãã¯ç»é¢ã®åå以ä¸ãå ãã¦ï¼1 ç§ä»¥ä¸åºãã 1 åæ®ãã 6796 * ãã®åºç»ã®ã¯ãªãã¯çã®åæ¯ã«ãªããååã®ç¡ã
6796åºç»ã¯æ°ããªãï¼æ°ãè¨ããã ãã§ 6797 * èªããªãããï¼ã 6798 * 6799 * æ°ããç»é¢ã»æ°ããé¨åããæ¼ããè¦ç´ ã¨æ±äººãªã³ã¯ãæã¤éãä½ãããªãã¦ãä¹ãã 6800 * ååãèªããå½¢ã«ãããåºç»ã«ã¯ `data-analytics-area="..."`ããã¿ã³ã«ã¯ 6801 * `data-analytics-id="..."` ãä»ããããï¼ä»ããªãã¦ã DOM ã®æ§é ã§åä¹ãï¼ã 6802 * æ¾ãããããªãè¦ç´ 㯠`data-analytics-ignore` ã§å¤ãã 6803 * 6804 * **æååã 1 ã¤ãèªã¾ãªãã** ãã¿ã³ã®æè¨ã»è¦åºãã»å ¥åæ¬ã®å¤ã»æ±äººã¿ã¤ãã«ã»ç¤¾å㯠6805 * ã©ããéããªãï¼è¦åºãã«å¦çã®æ°åãåºãç»é¢ãããï¼ãéå¶ã»ä¼æ¥ã®ç»é¢ 6806 * ï¼`isAutocaptureExcludedPath`ï¼ã¨å ±æãªã³ã¯ã»èªè¨¼ã®æ»ãå ã§ã¯åãããªãã 6807 */ 6808 6809 6810/** æ¼ããè¦ç´ ãå ¥åæ¬ï¼æåãæã¤ãã®ï¼ã¯å«ããªãã */ const AUTOCAPTURE_INTERACTIVE_SELECTOR = [ 6811 "a[href]", 6812 "button", 6813 '[role="button"]', 6814 '[role="link"]', 6815 '[role="menuitem"]', 6816 '[role="tab"]', 6817 '[role="option"]', 6818 '[role="switch"]', 6819 '[role="checkbox"]', 6820 '[role="radio"]', 6821 "summary", 6822 'input[type="button"]', 6823 'input[type="submit"]', 6824 'input[type="reset"]', 6825 'input[type="checkbox"]', 6826 'input[type="radio"]', 6827 "select" 6828].join(", "); 6829/** åºç»ãæç¤ºã®ååãæåªå ãç¡ããã°æå³ãæã¤å ¥ãç©ã */ const LANDMARK_SELECTOR = '[role="dialog"], dialog, nav, header, footer, aside, section, form, main'; 6830const EXPLICIT_AREA_SELECTOR = "[data-analytics-area]"; 6831const IGNORE_SELECTOR = "[data-analytics-ignore]"; 6832const JOB_ITEM_SELECTOR = "a[href], [data-analytics-job-id]"; 6833const OBSERVED_SELECTOR = `${JOB_ITEM_SELECTOR}, ${EXPLICIT_AREA_SELECTOR}`; 6834/** é¸ã¶è¦ç´ ï¼é·ç§»ããªãï¼ãé·ç§»å¾ ã¡ã«æ®ããªãã */ const CONTROL_ROLES = new Set([ 6835 "tab", 6836 "option", 6837 "switch", 6838 "checkbox", 6839 "radio" 6840]); 6841const CONTROL_INPUT_TYPES = new Set([ 6842 "checkbox", 6843 "radio" 6844]); 6845const AUTOCAPTURE_IMPRESSION_RATIO = 0.5; 6846const AUTOCAPTURE_IMPRESSION_MIN_MS = 1000; 6847const AUTOCAPTURE_IMPRESSION_FLUSH_MS = 1500; 6848/** 1 åã®è¡¨ç¤ºã§è¦å¼µãè¦ç´ ã®ä¸éï¼ç¡éã«ä¼¸ã³ãä¸è¦§ã§è¦å¼µããå¢ããç¶ããªãï¼ã */ const AUTOCAPTURE_MAX_OBSERVED = 400; 6849/** 1 åã®è¡¨ç¤ºã§æ®ãæ±äººã®è¡¨ç¤ºã®ä¸éã */ const AUTOCAPTURE_MAX_IMPRESSIONS_PER_PAGE = 300; 6850const STATIC_ID_RE = /^[A-Za-z][A-Za-z0-9_-]{1,40}$/; 6851const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; 6852function isBrowser() { 6853 return true && typeof document !== "undefined"; 6854} 6855function isCapturablePath(pathname) { 6856 return !(0,journey/* isAutocaptureExcludedPath */.P5)(pathname) && !(0,analytics/* isSensitiveAnalyticsPath */.GV)(pathname); 6857} 6858/** éç㪠`id`ï¼`useId` ã® `:r1:` ãæ°åã®ä¸¦ã¶ id ã¯åä½ãæãã®ã§ä½¿ããªãï¼ã */ function staticIdOf(element) { 6859 const id = element.getAttribute("id"); 6860 if (id && STATIC_ID_RE.test(id) && !/\d{3,}/.test(id)) return id; 6861 return null; 6862} 6863function landmarkTag(element) { 6864 if (element.getAttribute("role") === "dialog") return "dialog"; 6865 return element.tagName.toLowerCase(); 6866} 6867function landmarkName(element) { 6868 const tag = landmarkTag(element); 6869 const named = staticIdOf(element) ?? (0,journey/* sanitizeUiName */.hX)(element.getAttribute("data-testid")); 6870 if (named) return (0,journey/* sanitizeUiName */.hX)(`${tag}#${named}`) ?? tag; 6871 const selector = tag === "dialog" ? '[role="dialog"], dialog' : tag; 6872 const all = Array.from(document.querySelectorAll(selector)); 6873 const index = all.indexOf(element); 6874 return `${tag}[${index < 0 ? 0 : index}]`; 6875} 6876/** ãã®è¦ç´ ãã©ã®åºç»ã«å± ããã */ function resolveAutocaptureArea(element) { 6877 const explicit = element.closest(EXPLICIT_AREA_SELECTOR); 6878 if (explicit) { 6879 return { 6880 element: explicit, 6881 name: (0,journey/* sanitizeUiName */.hX)(explicit.getAttribute("data-analytics-area")) ?? "area" 6882 }; 6883 } 6884 const landmark = element.closest(LANDMARK_SELECTOR); 6885 if (landmark) return { 6886 element: landmark, 6887 name: landmarkName(landmark) 6888 }; 6889 return { 6890 element: document.body, 6891 name: "page" 6892 }; 6893} 6894/** æ¼ããè¦ç´ ã®ååãæç¤ºã®åå â æ¢åã® `data-track` â éç㪠id â è¦ç´ ã®ç¨®é¡ã */ function resolveElementKey(element) { 6895 const explicit = (0,journey/* sanitizeUiName */.hX)(element.getAttribute("data-analytics-id")) ?? (0,journey/* sanitizeUiName */.hX)(element.getAttribute("data-track")); 6896 if (explicit) return explicit; 6897 const tag = element.tagName.toLowerCase(); 6898 const id = staticIdOf(element); 6899 if (id) return (0,journey/* sanitizeUiName */.hX)(`${tag}#${id}`) ?? tag; 6900 const role = element.getAttribute("role"); 6901 const type = tag === "input" ? element.getAttribute("type") : null; 6902 const raw = `${tag}${role ? `[${role}]` : ""}${type ? `[${type}]` : ""}`; 6903 return (0,journey/* sanitizeUiName */.hX)(raw) ?? tag; 6904} 6905function readJobIdAttribute(element) { 6906 const raw = element.getAttribute("data-analytics-job-id"); 6907 return raw && UUID_RE.test(raw) ? raw.toLowerCase() : null; 6908} 6909function resolveHrefTarget(element) { 6910 if (!(element instanceof HTMLAnchorElement)) return null; 6911 const raw = element.getAttribute("href"); 6912 if (!raw || raw.startsWith("#")) return null; 6913 return (0,journey/* normalizeUiTarget */.nC)(element.href, window.location.origin); 6914} 6915/** ãã®è¦ç´ ãæãæ±äººï¼ãªã³ã¯ã®è¡ãå ãã`data-analytics-job-id`ï¼ã */ function resolveElementJobId(element) { 6916 const direct = readJobIdAttribute(element); 6917 if (direct) return direct; 6918 const target = resolveHrefTarget(element); 6919 if (target?.jobId) return target.jobId; 6920 const holder = element.closest("[data-analytics-job-id]"); 6921 return holder ? readJobIdAttribute(holder) : null; 6922} 6923/** åºç»ã®ä¸ã§ããã®æ±äººãä¸ããä½çªç®ãï¼0 å§ã¾ããåãæ±äººã®éè¤ã¯ 1 ã¤ã«æ°ããï¼ã */ function jobPositionInArea(area, jobId) { 6924 const seen = []; 6925 for (const node of Array.from(area.querySelectorAll(JOB_ITEM_SELECTOR))){ 6926 const id = resolveElementJobId(node); 6927 if (!id || seen.includes(id)) continue; 6928 seen.push(id); 6929 if (id === jobId) return seen.length - 1; 6930 } 6931 return null; 6932} 6933/** åºç»ã®ä¸ã§ãåãååã®è¦ç´ ã®ãã¡ä½çªç®ãï¼0 å§ã¾ãï¼ã */ function elementPositionInArea(area, element, key) { 6934 let index = 0; 6935 for (const node of Array.from(area.querySelectorAll(AUTOCAPTURE_INTERACTIVE_SELECTOR))){ 6936 if (node === element) return index; 6937 if (resolveElementKey(node) === key) index += 1; 6938 } 6939 return null; 6940} 6941/** 6942 * èªåè¨æ¸¬ãå§ãããè¿ãå¤ã® `stop` ã§å¤ãã2 åå¼ãã§ã 2 éã«ã¯ä»ããªãã 6943 */ let installed = null; 6944function installAnalyticsAutocapture() { 6945 if (installed) return installed; 6946 if (!isBrowser()) { 6947 return { 6948 stop: ()=>{}, 6949 flush: ()=>{} 6950 }; 6951 } 6952 const areaViews = new WeakMap(); 6953 const areaViewIdFor = (area, page)=>{ 6954 const existing = areaViews.get(area); 6955 if (existing && existing.pageViewId === page.pageViewId) return existing.areaViewId; 6956 const created = { 6957 pageViewId: page.pageViewId, 6958 areaViewId: (0,journey_context/* createJourneyUuid */.Y5)() 6959 }; 6960 areaViews.set(area, created); 6961 return created.areaViewId; 6962 }; 6963 /* ------------------------------ ã¯ãªã㯠------------------------------ */ const captureClick = (event)=>{ 6964 const pathname = window.location.pathname; 6965 if (!isCapturablePath(pathname)) return; 6966 const origin = event.target; 6967 if (!(origin instanceof Element)) return; 6968 const element = origin.closest(AUTOCAPTURE_INTERACTIVE_SELECTOR); 6969 if (!element || element.closest(IGNORE_SELECTOR)) return; 6970 if (event.type === "auxclick" && !(element instanceof HTMLAnchorElement)) return; 6971 const page = (0,journey_context/* getPageJourneyContext */.TQ)(); 6972 if (!page) return; 6973 const area = resolveAutocaptureArea(element); 6974 const areaViewId = areaViewIdFor(area.element, page); 6975 const clickId = (0,journey_context/* createJourneyUuid */.Y5)();
6976 const elementKey = resolveElementKey(element); 6977 const target = resolveHrefTarget(element); 6978 const jobId = resolveElementJobId(element); 6979 const role = element.getAttribute("role"); 6980 const inputType = element instanceof HTMLInputElement ? element.type : null; 6981 const isControl = element instanceof HTMLSelectElement || element.tagName.toLowerCase() === "summary" || role !== null && CONTROL_ROLES.has(role) || inputType !== null && CONTROL_INPUT_TYPES.has(inputType); 6982 const targetKind = target ? target.kind : isControl ? "control" : "button"; 6983 const position = jobId ? jobPositionInArea(area.element, jobId) : elementPositionInArea(area.element, element, elementKey); 6984 // ã¯ãªãã¯ã®æä¸ã«ç»é¢å´ãéãã¤ãã³ãï¼`card_click` / `surface_action` / 6985 // `apply_intent` â¦ï¼ã«ãåã `click_id` ãè¼ãããé éãçµãã£ããç³ãã 6986 (0,journey_context/* beginActiveClick */.Aj)({ 6987 clickId, 6988 areaViewId, 6989 at: Date.now() 6990 }); 6991 window.setTimeout(()=>(0,journey_context/* endActiveClick */.Al)(clickId), 0); 6992 void (0,analytics/* trackAnalyticsEvent */.KG)("ui_click", { 6993 click_id: clickId, 6994 area_view_id: areaViewId, 6995 page_view_id: page.pageViewId, 6996 ...page.journeyId ? { 6997 journey_id: page.journeyId 6998 } : {}, 6999 area: area.name, 7000 target_kind: targetKind, 7001 ...target?.kind === "link" ? { 7002 target_path: target.template 7003 } : {}, 7004 ...target?.kind === "external_link" ? { 7005 target_host: target.host 7006 } : {}, 7007 ...jobId ? { 7008 job_id: jobId 7009 } : {},
7010 element_key: elementKey, 7011 ...position !== null ? { 7012 position_index: position 7013 } : {} 7014 }); 7015 // é·ç§»ãããã¯ãªãã¯ã ãããé·ç§»å¾ ã¡ãã«æ®ããå¤ã®ãµã¤ãã¨é¸ã¶è¦ç´ ã¯æ®ããªãã 7016 const download = element instanceof HTMLAnchorElement && element.hasAttribute("download"); 7017 if (target?.kind === "link" && !download) { 7018 (0,journey_context/* recordJourneyPendingClick */.br)({ 7019 clickId, 7020 fromJourneyId: page.journeyId, 7021 sourcePath: page.pathname, 7022 targetPath: target.pathname, 7023 tabId: (0,journey_context/* getJourneyTabId */.bT)(), 7024 at: Date.now() 7025 }); 7026 } else if (targetKind === "button") { 7027 (0,journey_context/* recordJourneyPendingClick */.br)({ 7028 clickId, 7029 fromJourneyId: page.journeyId, 7030 sourcePath: page.pathname, 7031 targetPath: null, 7032 tabId: (0,journey_context/* getJourneyTabId */.bT)(), 7033 at: Date.now() 7034 }); 7035 } 7036 }; 7037 const handleAuxClick = (event)=>{ 7038 // ä¸ãã¿ã³ã§ãªã³ã¯ãæ°ããã¿ãã«éããã¨ãããã以å¤ã®ãã¿ã³ã¯æ¾ããªãã 7039 if (event.button !== 1) return; 7040 captureClick(event); 7041 }; 7042 /* ---------------------------- æ±äººã®è¡¨ç¤º ---------------------------- */ const supportsObserver = typeof window.IntersectionObserver === "function"; 7043 const batches = new Map(); 7044 const seenImpressions = new Set(); 7045 const timers = new Map(); 7046 const observed = new Set(); 7047 let flushTimer = null; 7048 let impressionCount = 0; 7049 const flushBatches = ()=>{ 7050 if (flushTimer !== null) { 7051 window.clearTimeout(flushTimer); 7052 flushTimer = null; 7053 } 7054 for (const [, batch] of batches){ 7055 if (!batch.items.length) continue; 7056 // åã®è¡¨ç¤ºã®åãéãã¨ããããã®è¡¨ç¤ºã®éµã§éãï¼éä¿¡å£ã®èªåã®éµããåªå ãããï¼ã 7057 void (0,analytics/* trackAnalyticsEvent */.KG)("ui_impression", { 7058 page_view_id: batch.page.pageViewId, 7059 area_view_id: batch.areaViewId, 7060 ...batch.page.journeyId ? { 7061 journey_id: batch.page.journeyId 7062 } : {}, 7063 area: batch.area, 7064 items: batch.items, 7065 item_count: batch.items.length 7066 }); 7067 } 7068 batches.clear(); 7069 }; 7070 const scheduleFlush = ()=>{ 7071 if (flushTimer !== null) return; 7072 flushTimer = window.setTimeout(flushBatches, AUTOCAPTURE_IMPRESSION_FLUSH_MS); 7073 }; 7074 /** ååãæã¤åºç»ãã®ãã®ã®è¡¨ç¤ºï¼1 åã®è¡¨ç¤ºã«ã¤ã 1 åï¼ã */ const recordAreaImpression = (element)=>{ 7075 if (!element.isConnected) return; 7076 if (!isCapturablePath(window.location.pathname)) return; 7077 if (element.closest(IGNORE_SELECTOR)) return; 7078 const name = (0,journey/* sanitizeUiName */.hX)(element.getAttribute("data-analytics-area")); 7079 if (!name) return; 7080 const page = (0,journey_context/* getPageJourneyContext */.TQ)(); 7081 if (!page) return; 7082 const areaViewId = areaViewIdFor(element, page); 7083 const key = `area:${areaViewId}`; 7084 if (seenImpressions.has(key)) return; 7085 seenImpressions.add(key); 7086 void (0,analytics/* trackAnalyticsEvent */.KG)("ui_impression", { 7087 page_view_id: page.pageViewId, 7088 area_view_id: areaViewId, 7089 ...page.journeyId ? { 7090 journey_id: page.journeyId 7091 } : {}, 7092 area: name, 7093 item_count: 0 7094 }); 7095 }; 7096 const recordImpression = (element)=>{ 7097 if (!element.isConnected) return; 7098 if (!isCapturablePath(window.location.pathname)) return; 7099 if (impressionCount >= AUTOCAPTURE_MAX_IMPRESSIONS_PER_PAGE) return; 7100 if (element.closest(IGNORE_SELECTOR)) return; 7101 const jobId = resolveElementJobId(element); 7102 if (!jobId) return; 7103 const page = (0,journey_context/* getPageJourneyContext */.TQ)(); 7104 if (!page) return; 7105 const area = resolveAutocaptureArea(element); 7106 const areaViewId = areaViewIdFor(area.element, page);
7107 const key = `${areaViewId}:${jobId}`; 7108 if (seenImpressions.has(key)) return; 7109 seenImpressions.add(key); 7110 impressionCount += 1; 7111 const position = jobPositionInArea(area.element, jobId); 7112 const batch = batches.get(areaViewId) ?? { 7113 area: area.name, 7114 areaViewId, 7115 page, 7116 items: [] 7117 }; 7118 batch.items.push(position === null ? { 7119 job_id: jobId 7120 } : { 7121 job_id: jobId, 7122 position_index: position 7123 }); 7124 batches.set(areaViewId, batch); 7125 if (batch.items.length >= 50) { 7126 flushBatches(); 7127 return; 7128 } 7129 scheduleFlush(); 7130 }; 7131 const clearTimer = (element)=>{ 7132 const timer = timers.get(element); 7133 if (timer !== undefined) { 7134 window.clearTimeout(timer); 7135 timers.delete(element); 7136 } 7137 }; 7138 const observer = supportsObserver ? new window.IntersectionObserver((entries)=>{ 7139 for (const entry of entries){ 7140 const element = entry.target; 7141 const isArea = element.matches(EXPLICIT_AREA_SELECTOR); 7142 // åºç»ã¯ç»é¢ããèãé«ããã¨ãããã®ã§ããç»é¢ã®åå以ä¸ãå ãããã§ãæ°ããã 7143 const visibleEnough = entry.isIntersecting && (entry.intersectionRatio >= AUTOCAPTURE_IMPRESSION_RATIO || isArea && entry.intersectionRect.height >= window.innerHeight * AUTOCAPTURE_IMPRESSION_RATIO); 7144 if (visibleEnough) { 7145 if (timers.has(element)) continue; 7146 timers.set(element, window.setTimeout(()=>{ 7147 timers.delete(element); 7148 if (element.matches(EXPLICIT_AREA_SELECTOR)) recordAreaImpression(element); 7149 if (resolveElementJobId(element)) recordImpression(element); 7150 }, AUTOCAPTURE_IMPRESSION_MIN_MS)); 7151 } else { 7152 clearTimer(element); 7153 } 7154 } 7155 }, { 7156 threshold: [ 7157 0, 7158 0.25, 7159 AUTOCAPTURE_IMPRESSION_RATIO, 7160 1 7161 ] 7162 }) : null; 7163 const observeJobItems = (root)=>{ 7164 if (!observer) return; 7165 if (!isCapturablePath(window.location.pathname)) return; 7166 const candidates = root instanceof Element && root.matches(OBSERVED_SELECTOR) ? [ 7167 root, 7168 ...Array.from(root.querySelectorAll(OBSERVED_SELECTOR)) 7169 ] : Array.from(root.querySelectorAll(OBSERVED_SELECTOR)); 7170 for (const element of candidates){ 7171 if (observed.size >= AUTOCAPTURE_MAX_OBSERVED) return; 7172 if (observed.has(element)) continue; 7173 if (!element.matches(EXPLICIT_AREA_SELECTOR) && !resolveElementJobId(element)) continue; 7174 observed.add(element); 7175 observer.observe(element); 7176 } 7177 }; 7178 let scanTimer = null; 7179 const pendingRoots = new Set(); 7180 const mutationObserver = observer && typeof window.MutationObserver === "function" ? new window.MutationObserver((records)=>{ 7181 for (const record of records){ 7182 for (const node of Array.from(record.addedNodes)){ 7183 if (node instanceof Element) pendingRoots.add(node); 7184 } 7185 } 7186 if (scanTimer !== null) return; 7187 scanTimer = window.setTimeout(()=>{ 7188 scanTimer = null; 7189 for (const root of pendingRoots)observeJobItems(root); 7190 pendingRoots.clear(); 7191 for (const element of Array.from(observed)){ 7192 if (!element.isConnected) { 7193 observer.unobserve(element); 7194 observed.delete(element); 7195 clearTimer(element); 7196 } 7197 } 7198 }, 250); 7199 }) : null; 7200 /** 7201 * è¦å¼µããä»ãç´ããIntersectionObserver ã¯è¦ãæ¹ãå¤ãã£ãã¨ãã«ããç¥ãããªãã®ã§ã 7202 * ä»ãç´ããªãã¨ãç»é¢ã«åºãã¾ã¾ã®è¦ç´ 㯠1 ç§ã測ãç´ãæ©ä¼ãæ¥ãªãï¼ä»ãç´ãã¨ã 7203 * ãã¾ã®è¦ãæ¹ã 1 度ç¥ããã¦ããï¼ã 7204 */ const reattachObserver = ()=>{ 7205 if (!observer) return; 7206 const current = Array.from(observed); 7207 observer.disconnect(); 7208 observed.clear(); 7209 for (const element of current){ 7210 if (element.isConnected) { 7211 observed.add(element); 7212 observer.observe(element); 7213 } 7214 } 7215 }; 7216 // 表示ãåãæ¿ãã£ãããåã®è¡¨ç¤ºã®åãéãåã£ã¦ããæ°ãç´ãã
7217 // è¦å¼µãã¯ä»ãç´ãï¼ä»ãç´ããªãã¨ãç»é¢ã«åºãã¾ã¾ã®è¦ç´ ã¯æ°ãã表示㧠1 åº¦ãæ°ããããªãï¼ã 7218 const unsubscribe = (0,journey_context/* subscribePageJourney */.Uf)(()=>{ 7219 flushBatches(); 7220 seenImpressions.clear(); 7221 impressionCount = 0; 7222 for (const element of Array.from(timers.keys()))clearTimer(element); 7223 reattachObserver(); 7224 }); 7225 /** 7226 * ã¿ããé ãããéãåããå¾ ã£ã¦ãã 1 ç§ãæ¨ã¦ãï¼SPEC-GVWYYJFA88ï¼ã1 ç§ã¯**åé¢ã§ç¶ãã¦** 7227 * è¦ããæéãªã®ã§ãæ®ãã¨é ãã¦ããããã ãæ»ã£ãç´å¾ã«çºç«ããç¶ã㦠1 ç§è¦ãã¦ããªã 7228 * æ±äººã¾ã§æ°ãããåé¢ã¸æ»ã£ããè¦å¼µããä»ãç´ãã0 ããæ¸¬ãç´ãã 7229 */ const handleHidden = ()=>{ 7230 if (document.visibilityState === "hidden") { 7231 flushBatches(); 7232 for (const element of Array.from(timers.keys()))clearTimer(element); 7233 return; 7234 } 7235 reattachObserver(); 7236 }; 7237 document.addEventListener("click", captureClick, true); 7238 document.addEventListener("auxclick", handleAuxClick, true); 7239 document.addEventListener("visibilitychange", handleHidden); 7240 window.addEventListener("pagehide", flushBatches); 7241 if (observer && document.body) { 7242 observeJobItems(document); 7243 mutationObserver?.observe(document.body, { 7244 childList: true, 7245 subtree: true 7246 }); 7247 } 7248 const controller = { 7249 flush: flushBatches, 7250 stop: ()=>{ 7251 flushBatches(); 7252 document.removeEventListener("click", captureClick, true); 7253 document.removeEventListener("auxclick", handleAuxClick, true); 7254 document.removeEventListener("visibilitychange", handleHidden); 7255 window.removeEventListener("pagehide", flushBatches); 7256 unsubscribe(); 7257 mutationObserver?.disconnect(); 7258 observer?.disconnect(); 7259 for (const element of Array.from(timers.keys()))clearTimer(element); 7260 if (scanTimer !== null) window.clearTimeout(scanTimer); 7261 observed.clear(); 7262 installed = null; 7263 } 7264 }; 7265 installed = controller; 7266 return controller; 7267} 7268 7269;// ./lib/auth/auth-fetch.ts 7270let patched = false; 7271const CSRF_COOKIE = "csrf_token"; 7272const CSRF_HEADER = "x-csrf-token"; 7273const SAFE_METHODS = new Set([ 7274 "GET", 7275 "HEAD", 7276 "OPTIONS" 7277]); 7278const shouldSkipAuth = (url)=>{ 7279 if (url.pathname.startsWith("/api/track")) return true; 7280 if (url.pathname.startsWith("/api/auth/signin")) return true; 7281 return false; 7282}; 7283const readCookie = (name)=>{ 7284 if (typeof document === "undefined") return null; 7285 const pairs = document.cookie ? document.cookie.split(";") : []; 7286 for (const pair of pairs){ 7287 const [rawKey, ...rest] = pair.trim().split("="); 7288 if (!rawKey) continue; 7289 if (rawKey === name) { 7290 return decodeURIComponent(rest.join("=")); 7291 } 7292 } 7293 return null; 7294}; 7295function initAuthFetch() { 7296 if (false) {} 7297 if (patched) return; 7298 patched = true; 7299 const originalFetch = window.fetch.bind(window); 7300 window.fetch = async (input, init)=>{ 7301 const url = input instanceof Request ? new URL(input.url, window.location.origin) : new URL(input.toString(), window.location.origin); 7302 if (url.origin !== window.location.origin || shouldSkipAuth(url)) { 7303 return originalFetch(input, init); 7304 } 7305 const baseHeaders = init?.headers ?? (input instanceof Request ? input.headers : undefined); 7306 const headers = new Headers(baseHeaders); 7307 const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase(); 7308 if (!SAFE_METHODS.has(method)) { 7309 const csrf = readCookie(CSRF_COOKIE); 7310 if (csrf && !headers.has(CSRF_HEADER) && !headers.has(CSRF_HEADER.toUpperCase())) { 7311 headers.set(CSRF_HEADER, csrf); 7312 } 7313 } 7314 // Let the browser set the multipart boundary for FormData. 7315 if (init?.body instanceof FormData) { 7316 headers.delete("content-type"); 7317 headers.delete("Content-Type"); 7318 } 7319 return originalFetch(input, { 7320 ...init, 7321 headers 7322 }); 7323 }; 7324} 7325 7326;// ./lib/auth/csrf-fetch.ts 7327let csrf_fetch_patched = false;
7328const csrf_fetch_CSRF_COOKIE = "csrf_token"; 7329const csrf_fetch_CSRF_HEADER = "x-csrf-token"; 7330const csrf_fetch_SAFE_METHODS = new Set([ 7331 "GET", 7332 "HEAD", 7333 "OPTIONS" 7334]); 7335const csrf_fetch_readCookie = (name)=>{ 7336 if (typeof document === "undefined") return null; 7337 const pairs = document.cookie ? document.cookie.split(";") : []; 7338 for (const pair of pairs){ 7339 const [rawKey, ...rest] = pair.trim().split("="); 7340 if (!rawKey) continue; 7341 if (rawKey === name) { 7342 return decodeURIComponent(rest.join("=")); 7343 } 7344 } 7345 return null; 7346}; 7347function initCsrfFetch() { 7348 if (false) {} 7349 if (csrf_fetch_patched) return; 7350 csrf_fetch_patched = true; 7351 const originalFetch = window.fetch.bind(window); 7352 window.fetch = async (input, init)=>{ 7353 const url = input instanceof Request ? new URL(input.url, window.location.origin) : new URL(input.toString(), window.location.origin); 7354 if (url.origin !== window.location.origin) { 7355 return originalFetch(input, init); 7356 } 7357 const baseHeaders = init?.headers ?? (input instanceof Request ? input.headers : undefined); 7358 const headers = new Headers(baseHeaders); 7359 const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase(); 7360 if (!csrf_fetch_SAFE_METHODS.has(method)) { 7361 const token = csrf_fetch_readCookie(csrf_fetch_CSRF_COOKIE); 7362 if (token && !headers.has(csrf_fetch_CSRF_HEADER) && !headers.has(csrf_fetch_CSRF_HEADER.toUpperCase())) { 7363 headers.set(csrf_fetch_CSRF_HEADER, token); 7364 } 7365 } 7366 if (init?.body instanceof FormData) { 7367 headers.delete("content-type"); 7368 headers.delete("Content-Type"); 7369 } 7370 return originalFetch(input, { 7371 ...init, 7372 headers 7373 }); 7374 }; 7375} 7376 7377// EXTERNAL MODULE: ./lib/security/trusted-types.ts 7378var trusted_types = __webpack_require__(2594); 7379// EXTERNAL MODULE: ./lib/security/csrf-client.ts 7380var csrf_client = __webpack_require__(23147); 7381;// ./lib/hooks/use-nattoku-dimension-sync.ts 7382/* __next_internal_client_entry_do_not_use__ useNattokuDimensionSync auto */ 7383 7384 7385const SYNC_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4æé 7386const logger = (0,src/* createConsoleLogger */.cS)({ 7387 module: "nattoku/dimension-sync" 7388}); 7389/** 7390 * ã¦ã¼ã¶ã¼å±æ§ãã£ã¡ã³ã·ã§ã³ï¼nattoku_user_dimensionsï¼ãåæããã 7391 * 4æé以å ã«åææ¸ã¿ãªãã¹ããããã¦ã¼ã¶ã¼åä½ã®ãã¼ã§ç®¡çã 7392 * best-effort: 失æãã¦ããã°åºåã®ã¿ãUI ããããã¯ããªãã 7393 */ function useNattokuDimensionSync(userId) { 7394 (0,react.useEffect)(()=>{ 7395 if (!userId) return; 7396 (async ()=>{ 7397 try { 7398 const key = `nattoku_dim_last_sync:${userId}`; 7399 const lastSync = localStorage.getItem(key); 7400 if (lastSync && Date.now() - Number(lastSync) < SYNC_INTERVAL_MS) { 7401 return; 7402 } 7403 const response = await fetch("/api/student/nattoku/sync", { 7404 method: "POST", 7405 headers: (0,csrf_client/* csrfHeaders */.lJ)(), 7406 cache: "no-store" 7407 }); 7408 if (!response.ok) { 7409 logger.warn("nattoku dimension sync request failed", { 7410 status: response.status 7411 }); 7412 return; 7413 } 7414 const payload = await response.json(); 7415 if (!payload || typeof payload !== "object" || payload.synced !== true) { 7416 logger.warn("nattoku dimension sync unavailable"); 7417 return; 7418 } 7419 localStorage.setItem(key, String(Date.now())); 7420 } catch (e) { 7421 logger.warn("nattoku dimension sync failed", { 7422 message: e instanceof Error ? e.message : "unknown_error" 7423 }); 7424 } 7425 })(); 7426 }, [ 7427 userId 7428 ]); 7429} 7430 7431// EXTERNAL MODULE: ./lib/match-invite/letter-bridge.ts 7432var letter_bridge = __webpack_require__(15284); 7433// EXTERNAL MODULE: ./lib/student-popups/visit-gate.ts 7434var visit_gate = __webpack_require__(27963); 7435;// ./app/providers.tsx 7436/* __next_internal_client_entry_do_not_use__ default auto */ 7437 7438// `usePathname()` 㯠dynamic API ã§ã¯ãªãã®ã§ SSR ãæ¢ããªãã 7439// éé¿ãèµ·ããã®ã¯ `useSearchParams()` ã®æ¹ã§ããã¡ã㯠RouteAnalyticsTracker ãæã¤ã 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456initCsrfFetch(); 7457initAuthFetch(); 7458(0,trusted_types/* ensureDefaultTrustedTypesPolicy */.k_)(); 7459/** AuthProvider å ã§ useAuth ãå¼ã¶ããã®ã©ããã¼ã³ã³ãã¼ãã³ã */ function NattokuDimensionSyncInner() { 7460 const { user } = (0,auth_context/* useAuth */.As)(); 7461 useNattokuDimensionSync(user?.id ?? null); 7462 return null; 7463} 7464/** 7465 * Global React providers (Supabase auth listener + Sonner toaster UI) 7466 */ function Providers({ children, initialAuthStatus, initialAuthRole }) { 7467 /* ------------------------------------------------------------- 7468 ç»é¢é·ç§»ãã¨ã®è¨æ¸¬ã¯ RouteAnalyticsTrackerï¼èã³ã³ãã¼ãã³ãï¼ã¸ç§»ããã 7469 ããã§ `useSearchParams()` ãå¼ã¶ã¨ãlayout ã® Suspense å¢çã¾ã§ã
7469 7470 ã¯ã©ã¤ã¢ã³ãæç»ã¸éé¿ããå ¨ãã¼ã¸ã®æ¬æã HTML ã«åºãªããªãããã 7471 ------------------------------------------------------------- */ const pathname = (0,navigation.usePathname)(); 7472 const trackingBootstrappedRef = (0,react.useRef)(false); 7473 (0,react.useEffect)(()=>{ 7474 if ( true && (0,analytics/* isSensitiveAnalyticsPath */.GV)(window.location.pathname)) return; 7475 if (trackingBootstrappedRef.current) return; 7476 trackingBootstrappedRef.current = true; 7477 try { 7478 (0,utm/* ensureUtmFromLocation */.mp)(); 7479 (0,tracking/* getTrackingSnapshot */.a)(); 7480 } catch (error) { 7481 console.warn("[tracking] bootstrap failed", error); 7482 } 7483 }, []); 7484 // çå°ããé¢ãããã¨ãè¨é²ããï¼SPEC-2FC372V3R3 REQ-02ï¼ã 7485 // ä»åããããã¢ãããåºãã¦ããã®ã¯ããã®è¨ªåã®çå°ãã¼ã¸ãã ãã§ãçå°ã決ããã®ã¯ 7486 // `StudentShell` å´ããã ãå¦çã¬ã¤ã¢ã¦ãã®å¤ï¼`/media` ã®ãããªå ¬éãã¼ã¸ï¼ã¸ç§»ã㨠7487 // ãã® shell ãå¤ãããããåããå´ããã¯é·ç§»ã 1 度ã観測ã§ããªããè¨é²ããã
7487ªãã¾ã¾ 7488 // æ»ã£ã¦ããã¨çå°ã«å± ããã¨ã«ãªãã䏿¹éè¡ãç ´ããï¼Codex ã¬ãã¥ã¼ 2026-09-16ï¼ã 7489 // ããã¯ã¢ããªå ¨ä½ã§å¸¸ã«è¼ã£ã¦ããã®ã§ãé¢è±ã ããæ¾ããçå°ã¯æ±ºããªã 7490 // ï¼ãã°ã¤ã³ç»é¢ã®ãããªãä»åããåºããªãé¢ãçå°ã«åºå®ããªãããï¼ã 7491 (0,react.useEffect)(()=>{ 7492 (0,visit_gate/* observeLandingLeave */.hW)(pathname ?? null); 7493 // 診æã®æç´ã®æ±äººããã就活管ç以å¤ã¸ç§»ã£ããããããã®å°ï¼å¥æ© Bï¼ãæ¨ã¦ã 7494 // ï¼SPEC-C0AMWPMX5Bï¼ãæ±äººè©³ç´°ã¯å¦çã¬ã¤ã¢ã¦ãã®å¤ãªã®ã§ãããã§è¦ãã 7495 (0,letter_bridge/* observeImadokoLetterReturnPath */.ij)(pathname ?? null); 7496 }, [ 7497 pathname 7498 ]); 7499 (0,react.useEffect)(()=>{ 7500 const tracker = (0,src/* createAnalyticsEngagementTracker */.oB)({ 7501 track: (eventName, props)=>{ 7502 void (0,analytics/* trackAnalyticsEvent */.KG)(eventName, props); 7503 } 7504 }); 7505 return tracker.start(); 7506 }, []); 7507 // SPEC-FTV8N7CCZ0: ã¯ãªãã¯ã¨æ±äººã®è¡¨ç¤ºããç»é¢ãã¨ã«æ¸ããªãã¦ãæ®ãã 7508 // ç·ã®éµï¼è¡¨ç¤ºã»ã¯ãªãã¯ã»ç·ï¼ã¯éä¿¡å£ãå ¨ã¤ãã³ãã¸è¼ããã®ã§ãããã¯ä»ããã ãã 7509 (0,react.useEffect)(()=>{ 7510 const autocapture = installAnalyticsAutocapture(); 7511 return ()=>autocapture.stop(); 7512 }, []); 7513 (0,react.useEffect)(()=>{ 7514 const tracker = (0,src/* createAnalyticsPerformanceTracker */.pA)({ 7515 track: (eventName, props)=>{ 7516 void (0,analytics/* trackAnalyticsEvent */.KG)(eventName, props); 7517 } 7518 }); 7519 return tracker.start(); 7520 }, []); 7521 return /*#__PURE__*/ (0,jsx_runtime.jsxs)(auth_context/* AuthProvider */.OJ, { 7522 initialStatus: initialAuthStatus, 7523 initialRole: initialAuthRole, 7524 syncing: false, 7525 children: [ 7526 /*#__PURE__*/ (0,jsx_runtime.jsx)(NattokuDimensionSyncInner, {}), 7527 /*#__PURE__*/ (0,jsx_runtime.jsx)(react.Suspense, { 7528 fallback: null, 7529 children: /*#__PURE__*/ (0,jsx_runtime.jsx)(RouteAnalyticsTracker, {}) 7530 }), 7531 children, 7532 /*#__PURE__*/ (0,jsx_runtime.jsx)(Toaster, {}) 7533 ] 7534 }); 7535} 7536 7537 7538/***/ }), 7539 7540/***/ 50065: 7541/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 7542 7543"use strict"; 7544/* harmony export */ __webpack_require__.d(__webpack_exports__, { 7545/* harmony export */ F: () => (/* binding */ ScrollArea) 7546/* harmony export */ }); 7547/* unused harmony export ScrollBar */ 7548/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10335); 7549/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82071); 7550/* harmony import */ var _radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60103); 7551/* harmony import */ var _lib_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(86537); 7552/* __next_internal_client_entry_do_not_use__ ScrollArea,ScrollBar auto */ 7553 7554 7555 7556const ScrollArea = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, children, ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .Root */ .bL, { 7557 ref: ref, 7558 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)("relative overflow-hidden", className), 7559 ...props, 7560 children: [ 7561 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .Viewport */ .LM, { 7562 className: "h-full w-full rounded-[inherit]", 7563 children: children 7564 }), 7565 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ScrollBar, {}), 7566 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .Corner */ .OK, {}) 7567 ] 7568 })); 7569ScrollArea.displayName = _radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .Root */ .bL.displayName; 7570const ScrollBar = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_1__.forwardRef(({ className, orientation = "vertical", ...props }, ref)=>/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .ScrollAreaScrollbar */ .VM, { 7571 ref: ref, 7572 orientation: orientation, 7573 className: (0,_lib_utils__WEBPACK_IMPORTED_MODULE_3__.cn)("flex touch-none select-none transition-colors", orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]", orientation === "horizontal" && "h-2.5 border-t border-t-transparent p-[1px]", className), 7574 ...props, 7575 children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .ScrollAreaThumb */ .lr, { 7576 className: "relative flex-1 rounded-full bg-border" 7577 }) 7578 })); 7579ScrollBar.displayName = _radix_ui_react_scroll_area__WEBPACK_IMPORTED_MODULE_2__/* .ScrollAreaScrollbar */ .VM.displayName; 7580 7581 7582 7583/***/ }), 7584 7585/***/ 56119: 7586/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 7587 7588"use strict"; 7589/* harmony export */ __webpack_require__.d(__webpack_exports__, { 7590/* harmony export */ MU: () => (/* binding */ formatDateLabelFromYmd), 7591/* harmony export */ R1: () => (/* binding */ startOfToday), 7592/* harmony export */ VW: () => (/* binding */ millisecondsUntilNextJstDate), 7593/* harmony export */ _s: () => (/* binding */ formatYmd), 7594/* harmony export */ lo: () => (/* binding */ toJstYmd), 7595/* harmony export */ n4: () => (/* binding */ diffCalendarDays), 7596/* harmony export */ wl: () => (/* binding */ pad2) 7597/* harmony export */ }); 7598/* unused harmony exports addDays, addMonths, endOfMonth, getCalendarMonthDays, formatMonthLabel, isDateInRange, weekdayLabel, DEADLINE_URGENCY_CHIP_CLASS, DEADLINE_URGENCY_DATE_CLASS, DEADLINE_URGENCY_ACCENT_CLASS */ 7599const startOfToday = ()=>{ 7600 const d = new Date(); 7601 d.setHours(0, 0, 0, 0); 7602 return d; 7603}; 7604const pad2 = (value)=>String(value).padStart(2, "0"); 7605const formatYmd = (date)=>`${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`; 7606const addDays = (date, days)=>{ 7607 const next = new Date(date); 7608 next.setDate(date.getDate() + days); 7609 return next; 7610}; 7611const addMonths = (date, months)=>new Date(date.getFullYear(), date.getMonth() + months, 1); 7612const endOfMonth = (date)=>new Date(date.getFullYear(), date.getMonth() + 1, 0); 7613const getCalendarMonthDays = (month)=>{ 7614 const firstDay = new Date(month.getFullYear(), month.getMonth(), 1); 7615 const gridStart = new Date(firstDay); 7616 gridStart.setDate(firstDay.getDate() - firstDay.getDay()); 7617 return Array.from({ 7618 length: 42 7619 }, (_, index)=>{ 7620 const date = new Date(gridStart); 7621 date.setDate(gridStart.getDate() + index); 7622 return date; 7623 }); 7624}; 7625const formatMonthLabel = (date)=>`${date.getFullYear()}å¹´${date.getMonth() + 1}æ`; 7626const isDateInRange = (date, start, end)=>date.getTime() >= start.getTime() && date.getTime() <= end.getTime(); 7627const weekdayLabel = (date)=>{ 7628 const days = [ 7629 "æ¥", 7630 "æ", 7631 "ç«", 7632 "æ°´", 7633 "æ¨", 7634 "é", 7635 "å" 7636 ]; 7637 return days[date.getDay()]; 7638}; 7639const formatDateLabelFromYmd = (ymd)=>{ 7640 if (!ymd) return ""; 7641 const d = new Date(`${ymd}T00:00:00`); 7642 if (Number.isNaN(d.getTime())) return ymd; 7643 return `${pad2(d.getMonth() + 1)}/${pad2(d.getDate())}ï¼${weekdayLabel(d)}ï¼`; 7644}; 7645const JST_OFFSET_MS = 9 * 60 * 60 * 1000; 7646const DAY_MS = 24 * 60 * 60 * 1000; 7647const YMD_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/; 7648/** å®è¡ç°å¢ã®timezoneã«ä¾åãããç¬éãJSTã®æ¦æ¥ã¸å¤æããã */ const toJstYmd = (instant)=>{ 7649 const shifted = new Date(instant.getTime() + JST_OFFSET_MS); 7650 return `${shifted.getUTCFullYear()}
7650-${String(shifted.getUTCMonth() + 1).padStart(2, "0")}-${String(shifted.getUTCDate()).padStart(2, "0")}`; 7651}; 7652/** ç¾å¨æå»ããæ¬¡ã®JSTæ¥ä»å¢çã¾ã§ã®å¾ æ©æéãJSTã¯DSTãç¡ãããåºå®ãªãã»ããã§æ±ããã */ const millisecondsUntilNextJstDate = (instant)=>{ 7653 const shifted = new Date(instant.getTime() + JST_OFFSET_MS); 7654 const nextJstMidnightUtc = Date.UTC(shifted.getUTCFullYear(), shifted.getUTCMonth(), shifted.getUTCDate() + 1) - JST_OFFSET_MS; 7655 return nextJstMidnightUtc - instant.getTime(); 7656}; 7657const ymdToUtcMs = (key)=>{ 7658 const matched = YMD_PATTERN.exec(key); 7659 if (!matched) return null; 7660 const year = Number(matched[1]); 7661 const month = Number(matched[2]); 7662 const day = Number(matched[3]); 7663 if (month < 1 || month > 12 || day < 1 || day > 31) return null; 7664 const ms = Date.UTC(year, month - 1, day); 7665 const roundTrip = new Date(ms); 7666 if (roundTrip.getUTCMonth() !== month - 1 || roundTrip.getUTCDate() !== day) { 7667 return null; 7668 } 7669 return ms; 7670}; 7671/** JSTæ¦æ¥å士ã®å·®ã0ã¯å½æ¥ã1ã¯ç¿æ¥ãè² å¤ã¯éå»ã示ãã */ const diffCalendarDays = (targetYmd, todayYmd)=>{ 7672 const target = ymdToUtcMs(targetYmd); 7673 const today = ymdToUtcMs(todayYmd); 7674 if (target === null || today === null) return null; 7675 return Math.round((target - today) / DAY_MS); 7676}; 7677const DEADLINE_URGENCY_CHIP_CLASS = { 7678 today: "border-[#e02424] bg-[#e02424] text-[#ffffff]", 7679 tomorrow: "border-[#ff4b4b] bg-[#fff1f1] text-[#c81e1e]", 7680 soon: "border-[#fbbf24] bg-[#fef3c7] text-[#92400e]", 7681 week: "border-[#cbd5e1] bg-[#f1f5f9] text-[#334155]", 7682 later: "border-[#e8edf4] bg-[#ffffff] text-[#64748b]", 7683 past: "border-dashed border-[#d1d5db] bg-[#f9fafb] text-[#6b7280]" 7684}; 7685const DEADLINE_URGENCY_DATE_CLASS = { 7686 today: "text-[#c81e1e]", 7687 tomorrow: "text-[#c81e1e]", 7688 soon: "text-[#b45309]", 7689 week: "text-[#334155]", 7690 later: "text-[#64748b]", 7691 past: "text-[#6b7280]" 7692}; 7693const DEADLINE_URGENCY_ACCENT_CLASS = { 7694 today: "border-l-[3px] border-l-[#e02424]", 7695 tomorrow: "border-l-[3px] border-l-[#ffb3b3]", 7696 soon: "border-l-[3px] border-l-[#fbbf24]", 7697 week: "border-l-[3px] border-l-[#cbd5e1]", 7698 later: "border-l-[3px] border-l-transparent", 7699 past: "border-l-[3px] border-l-[#d1d5db]" 7700}; 7701 7702 7703/***/ }), 7704 7705/***/ 74685: 7706/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 7707 7708"use strict"; 7709/* harmony export */ __webpack_require__.d(__webpack_exports__, { 7710/* harmony export */ "default": () => (/* binding */ ImpersonationBanner) 7711/* harmony export */ }); 7712/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10335); 7713/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82071); 7714/* harmony import */ var _barrel_optimize_names_UserCheck_lucide_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(61224); 7715/* harmony import */ var _components_ui_button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27962); 7716/* harmony import */ var _lib_security_csrf_client__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(23147); 7717/* __next_internal_client_entry_do_not_use__ default auto */ 7718 7719 7720 7721 7722function ImpersonationBanner({ active }) { 7723 const [pending, setPending] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false); 7724 const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null); 7725 const handleExit = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async ()=>{ 7726 if (pending) return; 7727 setPending(true); 7728 setError(null); 7729 try { 7730 const res = await fetch("/api/admin/exit-impersonate", { 7731 method: "POST", 7732 credentials: "include", 7733 headers: (0,_lib_security_csrf_client__WEBPACK_IMPORTED_MODULE_3__/* .csrfHeaders */ .lJ)() 7734 }); 7735 if (res.status === 403) { 7736 setError(_lib_security_csrf_client__WEBPACK_IMPORTED_MODULE_3__/* .CSRF_RELOAD_MESSAGE */ .vJ); 7737 return; 7738 } 7739 const payload = await res.json().catch(()=>null); 7740 if (!res.ok) { 7741 setError("ãªããã¾ãã®çµäºã«å¤±æãã¾ããããã¼ã¸ãåèªã¿è¾¼ã¿ãã¦ãã ããã"); 7742 return; 7743 } 7744 window.location.href = payload?.redirectTo ?? "/admin/login"; 7745 } catch { 7746 setError("ãªããã¾ãã®çµäºã«å¤±æãã¾ããããã¼ã¸ãåèªã¿è¾¼ã¿ãã¦ãã ããã"); 7747 } finally{ 7748 setPending(false); 7749 } 7750 }, [ 7751 pending 7752 ]); 7753 // ãªããã¾ãä¸ã§ãªãã¨ã㯠DOM ã«ä½ãåºããªãï¼ç©ºã
7753®ãªã¼ãã¼ã¬ã¤ãä½ããªãï¼ã 7754 if (!active) return null; 7755 return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", { 7756 role: "status", 7757 className: "flex w-full flex-col gap-2 border-b border-amber-300 bg-amber-100 px-4 py-2 text-sm text-amber-900 sm:flex-row sm:items-center sm:justify-between", 7758 children: [ 7759 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", { 7760 className: "flex items-center gap-2", 7761 children: [ 7762 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_barrel_optimize_names_UserCheck_lucide_react__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A, { 7763 className: "h-4 w-4 shrink-0", 7764 "aria-hidden": "true" 7765 }), 7766 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span", { 7767 children: "管çè ã¨ãã¦å¥ã®ã¦ã¼ã¶ã¼ã®ç»é¢ã表示ãã¦ãã¾ãããã®éããã®ãã©ã¦ã¶ã®ç®¡çè ã»ãã·ã§ã³ã¯ 䏿¸ãããã¦ãã¾ããçµäºããã¨ç®¡çè ãã°ã¤ã³ããããç´ãã«ãªãã¾ãã" 7768 }) 7769 ] 7770 }), 7771 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div", { 7772 className: "flex shrink-0 items-center gap-3", 7773 children: [ 7774 error ? /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span", { 7775 className: "text-xs text-red-700", 7776 children: error 7777 }) : null, 7778 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_button__WEBPACK_IMPORTED_MODULE_2__/* .Button */ .$, { 7779 type: "button", 7780 size: "sm", 7781 variant: "outline", 7782 className: "border-amber-400 bg-white/90", 7783 onClick: handleExit, 7784 disabled: pending, 7785 children: pending ? "çµäºãã¦ãã¾ãâ¦" : "çµäºãã¦ç®¡çè ãã°ã¤ã³ã¸" 7786 }) 7787 ] 7788 }) 7789 ] 7790 }); 7791} 7792 7793 7794/***/ }), 7795 7796/***/ 83099: 7797/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 7798 7799"use strict"; 7800/* harmony export */ __webpack_require__.d(__webpack_exports__, { 7801/* harmony export */ Dn: () => (/* binding */ KANRILP_OAUTH_POPUP_CLOSED_ERROR_CODE), 7802/* harmony export */ Gi: () => (/* reexport safe */ _hei_shared_src_gmail_oauth_error_codes__WEBPACK_IMPORTED_MODULE_0__.Jj), 7803/* harmony export */ dz: () => (/* reexport safe */ _hei_shared_src_gmail_oauth_error_codes__WEBPACK_IMPORTED_MODULE_0__.dz), 7804/* harmony export */ h2: () => (/* reexport safe */ _hei_shared_src_gmail_oauth_error_codes__WEBPACK_IMPORTED_MODULE_0__.W2), 7805/* harmony export */ re: () => (/* binding */ KANRILP_OAUTH_TIMEOUT_ERROR_CODE) 7806/* harmony export */ }); 7807/* harmony import */ var _hei_shared_src_gmail_oauth_error_codes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59940); 7808/** 7809 * SPEC-9649 / TASK-9766: Gmail 飿ºã®å¤±æçç±ã³ã¼ãã®åãå´ allowlistï¼re-export shimï¼ã 7810 * 7811 * æ£æ¬ã¯ `@hei/shared/src/gmail/oauth-error-codes`ãapps/web_ipo 㨠apps/mobile ãåã 7812 * ã³ã¼ããåãåããã`apps/* éã®ç´æ¥ import ã¯ç¦æ¢`ãªã®ã§ããããã¯åç §ã§ããªãã 7813 * TASK-9765 ã§ `gmail_read_scope_denied` ãè¶³ããã¨ã 3 ç®æã¸æã§è¶³ãå¿ è¦ããã£ãã
7813®ã§ã 7814 * ã³ãã¼ãå¢ããåã«èªå½ã 1 ç®æã¸å¯ããï¼TASK-9766ï¼ã 7815 * 7816 * ãã®ãã¡ã¤ã«ã¯**ååãä¿ã¤ããã ã**ã«åå¨ãããapps/web ã®æ¢å import ã¨å¥ç´ãã¹ãã 7817 * `KANRILP_*` ã®ååã§åç §ãã¦ãããããå ±æåã¨ã®å¯¾å¿ãããã§ä»ããã 7818 * å®è£ ãã¸ãã¯ã¯ç½®ããªãï¼`apps/web/lib/gmail/*` ã `@hei/gmail-sync` ã«å¯¾ã㦠7819 * æ¡ã£ã¦ããã®ã¨åã shim æ¹éï¼ã 7820 */ 7821/** 7822 * ãã¼ãä¸éã¾ã§å¾ ã£ã¦ã飿ºå®äºã観測ã§ããªãã£ãã¨ãã®çç±ã³ã¼ãã 7823 * 7824 * ãµã¼ãã¯ä½ãè¿ãã¦ããªãï¼å¦çã Google ã®ç»é¢ãæ¾ç½®ãã / å¥ã®ä½æ¥ã«ç§»ã£ãï¼ã 7825 * `email_error` ã¨ã¯å¥ç³»çµ±ãªã®ã§ `KANRILP_OAUTH_ERROR_CODES` ã«ã¯å ¥ããªãã 7826 * ãããã¢ãããæç¤ºçã«éããå ´åã¯ä¸ã® `KANRILP_OAUTH_POPUP_CLOSED_ERROR_CODE`ã 7827 * 7828 * **å ±æå´ã¸ç§»ãã¦ããªãã** kanrilp ã®ãããã¢ãã flow ã ããæã¤ã¯ã©ã¤ã¢ã³ãå´ã® 7829 * çµç«¯çç±ã§ãweb_ipo ã«ã mobile ã«ããã® flow ãç¡ããæ¶è²»è ã®ããªãå¤ã§å ±æé¢ãåºããªãã 7830 */ const KANRILP_OAUTH_TIMEOUT_ERROR_CODE = "oauth_timeout"; 7831/** 7832 * SPEC-9701 / TASK-9715: ãã®ç»é¢ãéãã飿ºãããã¢ãããéããããã¨ãã®çç±ã³ã¼ãã 7833 * 7834 * `oauth_timeout` ã¨åãã¦æã¤ãåè ã¯ããã¼ãä¸éã¾ã§å¾ ã£ã¦ãå®äºã観測ã§ããªãã£ããã§ã 7835 * ãã¡ãã¯ãå¦çãæç¤ºçã«ãããããåãã³ã¼ãã«ç³ãã¨ãå¾ æ©çªã伸ã°ãã广 7836 * ï¼ï¼å¾ ã¡ãããªãã£ãäººãæ¸ã£ããï¼ã測ããªãã 7837 * 7838 * ãµã¼ãã¯ä½ãè¿ãã¦ããªãã®ã§ `KANRILP_OAUTH_ERROR_CODES`ï¼`email_error` ç³»ï¼ã«ã¯å ¥ããªãã 7839 * ä¸ã¨åãçç±ã§å ±æå´ã¸ã¯ç§»ãã¦ããªãã 7840 */ const KANRILP_OAUTH_POPUP_CLOSED_ERROR_CODE = "oauth_popup_closed"; 7841 7842 7843/***/ }), 7844 7845/***/ 87356: 7846/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 7847 7848"use strict"; 7849 7850// EXPORTS 7851__webpack_require__.d(__webpack_exports__, { 7852 a: () => (/* binding */ getTrackingSnapshot) 7853}); 7854 7855// UNUSED EXPORTS: resolveCampaignCapturedAt 7856 7857// EXTERNAL MODULE: ./utils/utm.ts 7858var utm = __webpack_require__(45386); 7859// EXTERNAL MODULE: ../../packages/shared/src/index.ts + 27 modules 7860var src = __webpack_require__(70020); 7861;// ./lib/tracking/cookies.ts 7862 7863 7864// EXTERNAL MODULE: ./lib/es-share/constants.ts 7865var constants = __webpack_require__(18116); 7866;// ./utils/tracking.ts 7867 7868 7869 7870 7871const SESSION_STORAGE_KEY = "gkt_session_id"; 7872const VISIT_SENT_KEY = "gkt_visit_sent"; 7873const VISIT_TTL_MS = 6 * 60 * 60 * 1000; 7874function isBrowser() { 7875 return true && typeof document !== "undefined"; 7876} 7877function isSensitiveTrackingPath(pathname) { 7878 return typeof pathname === "string" && pathname.startsWith(constants/* ES_SHARE_PATH_PREFIX */.mL); 7879} 7880function isSensitiveTrackingUrl(value) { 7881 if (!value || !isBrowser()) return false; 7882 try { 7883 return isSensitiveTrackingPath(new URL(value, window.location.origin).pathname); 7884 } catch { 7885 return false; 7886 } 7887} 7888function safeTrackingPath(value) { 7889 if (isSensitiveTrackingPath(value) || isSensitiveTrackingUrl(value)) return null; 7890 return (0,src/* sanitizeTrackingLandingPath */.FO)(value); 7891} 7892function safeTrackingReferrer(value) { 7893 return isSensitiveTrackingUrl(value) ? null : (0,src/* sanitizeTrackingReferrer */.mi)(value); 7894} 7895function readCookie(name) { 7896 if (!isBrowser()) return null; 7897 const pattern = `; ${document.cookie}`; 7898 const parts = pattern.split(`; ${name}=`); 7899 if (parts.length < 2) return null; 7900 const value = parts.pop().split(";").shift(); 7901 return (0,src/* decodeTrackingCookieValue */.Xd)(value); 7902} 7903function readTouch(prefix) { 7904 return { 7905 source: readCookie(`${prefix}.source`), 7906 medium: readCookie(`${prefix}.medium`), 7907 campaign: readCookie(`${prefix}.campaign`), 7908 content: readCookie(`${prefix}.content`) 7909 }; 7910} 7911function readStoredTouch() { 7912 const stored = (0,utm/* readStoredUtm */.ef)(); 7913 if (!stored) { 7914 return { 7915 touch: { 7916 source: null, 7917 medium: null, 7918 campaign: null, 7919 content: null 7920 }, 7921 code: null, 7922 capturedAt: null 7923 }; 7924 } 7925 return { 7926 touch: { 7927 source: stored.source ?? null, 7928 medium: stored.medium ?? null, 7929 campaign: stored.campaign ?? null, 7930 content: stored.content ?? null 7931 }, 7932 code: stored.code ?? null, 7933 capturedAt: typeof stored.capturedAt === "number" && Number.isFinite(stored.capturedAt) ? stored.capturedAt : null 7934 }; 7935} 7936/** 7937 * SPEC-8WJNYT0X7E: è¿ããã£ã³ãã¼ã³ã³ã¼ããæ§ããæå»ãURL ã®ã³ã¼ããã¾ã æ§ãã«ç¡ãã¨ãã¯ä»ãè¿ã 7938 * ï¼ãã®ãã¼ã¸ã¸çããæå» = ãªã³ã¯ãè¸ãã æå»ï¼ãã³ã¼ããç¡ããã° nullã
7939 */ function resolveCampaignCapturedAt(queryCampaign, stored, nowMs) { 7940 const code = queryCampaign ?? stored.code; 7941 if (!code) return null; 7942 if (stored.code === code && stored.capturedAt !== null) { 7943 return new Date(stored.capturedAt).toISOString(); 7944 } 7945 return queryCampaign ? new Date(nowMs).toISOString() : null; 7946} 7947function ensureSessionId() { 7948 if (!isBrowser()) return crypto.randomUUID(); 7949 const cookieSession = readCookie("sb:session"); 7950 if (cookieSession) return cookieSession; 7951 try { 7952 const stored = window.localStorage.getItem(SESSION_STORAGE_KEY); 7953 if (stored) return stored; 7954 const generated = crypto.randomUUID(); 7955 window.localStorage.setItem(SESSION_STORAGE_KEY, generated); 7956 return generated; 7957 } catch { 7958 return crypto.randomUUID(); 7959 } 7960} 7961function mergeTouch(primary, fallback) { 7962 return { 7963 source: primary.source ?? fallback.source ?? null, 7964 medium: primary.medium ?? fallback.medium ?? null, 7965 campaign: primary.campaign ?? fallback.campaign ?? null, 7966 content: primary.content ?? fallback.content ?? null 7967 }; 7968} 7969function shouldSendVisit(sessionId) { 7970 if (!isBrowser()) return false; 7971 try { 7972 const raw = window.localStorage.getItem(VISIT_SENT_KEY); 7973 if (!raw) return true; 7974 const parsed = JSON.parse(raw); 7975 if (!parsed || typeof parsed !== "object") return true; 7976 if (parsed.session_id !== sessionId) return true; 7977 if (typeof parsed.sent_at !== "number") return true; 7978 return Date.now() - parsed.sent_at > VISIT_TTL_MS; 7979 } catch { 7980 return true; 7981 } 7982} 7983function markVisitSent(sessionId) { 7984 if (!isBrowser()) return; 7985 try { 7986 window.localStorage.setItem(VISIT_SENT_KEY, JSON.stringify({ 7987 session_id: sessionId, 7988 sent_at: Date.now() 7989 })); 7990 } catch { 7991 // best-effort 7992 } 7993} 7994function getTrackingSnapshot() { 7995 const stored = readStoredTouch(); 7996 const queryCampaign = isBrowser() && typeof window.location !== "undefined" ? new URLSearchParams(window.location.search).get("campaign_code") : null; 7997 if (isBrowser() && !isSensitiveTrackingPath(window.location.pathname)) { 7998 try { 7999 const sessionId = ensureSessionId(); 8000 if (shouldSendVisit(sessionId)) { 8001 const firstCookies = readTouch("ft"); 8002 const lastCookies = readTouch("lt"); 8003 const first = mergeTouch(firstCookies, stored.touch); 8004 const last = mergeTouch(lastCookies, stored.touch); 8005 fetch("/api/analytics/visit", { 8006 method: "POST", 8007 headers: { 8008 "Content-Type": "application/json" 8009 }, 8010 body: JSON.stringify({ 8011 session_id: sessionId, 8012 campaign_code: queryCampaign ?? stored.code ?? null, 8013 first, 8014 last, 8015 landing_path: safeTrackingPath(readCookie("lt.landing") ?? window.location.pathname + window.location.search), 8016 referrer: safeTrackingReferrer(readCookie("lt.referrer") ?? document.referrer ?? null), 8017 gclid: readCookie("lt.gclid") ?? null, 8018 fbclid: readCookie("lt.fbclid") ?? null, 8019 user_agent: navigator.userAgent 8020 }) 8021 }).then(()=>markVisitSent(sessionId)).catch((error)=>{ 8022 console.warn("[tracking] failed to send visit event", error); 8023 }); 8024 } 8025 } catch (error) { 8026 console.warn("[tracking] visit post error", error); 8027 } 8028 } 8029 const firstCookies = readTouch("ft"); 8030 const lastCookies = readTouch("lt"); 8031 const first = mergeTouch(firstCookies, stored.touch); 8032 const last = mergeTouch(lastCookies, stored.touch); 8033 const gclid = readCookie("lt.gclid") ?? null; 8034 const fbclid = readCookie("lt.fbclid") ?? null; 8035 const landingPath = safeTrackingPath(readCookie("lt.landing") ?? null); 8036 const referrer = safeTrackingReferrer(readCookie("lt.referrer") ?? (isBrowser() ? document.referrer || null : null)); 8037 return { 8038 session_id: ensureSessionId(), 8039 campaign_code: queryCampaign ?? stored.code ?? null,
8040 campaign_captured_at: resolveCampaignCapturedAt(queryCampaign, stored, Date.now()), 8041 first, 8042 last, 8043 landing_path: landingPath, 8044 referrer, 8045 gclid, 8046 fbclid 8047 }; 8048} 8049 8050 8051/***/ }), 8052 8053/***/ 87876: 8054/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 8055 8056"use strict"; 8057/* harmony export */ __webpack_require__.d(__webpack_exports__, { 8058/* harmony export */ "default": () => (/* binding */ ThirdPartyScripts) 8059/* harmony export */ }); 8060/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10335); 8061/* harmony import */ var next_script__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(49284); 8062/* harmony import */ var _lib_security_trusted_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2594); 8063/* __next_internal_client_entry_do_not_use__ default auto */ 8064 8065 8066function ThirdPartyScripts({ nonce }) { 8067 return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, { 8068 children: [ 8069 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_1__["default"], { 8070 id: "ga4", 8071 src: "https://www.googletagmanager.com/gtag/js?id=G-FNPBR7XJT6", 8072 strategy: "afterInteractive", 8073 nonce: nonce 8074 }), 8075 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_1__["default"], { 8076 id: "ga4-init", 8077 strategy: "afterInteractive", 8078 nonce: nonce, 8079 dangerouslySetInnerHTML: { 8080 __html: (0,_lib_security_trusted_types__WEBPACK_IMPORTED_MODULE_2__/* .createTrustedHTML */ .vn)(` 8081
vendor: 163 bytes, lines 8081-8084
8081window.dataLayer = window.dataLayer || []; 8082 function gtag(){dataLayer.push(arguments);} 8083 gtag('js', new Date()); 8084 gtag('config', '
8084G-FNPBR7XJT6
vendor: 41 bytes, lines 8084-8085
8084', { send_page_view: false }); 8085
8085`) 8086 } 8087 }), 8088 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_1__["default"], { 8089 id: "fb-pixel", 8090 strategy: "afterInteractive", 8091 nonce: nonce, 8092 dangerouslySetInnerHTML: { 8093 __html: (0,_lib_security_trusted_types__WEBPACK_IMPORTED_MODULE_2__/* .createTrustedHTML */ .vn)(`
vendor: 507 bytes, lines 8093-8102
8093 8094 !function(f,b,e,v,n,t,s) 8095 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 8096 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 8097 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 8098 n.queue=[];t=b.createElement(e);t.async=!0; 8099 t.src=v;s=b.getElementsByTagName(e)[0]; 8100 s.parentNode.insertBefore(t,s)}(window, document,'script', 8101 'https://connect.facebook.net/en_US/fbevents.js'); 8102 fbq('init', '
81022522367201489987
vendor: 52 bytes, lines 8102-8104
8102'); 8103 fbq('track', 'PageView'); 8104
8104`) 8105 } 8106 }), 8107 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_1__["default"], { 8108 id: "twitter-conversion", 8109 strategy: "afterInteractive", 8110 nonce: nonce, 8111 dangerouslySetInnerHTML: { 8112 __html: (0,_lib_security_trusted_types__WEBPACK_IMPORTED_MODULE_2__/* .createTrustedHTML */ .vn)(` 8113 !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments); 8114 },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='https://static.ads-twitter.com/uwt.js', 8115 a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script'); 8116 twq('config','qmb54'); 8117 `) 8118 } 8119 }), 8120 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_1__["default"], { 8121 id: "google-tag-manager", 8122 strategy: "afterInteractive", 8123 nonce: nonce, 8124 dangerouslySetInnerHTML: { 8125 __html: (0,_lib_security_trusted_types__WEBPACK_IMPORTED_MODULE_2__/* .createTrustedHTML */ .vn)(`
vendor: 394 bytes, lines 8125-8130
8125 8126 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 8127 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 8128 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 8129 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 8130 })(window,document,'script','dataLayer','
8130GTM-PVJG4K6S
vendor: 14 bytes, lines 8130-8131
8130'); 8131
8131`) 8132 } 8133 }), 8134 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("noscript", { 8135 children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("iframe", { 8136 src: "https://www.googletagmanager.com/ns.html?id=GTM-PVJG4K6S", 8137 height: "0", 8138 width: "0", 8139 style: { 8140 display: "none", 8141 visibility: "hidden" 8142 } 8143 }) 8144 }), 8145 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("noscript", { 8146 children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("img", { 8147 height: "1", 8148 width: "1", 8149 style: { 8150 display: "none" 8151 }, 8152 src: "https://www.facebook.com/tr?id=2522367201489987&ev=PageView&noscript=1", 8153 alt: "" 8154 }) 8155 }), 8156 /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_script__WEBPACK_IMPORTED_MODULE_1__["default"], { 8157 id: "acs-cbs", 8158 strategy: "afterInteractive", 8159 nonce: nonce, 8160 dangerouslySetInnerHTML: { 8161 __html: (0,_lib_security_trusted_types__WEBPACK_IMPORTED_MODULE_2__/* .createTrustedHTML */ .vn)(` 8162 window.acs_cbs = window.acs_cbs || []; 8163 (function acsKeep(){ 8164 var PK = "p"; 8165 var IMK = "im"; 8166 var LKEYS = {cid : ["cid", "CL_", "ACT_"], gclid : ["plid", "PL_", "APT_"]}; 8167 var DKEYS = ["gclid", "msclkid", "fbclid", "yclid", "ttclid", "ldtag_cl", "msi"]; 8168 var PDIR = "./"; 8169 var durl = "https://c.nox-asp.jp/direct.php"; 8170 function saveCookies(data){ 8171 var p = data[PK]; 8172 var out = Object.keys(LKEYS).reduce(function(ret, k){ 8173 if(k in data && data[k]) ret[k] = data[k]; 8174 return ret; 8175 }, {}); 8176 if(!p || !Object.keys(out).length) return; 8177 var purl = PDIR + "lptag.php?p=" + p; 8178 Object.keys(out).forEach(function(k){ 8179 purl += "&" + LKEYS[k][0] + "=" + out[k]; 8180 localStorage.setItem(LKEYS[k][1] + p, out[k]); 8181 }); 8182 var xhr = new XMLHttpRequest(); 8183 var args = "; expires=" + new Date(new Date().getTime() + 63072000000).toUTCString() + "; path=/; SameSite=None; Secure"; 8184 xhr.open("GET", purl); 8185 xhr.onloadend = function(){ 8186 if(xhr.status === 200 && xhr.response === ""){ 8187 window.acs_cbs.forEach(function(cb){ cb(); }); 8188 return; 8189 } 8190 Object.keys(out).forEach(function(k){ 8191 document.cookie = LKEYS[k][1] + p + "=" + decodeURIComponent(out[k]) + args; 8192 if(LKEYS[k][2]) document.cookie = LKEYS[k][2] + p + "=js" + args; 8193 }); 8194 window.acs_cbs.forEach(function(cb){ cb(); }); 8195 }; 8196 xhr.send(); 8197 } 8198 var data = location.search.substring(1).split("&").reduce(function(ret, s){ 8199 var kv = s.split("="); 8200 if(kv[1]) ret[kv[0]] = kv[1]; 8201 return ret; 8202 }, {}); 8203 if(!(IMK in data)){ saveCookies(data); return; } 8204 durl += "?im=" + data[IMK] + "&navi=" + performance.navigation.type; 8205 DKEYS.forEach(function(k){ 8206 if(!(k in data)) return; 8207 durl += "&" + k + "=" + data[k]; 8208 }); 8209 var xhr2 = new XMLHttpRequest(); 8210 xhr2.open("GET", durl); 8211 function merge(a, b){ 8212 return Object.keys(LKEYS).reduce(function(ret, k){ 8213 if(k in b && !(k in a)) ret[k] = b[k]; 8214 return ret; 8215 }, a); 8216 } 8217 xhr2.onloadend = function(){ 8218 if(xhr2.status !== 200) return; 8219 try{ 8220 var xhr_data = JSON.parse(xhr2.responseText); 8221 if(PK != "p"){ xhr_data[PK] = xhr_data["p"]; } 8222 saveCookies(merge(xhr_data, data)); 8223 }catch(_){} 8224 }; 8225 xhr2.send(); 8226 })(); 8227 `) 8228 } 8229 }) 8230 ] 8231 }); 8232} 8233 8234 8235/***/ }), 8236 8237/***/ 91893: 8238/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { 8239 8240"use strict"; 8241 8242// EXPORTS 8243__webpack_require__.d(__webpack_exports__, { 8244 ClarityAnalytics: () => (/* binding */ ClarityAnalytics) 8245}); 8246 8247// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/compiled/react/jsx-runtime.js 8248var jsx_runtime = __webpack_require__(10335); 8249// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/compiled/react/index.js 8250var react = __webpack_require__(82071); 8251// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/api/script.
8251js 8252var script = __webpack_require__(49284); 8253// EXTERNAL MODULE: ../../node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]_@[email protected]_@types+_a418ac9c5d0bd446028f37a34e206f48/node_modules/next/dist/api/navigation.js 8254var navigation = __webpack_require__(30737); 8255;// ./lib/security/page-scope.ts 8256const MARKETING_EXACT = new Set([ 8257 "/" 8258]); 8259const MARKETING_PREFIXES = [ 8260 "/lp", 8261 "/landing", 8262 "/whitepapers", 8263 "/companylp", 8264 "/deadline-calendar", 8265 "/kanrilp" 8266]; 8267const PUBLIC_SECURE_PREFIXES = [ 8268 "/jobs", 8269 "/companies", 8270 "/search", 8271 "/internships", 8272 "/media" 8273]; 8274const SECURE_PREFIXES = [ 8275 "/dashboard", 8276 "/admin", 8277 "/company", 8278 "/applications", 8279 "/chat", 8280 "/profile", 8281 "/login", 8282 "/signup", 8283 "/auth", 8284 "/offers", 8285 "/resume", 8286 "/onboarding", 8287 "/ipo", 8288 "/diagnosis", 8289 "/support" 8290]; 8291const normalizePath = (pathname)=>{ 8292 if (pathname.length > 1 && pathname.endsWith("/")) return pathname.slice(0, -1); 8293 return pathname; 8294}; 8295const matchesPrefix = (pathname, prefix)=>pathname === prefix || pathname.startsWith(`${prefix}/`); 8296function resolvePageScope(pathname) { 8297 const path = normalizePath(pathname); 8298 if (MARKETING_EXACT.has(path)) return "marketing"; 8299 if (MARKETING_PREFIXES.some((prefix)=>matchesPrefix(path, prefix))) return "marketing"; 8300 if (PUBLIC_SECURE_PREFIXES.some((prefix)=>matchesPrefix(path, prefix))) { 8301 return "public-secure"; 8302 } 8303 if (SECURE_PREFIXES.some((prefix)=>matchesPrefix(path, prefix))) return "secure"; 8304 return "public-secure"; 8305} 8306 8307// EXTERNAL MODULE: ./lib/es-share/constants.ts 8308var constants = __webpack_require__(18116); 8309// EXTERNAL MODULE: ./lib/security/auth-callback-paths.ts 8310var auth_callback_paths = __webpack_require__(25274); 8311;// ./lib/security/session-replay.ts 8312/** 8313 * SPEC-BKDWQCQ1X8 â Microsoft Clarityï¼ã»ãã·ã§ã³é²ç»ã»ãã¼ããããï¼ã®å¯å¦ã¨ç¯å²ã 8314 * 8315 * å身㯠TASK-9655 ã§ã`/jobhunting` ã ãã«è¼ããè¨è¨ã ã£ãããªã¼ãã¼ä¾é ¼ï¼2026-09-14ï¼ã§ 8316 * å¦çåãã¢ããªå ¨ä½ã¸åºãã2026-09-17 ã®ä¾é ¼ã§**æåãä¼ããå¦çãã³ã¼ãããå¤ãã**ã 8317 * ãããæ±ºããã®ã¯ãã©ã®é¢ã§é²ç»ããããã ãã§ãé²ç»ãããæåãã©ãæ±ãã㯠8318 * Clarity å´ã®ããã¸ã§ã¯ãè¨å®ï¼è¡¨ç¤ºã¢ã¼ããå³å¯ãï¼å ¨ãã¼ã¸ã®æåãä¼ããï¼ãæã¤ã 8319 * 8320 * ## æåãä¼ããæå®ãã³ã¼ãã¸æ»ããªãã㨠8321 * 8322 * HTML 屿§ã«ããæå®ã¯ **Clarity å´ã®è¨å®ããåªå ããã**ãããã³ã¼ãã«æ®ã£ã¦ãã㨠8323 * ããã·ã¥ãã¼ãã§ä¸å 管çã§ããªãï¼çæ¹ãå¤ãã¦ãããçæ¹ãåã¡ããããä¾å¤ã 8324 * åºãªãã®ã§æ°ä»ããªãï¼ã屿§ãä»ããã»å¤ãå¦çããSDK ã¸åç¨®ã®æå®ãéãå¦çã 8325 * ç½®ããªãããªã¼ãã¼å¤æ 2026-09-17ã 8326 * 8327 * ## ãã¼ã±é¢ãé¤ãã®ã¯ãäºéè¨æ¸¬ãæ§é çã«éããããã 8328 * 8329 * ãã¼ã±é¢ï¼`/`ã»`/lp`ã»`/kanrilp` çï¼ã«ã¯ **GTM ã³ã³ãã `GTM-PVJG4K6S` çµç±ã§ 8330 * å¥ããã¸ã§ã¯ãã® Clarity ãæ¢ã«å ¥ã£ã¦ãã**ããã㯠TASK-2100ï¼2026-08-14ã 8331 * ã³ããã `0b407264a`ï¼ãã2 ããã¸ã§ã¯ãã¸åæ£ãã¦ãããåé¡ãç´ããã¨ãã« 8332 * **æ®ãã¨æ±ºããæ£ã®çµè·¯**ã§ãããåãé¢ã«ãã®ã¢ããªã®ãã¼ãã¼ãéããã¨ã 8333 * ãã®ã¨ãç´ããäºéè¨æ¸¬ããã®ã¾ã¾åçºããã 8334 * 8335 * ã³ã¼ãã§æ¤åºãã¦é¿ãããã¨ã¯ã§ããªããGTM ã¯ã³ã³ããèªä½ãéåæã§èªã¿è¾¼ã¾ããããã 8336 * ãã¡ããæç»ã»æ¤æ»ããæç¹ã§ã¯ã¾ã DOM ã«ä½ãå ¥ã£ã¦ããããã©ã®ã¿ã¤ãã³ã°ã§èª¿ã¹ã¦ã 8337 * åããã¼ãã**é¢ãã¨å¤ããã¨ãå¯ä¸ã®ç¢ºå®ãªææ®µ**ã§ãGTM ã¨ãªã¼ãã¼ã® Vercel è¨å®ã 8338 * ã©ã¡ãã触ããã«éããããã 8339 * 8340 * ## å¤å®ãããã«éã¾ã£ã¦ããçç± 8341 * 8342 * 対象ãã¹ã»Project IDã»kill switch ã 1 ã¢ã¸ã¥ã¼ã«ã«ç½®ãã 8343 * ã³ã³ãã¼ãã³ã㨠`proxy.ts`ï¼CSPï¼ã¨å¥ç´ãã¹ãã**åã颿°**ãè¦ããå¥ã ã«æã¤ã¨ã 8344 * CSP ã¯éãã¦ããã®ã«æç»ãããªãï¼ã¾ãã¯ãã®éï¼ã¨ããé£ãéããèµ·ããããã
8345 * ã©ã¡ããä¾å¤ãåºããªãã®ã§æ°ä»ããªãã 8346 */ 8347 8348 8349const session_replay_normalizePath = (pathname)=>pathname.length > 1 && pathname.endsWith("/") ? pathname.slice(0, -1) : pathname; 8350/** 8351 * ã»ã°ã¡ã³ãä¸è´ãåæ¹ä¸è´ã«ãã㨠`/companies`ï¼å ¬éã®ä¼æ¥ä¸è¦§ï¼ã 8352 * `/company`ï¼ä¼æ¥ã®æ¥åç»é¢ï¼ã«å·»ãè¾¼ã¾ããå ¬éãã¼ã¸ãé²ç»å¯¾è±¡ããè½ã¡ãã 8353 */ const matchesSegment = (pathname, prefix)=>pathname === prefix || pathname.startsWith(`${prefix}/`); 8354/** 8355 * é²ç»ããªããã¹ï¼ãªã¼ãã¼å¤æ 2026-09-14ï¼ã 8356 * 8357 * éå¶ã®ç®¡çç»é¢ã¨ä¼æ¥ã®æ¡ç¨ç®¡çç»é¢ãã©ã¡ãããå¦çã®è¡åãçè§£ãããã¨ãã 8358 * é²ç»ã®ç®çã«å¯ä¸ããªã䏿¹ã**ä»äººã®å人æ å ±ãæãæ¿ãæ ã**é¢ã§ãã 8359 * ï¼ç®¡çç»é¢ã¯å¦çã®æ°åã»ã¡ã¼ã«ã»å¤§å¦ã»é»è©±çªå·ã伿¥ç»é¢ã¯å¿åè ãã¼ã¿ï¼ã 8360 * 8361 * ãã¼ã±é¢ã¯ããã«ä¸¦ã¹ãªãã**`resolvePageScope` ãæ£æ¬ã¨ãã¦å¼ã** 8362 * ï¼`isClarityAllowedPath` ãåç §ï¼ããã¬ãã£ãã¯ã¹ãæ¸ãåãã¨ããã¼ã±é¢ã 8363 * å¢ããã¨ãã«çæ¹ã ã追éãã¦äºéè¨æ¸¬ã復活ããã 8364 */ const CLARITY_EXCLUDED_PREFIXES = [ 8365 "/admin", 8366 "/company" 8367]; 8368/** 8369 * ãã®ãã¹ã§ Clarity ãåããã¦ãããã 8370 * 8371 * å¤ãã®ã¯ 3 ã¤ã ãã 8372 * 1. éå¶ã®ç®¡çç»é¢ã¨ä¼æ¥ã®æ¡ç¨ç®¡çç»é¢ï¼`CLARITY_EXCLUDED_PREFIXES`ï¼ 8373 * 2. **ãã¼ã±é¢** ââ GTM çµç±ã® Clarity ãæ¢ã«åãã¦ããã®ã§éããªã 8374 * 3. ES ã®å ±æ URL ã¨èªè¨¼ callbackï¼`isSensitiveSessionReplayPath`ï¼ 8375 * 8376 * 2 ã®éå㯠`resolvePageScope` ãæ£æ¬ãããã§ãã¬ãã£ãã¯ã¹ãæ¸ãåããªã 8377 * ï¼ãã¼ã±é¢ãå¢ããã¨ãã«çæ¹ã ã追éãã¦äºéè¨æ¸¬ã復活ããï¼ã 8378 * ãã以å¤ã¯å ¨é¨ trueï¼å¦çåãã¢ããªå ¨ä½ãååã¨ãã¦è¨æ¸¬ããï¼ã 8379 */ function isClarityAllowedPath(pathname) { 8380 const path = session_replay_normalizePath(pathname); 8381 // æç« ãã®ãã®ã渡ãã±ã¤ãããªã㣠URL ã¯é²ç»å¯¾è±¡ã«ããªãã 8382 if (isSensitiveSessionReplayPath(path)) return false; 8383 if (CLARITY_EXCLUDED_PREFIXES.some((prefix)=>matchesSegment(path, prefix))) return false; 8384 if (resolvePageScope(path) === "marketing") return false; 8385 return true; 8386} 8387/** 8388 * ä»æã® SDK ãæ¢ã«åãã¦ãã¦ããæç»åã«é²ç»ãæ¢ããªããã°ãªããªãçµè·¯ã 8389 * 8390 * å ±æ URL ã¨èªè¨¼ callback ã¯ç§å¯å¤ãå«ã¿å¾ãã®ã§ããã¼ã±é¢ã»ç®¡çé¢ã¨éã£ã¦ã仿ã®è¨æ¸¬ã 8391 * å£ããªããããæ¼ãããé²ããã¨ãåªå ããã`ClarityAnalytics` ã¯ãã®å¤ã 8392 * `useLayoutEffect` ã§è¦ã¦ããã©ã¦ã¶ãæç»ããåã« SDK ãæ¢ããã 8393 */ function isSensitiveSessionReplayPath(pathname) { 8394 const path = session_replay_normalizePath(pathname); 8395 return path.startsWith(constants/* ES_SHARE_PATH_PREFIX */.mL) || (0,auth_callback_paths/* isSensitiveAuthCallbackPath */.l)(path); 8396} 8397/** 8398 * kill switchã**æ¢å® ON**ï¼ãªã¼ãã¼ä¾é ¼ããå ¨ãã¼ã¸ã§åå¾ãããããªã®ã§ã 8399 * ç°å¢å¤æ°ãè¨å®ããªãã¨åããªãå½¢ã«ã¯ããªãï¼ã`"false"` ãæç¤ºããã¨ãã ãæ¢ã¾ãã 8400 * 8401 * å¼ã³åºãå´ã¯ `process.env.NEXT_PUBLIC_CLARITY_ENABLED` ã**éçåç §**ã§èªããã¨ã 8402 * ç°å¢å¤æ°åã宿°ã«ã㦠`process.env[宿°]` ã§èªãã¨ãã«ãæç½®æãå¹ããã 8403 * 常㫠`undefined` ã«ãªã£ã¦ kill switch ãæ°¸ä¹ ã«å¹ããªããªãã 8404 */ function isClarityEnabled(rawFlag) { 8405 return rawFlag !== "false"; 8406} 8407/** 8408 * ãã®ã¢ããªã使ã Clarity ã® Project IDã**宿° 1 æ¬ã§ãç°å¢å¤æ°ããèªã¾ãªãã** 8409 * 8410 * ãªã¼ãã¼æ¯çµ¦ï¼2026-09-14ï¼ãenv ã§ä¸æ¸ãã§ããå½¢ã«ãã¦ã¯ãããªã: 8411 * æ¬çªã® `NEXT_PUBLIC_CLARITY_PROJECT_ID` ã«ã¯ TASK-9655 彿ã®å¥ããã¸ã§ã¯ã 8412 * ï¼GTM å´ã¨åããã®ï¼ãå ¥ã£ã¦ããå¯è½æ§ãé«ããenv ãåªå ãã㨠8413 * **ãã® ID ã«ã¯ 1 ä»¶ãå ¥ããªãã¾ã¾ãã¨ã©ã¼ãåºãã«æåããããã«è¦ãã**ã 8414 * ãªã¼ãã¼ã¯ Vercel ã®ç°å¢å¤æ°ã夿´ã§ããªãåæãªã®ã§ãã³ã¼ãå´ã§ç¢ºå®ãããã 8415 * 8416 * å¤ããã¨ãã¯ãã® 1 è¡ãæ¸ãæãã¦ãããã¤ãããå¥ç´ãã¹ããå¤ãåºå®ãã¦ããã 8417 * ããã¸ã§ã¯ãå´ã®è¡¨ç¤ºã¢ã¼ãããã® ID ã®è¨å®ã«ç´ã¥ãã®ã§ãID ãå·®ãæ¿ããã¨ã㯠8418 * æ°ããããã¸ã§ã¯ããåãå³å¯ã¢ã¼ãã§ãããã¨ãå ã«ç¢ºãããã 8419 */ const CLARITY_PROJECT_ID = "yhxfgs3lr9"; 8420/** 8421 * é²ç»ã®æææ¨©ãåã£ã¦ãããã 8422 *
8423 * é¤å¤é¢ï¼éå¶ã®ç®¡çç»é¢ã»ä¼æ¥ã®æ¡ç¨ç®¡çç»é¢ï¼ã¸åºãã¨ãã« `stop` ãéã£ã¦ããã®ã¯ã 8424 * **èªåãå§ããé²ç»ã ã**ãGTM ã³ã³ãããåãã°ãã¼ãã«ï¼`window.clarity`ï¼ã 8425 * å ã«ç¨æãã¦ããå ´åã«ãããæ¢ããã¨ãå ããåãã¦ããé²ç»ãå£ããã 8426 * Root Layout ã¯åãã¦ã³ããããªãã®ã§ããã® SPA ã»ãã·ã§ã³ä¸ã¯æ»ããªãã 8427 * 8428 * ## å¤å®ã¯ãé²ç»å¯¾è±¡ã®é¢ã¸åãã¦å ¥ã£ãæç¹ã§ SDK ãå± ããã1 ã¤ã ãããã ã**測ãåæ°**ãè¦ 8429 * 8430 * å身ï¼TASK-9655ï¼ã¯ããã§ loader è¦ç´ ã®æç¡ãä½µãã¦è¦ã¦ãããæ¯åæ¸¬ãç´ãã¦ããããã 8431 * ä¸åº¦åºã¦æ»ãã¨**èªåãåã«è¼ãã SDK** ã仿ã®ãã®ã¨åãéããããã§ãã: 8432 * 8433 * 1. 対象ãã¹ã¸å ¥ã â SDK ç¡ã â æææ¨©ãåã 8434 * 2. é¤å¤é¢ã¸åºã â `stop` ãéã â æææ¨©ãææ¾ã 8435 * 3. 対象ãã¹ã¸æ»ã â SDK ã¯æé 1ã®æ®ã â ã仿ã®ãã®ãã¨èª¤èªãã¦æææ¨©ãåããªã 8436 * 4. é¤å¤é¢ã¸åºã â æææ¨©ãç¡ã `stop` ãéããªã 8437 * â 以éãã® SPA ã»ãã·ã§ã³ä¸ãã£ã¨é¤å¤é¢ãé²ç»ãç¶ãã 8438 * 8439 * å¼ã³åºãå´ã**1 度ã ãæ¸¬ã£ã¦ ref ã«è¦ãã**ãªããæé 3ã§æ¸¬ãç´ããªãã®ã§ 8440 * ãã®åãéãã¯èµ·ããªããloader è¦ç´ ãè¦ãå¿ è¦ãç¡ããªãã 8441 * 8442 * ãã®æ¸¬å®ãã仿ã®ãã®ãããæ£ããè¨ããã®ã¯ã**èªåã®ã¿ã°ã¯ã¾ã å®è¡ããã¦ããªã** 8443 * ããã`next/script` ãæ³¨å ¥ããã®ã¯ `<script src>` ã§ãã£ã¦ã`window.clarity` ã 8444 * ç«ã¤ã®ã¯ SDK ããããã¯ã¼ã¯ããåã£ã¦è©ä¾¡ãçµããå¾ã§ããããããã£ã¦å¹æã 8445 * èµ°ãæç¹ã§ SDK ãå± ããªããããã¯èªå以å¤ãç¨æãããã®ããããå¾ãªãã 8446 * 8447 * å¼ã³åºãå´ã®åæã¯ 2 ã¤ã**測ãã®ã¯ 1 度ã ã**ï¼æ¯å測ãç´ãã¨ã2 åç®ä»¥é㯠8448 * èªåã® SDK ã仿ã®ãã®ã¨èªã¿éã㦠`stop` ãéããªããªãï¼ãããã¦**測ãã®ã¯ 8449 * é²ç»å¯¾è±¡ã®é¢ã¸å ¥ã£ãã¨ã**ï¼ãã¦ã³ãæç¹ã§æ¸¬ãã¨ãé¤å¤é¢ã§èªã¿è¾¼ã¿ä¸ã ã£ã 8450 * ä»æã® SDK ããå± ãªããã¨è¨é²ãã¦ãã¾ãï¼ã 8451 * `ClarityAnalytics` ã®å¥ç´ãã¹ãã§åºå®ãã¦ããã 8452 */ function shouldClaimSessionReplayOwnership(input) { 8453 return !input.foreignSdkPresent; 8454} 8455 8456// EXTERNAL MODULE: ./lib/security/trusted-types.ts 8457var trusted_types = __webpack_require__(2594); 8458;// ./components/ClarityAnalytics.tsx 8459/* __next_internal_client_entry_do_not_use__ ClarityAnalytics auto */ 8460/** 8461 * SPEC-BKDWQCQ1X8 â Microsoft Clarity ã gakuten.co.jp ã®å ¨ãã¼ã¸ã«è¼ããã 8462 * 8463 * å身㯠`/jobhunting` éå®ã®å®è£ ï¼TASK-9655ï¼ãç¯å²ã¯åºããããå®ã£ã¦ãããã®ã¯ 8464 * ãã®ã¾ã¾æã£ã¦ãã¦ããã 8465 * 8466 * å¥ç´ãã¹ãããã®ãã¡ã¤ã«ãèµ°æ»ãã¦åºåç³»ã®èå¥åãç¡ããã¨ã確ãããã®ã§ã 8467 * 説æã§ã該å½ã®èå¥åãã®ãã®ã¯æ¸ããªãï¼ã³ã¡ã³ãä¸ã®ãªãã©ã«ãæ¤åºãããããï¼ã 8468 * 8469 * ## ãªããµã¼ãã§ã¯ãªãã¯ã©ã¤ã¢ã³ãã§å¯¾è±¡ãã¹ãå¤å®ããã®ã 8470 * 8471 * Root Layout ã¯ã¢ããªã®çåæéãã£ã¨åãã¤ã³ã¹ã¿ã³ã¹ã§ãã¯ã©ã¤ã¢ã³ãé·ç§»ã§ã¯ 8472 * åå®è¡ãããªããå¯å¦ããµã¼ãã®ãããã¼ã ãã§æ±ºããã¨ã 8473 * - é¤å¤é¢ï¼éå¶ã®ç®¡çç»é¢ã»ä¼æ¥ã®æ¡ç¨ç®¡çç»é¢ï¼ã¸**é·ç§»ãã¦å ¥ã£ã¦ãé²ç»ãç¶ã** 8474 * - éã«ããããåºã¦ã**äºåº¦ã¨é²ç»ãæ»ããªã** 8475 * ã©ã¡ãã許容ã§ããªãã®ã§ãéå§ã¨åæ¢ã¯ pathname ãè¦ã¦è¡ãã 8476 * 8477 * ## äºéèªã¿è¾¼ã¿ã«ã¤ã㦠8478 * 8479 * ãã®ã¢ããªãåºãã¿ã°ã¯ 1 æ¬ã ãï¼`next/script` ã id ã§éè¤æ³¨å ¥ãé²ãï¼ã 8480 * ã¢ããªã®**å¤**ã«ãã 1 æ¬ããé¢ ââ GTM ã³ã³ããçµç±ã® Clarity ãåãã¦ãã 8481 * ãã¼ã±é¢ ââ 㯠`isClarityAllowedPath` ã丸ãã¨é¤å¤ãããã³ã¼ãã§æ¤åºã㦠8482 * é¿ãããã¨ã¯ã§ããªãã®ã§ï¼ã³ã³ããã®èªã¿è¾¼ã¿èªä½ãéåæã§ããã¡ããæç»ã» 8483 * æ¤æ»ããæç¹ã§ã¯ã¾ã DOM ã«ä½ãå ¥ã£ã¦ããªãï¼ãé¢ãã¨å¤ãã¦æ§é çã«éããã 8484 * 8485 * ## æåãä¼ããæå®ã¯ããã§æããªãï¼ãªã¼ãã¼å¤æ 2026-09-17ï¼ 8486 * 8487 * Clarity ã®ããã¸ã§ã¯ãè¨å®ã表示ã¢ã¼ããå³å¯ãï¼å ¨ãã¼ã¸ã®æåãä¼ããï¼ã«ããã
8487®ã§ã 8488 * ãã®é¢ã®è²¬åã¯**é²ç»ããï¼ããªãã®åãæ¿ãã ã**ã«ãªã£ããHTML 屿§ã«ããæå®ã¯ 8489 * ããã¸ã§ã¯ãè¨å®ããåªå ããããããããã§ä»ãå¤ãããã¨ããã·ã¥ãã¼ãã§ã® 8490 * ä¸å 管çãå£ãããSDK ã¸åç¨®ã®æå®ãéãå¦çãç½®ããªãã 8491 */ 8492 8493 8494 8495 8496function getClarity() { 8497 const value = window.clarity; 8498 return typeof value === "function" ? value : null; 8499} 8500const LOADER_ID = "clarity-analytics"; 8501function ClarityAnalytics() { 8502 const pathname = (0,navigation.usePathname)(); 8503 // **é²ç»å¯¾è±¡ã®é¢ã¸åãã¦å ¥ã£ãæç¹**ã§ä»æã® SDK ãå± ããã`null` ã¯ãã¾ã 測ã£ã¦ 8504 // ããªããããã¦ã³ãæç¹ã§æ¸¬ãã¨ããã¼ã±é¢ã® GTM ãèªã¿è¾¼ã¿ä¸ã®ããã ã« 8505 // ãå± ãªããã§åºå®ããã¦ãã¾ãã 8506 // 8507 // æ¯å測ãç´ãã¦ã¯ãããªããä¸åº¦é¤å¤é¢ã¸åºã¦æ»ãã¨ãèªåãåã«è¼ãã SDK ã 8508 // 仿ã®ãã®ã¨èªã¿éããä»¥å¾ `stop` ãéããªããªãï¼è©³ç´°ã¯ 8509 // `shouldClaimSessionReplayOwnership` ã® docï¼ã 8510 const foreignSdkRef = (0,react.useRef)(null); 8511 // ãã®ã³ã³ãã¼ãã³ããé²ç»ãå§ãããã©ããã 8512 // 8513 // ç¡æ¡ä»¶ã« `stop` ãå¼ã¶ã¨ãé¤å¤é¢ã¸å ¥ã£ãã¨ãã«å ã åãã¦ããé²ç»ã¾ã§æ¢ã¾ãã 8514 // Root Layout ã¯åãã¦ã³ããããªãã®ã§ããã® SPA ã»ãã·ã§ã³ä¸ã¯æ»ããªãã 8515 const startedByThisComponentRef = (0,react.useRef)(false); 8516 // `start` ãéã£ãç¶æ ãã©ããï¼æææ¨©ã¨ã¯å¥ï¼ãæææ¨©ãç¡ãï¼ä»æã® SDK ã 8517 // 使ã£ã¦ããå ´åã§ããé·ç§»ã®ãã³ã« `start` ãæã¡ç´ããªãããã«è¦ãã 8518 const startRequestedRef = (0,react.useRef)(false); 8519 const path = pathname ?? ""; 8520 const allowed = isClarityAllowedPath(path); 8521 const sensitive = isSensitiveSessionReplayPath(path); 8522 // é²ç»å¯¾è±¡ããå¤ããé¢ã¸ SPA é·ç§»ããå ´åãpassive effect ã¾ã§å¾ ã¤ã¨ãæ¢ã« 8523 // åãã¦ãã SDK ã**æ°ãã DOM ã 1 ãã¬ã¼ã è¨é²ãå¾ã**ãlayout effect 㯠8524 // ãã©ã¦ã¶ã®æç»åã«èµ°ãã®ã§ãããã§å ã«åæ¢ããã 8525 // 8526 // 対象㯠2 ã¤ãããæ¢ãã¦ããç¯å²ãéãã 8527 // 8528 // - å ±æ URLï¼`sensitive`ï¼â¦ capability ãã®ãã®ãªã®ã§ã**仿ãéå§ãã 8529 // SDK ã§ãã£ã¦ãä¾å¤çã«æ¢ãã**ã 8530 // - éå¶ã®ç®¡çç»é¢ã»ä¼æ¥ã®æ¡ç¨ç®¡çç»é¢ï¼`!allowed`ï¼â¦ å人æ å ±ã並ã¶ã®ã§ 8531 // æç»åã«æ¢ãããã**èªåãå§ããé²ç»ã ã**ã«ããã仿ã®è¨æ¸¬ãæ¢ããªã 8532 // ã¨ããæ¢åã®ç·ï¼ãã¼ã±é¢ã® GTMï¼ãããã§å´©ããªãã 8533 // 8534 // 管çã»æ¡ç¨ç»é¢ã¯ `sensitive` ã§ã¯ãªãããã以åã¯ãã® layout effect ãéããã 8535 // åæ¢ãæ°ãã DOM ã®ã³ãããå¾ï¼ä¸ã® passive effectï¼ã¾ã
8535§é ãã¦ãã 8536 // ï¼Codex ã¬ãã¥ã¼ 2026-09-17 / PR #1682ï¼ã 8537 (0,react.useLayoutEffect)(()=>{ 8538 if (!sensitive && allowed) return; 8539 if (!sensitive && !startedByThisComponentRef.current) return; 8540 getClarity()?.("stop"); 8541 startedByThisComponentRef.current = false; 8542 startRequestedRef.current = false; 8543 }, [ 8544 sensitive, 8545 allowed 8546 ]); 8547 (0,react.useEffect)(()=>{ 8548 // éãã¼ã±é¢ã®æ¬çª CSP 㯠`require-trusted-types-for 'script'` ãæã¤ã 8549 // æ¢å®ããªã·ã¼ãç¡ã㨠`script.src` ã¸ã®ä»£å ¥ã TypeError ã«ãªãã 8550 // `providers.tsx` ã® module scope ã§ãä½ãããããimport é ã«ä¾åãããªãã 8551 (0,trusted_types/* ensureDefaultTrustedTypesPolicy */.k_)(); 8552 if (!allowed) { 8553 // é¤å¤é¢ï¼éå¶ã®ç®¡çç»é¢ã»ä¼æ¥ã®æ¡ç¨ç®¡çç»é¢ï¼ã¸åºããæ¢ãããSDK ã¯èªã¿è¾¼ãã 8554 // ã¾ã¾ã«ããï¼èªã¿è¾¼ã¿ç´ãã®ã»ããå¯ä½ç¨ãå¤ãï¼ãå§ãã¦ããªããªã触ããªã 8555 // ï¼ä»æã®é²ç»ãæ¢ããªãããï¼ã 8556 if (startedByThisComponentRef.current) { 8557 getClarity()?.("stop"); 8558 startedByThisComponentRef.current = false; 8559 } 8560 startRequestedRef.current = false; 8561 return; 8562 } 8563 // **1 åã ã**測ãããã ãæ¸¬ãã®ã¯**é²ç»å¯¾è±¡ã®é¢ã¸åãã¦å ¥ã£ãã¨ã**ã§ã 8564 // ãã¦ã³ãæç¹ã§ã¯ãªãããã¼ã±é¢ããå§ã¾ã£ãã»ãã·ã§ã³ã§ã¯ GTM çµç±ã® 8565 // Clarity ãã¾ã èªã¿è¾¼ã¿ä¸ã®ãã¨ãããããã¦ã³ãæã«æ¸¬ãã¨ãä»æã® SDK 㯠8566 // å± ãªããã§åºå®ãããããã®å¾ GTM ã `window.clarity` ãä½ã£ã¦ãã許å¯é¢ã¸ 8567 // SPA é·ç§»ããã¨ãä»æã® SDK ãèªåã®æã¡ç©ã¨ãã¦è¨é²ãããã¼ã±é¢ã¸æ»ã£ã 8568 // ã¨ãã« `stop` ãéã£ã¦ GTM ã®è¨æ¸¬ãã»ãã·ã§ã³ä¸ãã£ã¨æ¢ãã¦ãã¾ã 8569 // ï¼Codex ã¬ãã¥ã¼ 2026-09-17 / PR #1682ï¼ã 8570 // 8571 // 許å¯é¢ã¾ã§é ããã¦ããèªåã®ã¿ã°ã¯ã¾ã è©ä¾¡ããã¦ããªããã¯å¤ãããªã 8572 // ââ`next/script` ãæ³¨å ¥ããã®ã¯ `<script src>
8572` ã§ã`window.clarity` ãç«ã¤ 8573 // ã®ã¯åå¾ãã¦è©ä¾¡ãçµããå¾ã广ã¯ãã®åã«èµ°ãã 8574 // 8575 // 測ãç´ããªããã¨ã¯å¤ããªããä¸åº¦é¤å¤é¢ã¸åºã¦æ»ã£ãã¨ããèªåãåã«è¼ãã 8576 // SDK ã仿ã®ãã®ã¨èªã¿éã㦠`stop` ãéããªããªããã 8577 // ï¼`shouldClaimSessionReplayOwnership` ã® doc ãåç §ï¼ã 8578 if (foreignSdkRef.current === null) { 8579 foreignSdkRef.current = getClarity() !== null; 8580 } 8581 // å ¬å¼ã¹ããããã¨åããã¥ã¼ stub ãç½®ããã¿ã°æ¬ä½ã¯ `next/script` ãéåæã§ 8582 // èªã¿è¾¼ãã®ã§ããããè©ä¾¡ãããã¾ã§ã®å¼ã³åºãã¯ããã¸ç©ã¾ããSDK èµ·åæã« 8583 // ã¾ã¨ãã¦æµããã 8584 // 8585 // å ¬å¼ã¹ããããã«ãããåæãå¾ãã㨠SDK ã¸ä¼ããå¼ã³åºãã¯**å ¥ããªã** 8586 // ï¼å¥ç´ãã¹ãããã®èå¥åãæ¤åºããã®ã§ãããã§ãç¶´ããªãï¼ã 8587 // ãã¼ã¸ãéããã ãã®å©ç¨è ã¯ãã®åæããã¦ããªããå¼ã°ãªãå ´å Clarity 㯠8588 // cookie ã使ããªãå´ã§åããåç¥ãåæåå¾ãå ¥ãããªãããã®ã¨ãã«æ¹ãã¦è¶³ãã 8589 if (!getClarity()) { 8590 const queue = Object.assign(function clarityStub(...args) { 8591 (queue.q = queue.q ?? []).push(args); 8592 }, { 8593 q: [] 8594 }); 8595 window.clarity = queue; 8596 } 8597 if (!startRequestedRef.current) { 8598 getClarity()?.("start"); 8599 startRequestedRef.current = true; 8600 // 仿ãå ã«ç¨æãã SDK ãåå©ç¨ããã ããªãããã¡ãã®æã¡ç©ã«ã¯ããªãã 8601 // æã¡ç©ã«ããã¨é¤å¤é¢ã¸åºãã¨ãã« `stop` ãéããå ããåãã¦ããé²ç»ã 8602 // æ¢ãã¦ãã¾ããå¤å®ãç´é¢æ°ã¸åºãã¦ããã®ã¯ãããã«ç´æ¥æ¸ãã¨ã½ã¼ã¹æååã§ 8603 // ããåºå®ã§ããããä¸åº¦åºã¦æ»ããçµè·¯ã®å帰ãå¥ç´ãã¹ãã§æã¾ããããªãããã 8604 if (shouldClaimSessionReplayOwnership({ 8605 foreignSdkPresent: foreignSdkRef.current 8606 })) { 8607 startedByThisComponentRef.current = true; 8608 } 8609 } 8610 }, [ 8611 allowed 8612 ]); 8613 // é¤å¤é¢ã§ã¯**ã¿ã°èªä½ãåºããªã**ï¼ç´æ¥ãã® URL ãéããå ´åã« 1 度ãèªã¿è¾¼ã¾ãªãï¼ã 8614 // é·ç§»ã§å ¥ã£ã¦ããå ´å㯠SDK ãæ¢ã«ããã®ã§ãä¸ã® effect ã `stop` ãéãã 8615 if (!allowed) return null; 8616 return /*#__PURE__*/ (0,jsx_runtime.jsx)(script["default"], { 8617 id: LOADER_ID, 8618 // ãã¼ã¸è¡¨ç¤ºããããã¯ããªããæç»åã«èªã¿è¾¼ãæ¦ç¥ã«ããã¨ãè¨æ¸¬ã®ããã« 8619 // åå表示ãé ããããã¨ã«ãªãã 8620 strategy: "afterInteractive", 8621 src: `https://www.clarity.ms/tag/${encodeURIComponent(CLARITY_PROJECT_ID)}`, 8622 onError: ()=>{ 8623 // èªã¿è¾¼ã¿ã«å¤±æãã stub ãæ®ãã¨ã以å¾ã®å¼ã³åºããæ°¸ä¹ ã«æµããªããã¥ã¼ã¸ 8624 // ç©ã¾ãããSDK ãè¼ã£ã¦ããã° `q` ãæããªãå®ä½ã«å·®ãæ¿ãã£ã¦ããã®ã§ã 8625 // ãã®ã¨ãã¯è§¦ããªãã 8626 const current = getClarity(); 8627 if (current && Array.isArray(current.q)) { 8628 delete window.clarity; 8629 } 8630 startRequestedRef.current = false; 8631 } 8632 }); 8633} 8634 8635 8636/***/ }) 8637 8638}, 8639/******/ __webpack_require__ => { // webpackRuntimeModules 8640/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) 8641/******/ __webpack_require__.O(0, [59746,92141,50804,13884,30748,42393,41695,30493,72429,38437,40194,20918,17489,60103,29560,25884,77315,70020,64146,28572,49772,98796,27214,27963,42730,74787,46135,19274,77358], () => (__webpack_exec__(27181))); 8642/******/ var __webpack_exports__ = __webpack_require__.O(); 8643/******/ _N_E = __webpack_exports__; 8644/******/ } 8645]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.