aiexecode 1.0.98 → 1.0.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aiexecode might be problematic. Click here for more details.
- package/package.json +1 -1
- package/payload_viewer/out/404/index.html +1 -1
- package/payload_viewer/out/404.html +1 -1
- package/payload_viewer/out/index.html +1 -1
- package/payload_viewer/out/index.txt +1 -1
- package/src/LLMClient/converters/responses-to-zai.js +61 -2
- package/src/ai_based/completion_judge.js +234 -188
- /package/payload_viewer/out/_next/static/{WjvWEjPqhHNIE_a6QIZaG → dk9pnUd-sTmuTTbqEeL__}/_buildManifest.js +0 -0
- /package/payload_viewer/out/_next/static/{WjvWEjPqhHNIE_a6QIZaG → dk9pnUd-sTmuTTbqEeL__}/_clientMiddlewareManifest.json +0 -0
- /package/payload_viewer/out/_next/static/{WjvWEjPqhHNIE_a6QIZaG → dk9pnUd-sTmuTTbqEeL__}/_ssgManifest.js +0 -0
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--dk9pnUd_sTmuTTbqEeL__--><html lang="ko" class="dark h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/b75131b58f8ca46a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/e411019f55d87c42.js"/><script src="/_next/static/chunks/103c802c8f4a5ea1.js" async=""></script><script src="/_next/static/chunks/305b077a9873cf54.js" async=""></script><script src="/_next/static/chunks/turbopack-0ac29803ce3c3c7a.js" async=""></script><script src="/_next/static/chunks/060f9a97930f3d04.js" async=""></script><script src="/_next/static/chunks/cdd12d5c1a5a6064.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Payload Log Viewer</title><meta name="description" content="AI Agent 로그 파일 뷰어 및 편집기"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><script src="/_next/static/chunks/e411019f55d87c42.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n4:I[5766,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\"],\"Toaster\"]\n5:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"OutletBoundary\"]\n7:I[11533,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"AsyncMetadataOutlet\"]\n9:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[68027,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n:HL[\"/_next/static/chunks/b75131b58f8ca46a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"dk9pnUd-sTmuTTbqEeL__\",\"p\":\"\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b75131b58f8ca46a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cdd12d5c1a5a6064.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"ko\",\"className\":\"dark h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden\",\"children\":[[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L4\",null,{\"position\":\"bottom-right\",\"toastOptions\":{\"duration\":4000,\"style\":{\"background\":\"hsl(var(--background))\",\"color\":\"hsl(var(--foreground))\",\"border\":\"1px solid hsl(var(--border))\"}}}]]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",\"$undefined\"],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"f:I[27201,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"IconMark\"]\n8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Payload Log Viewer\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Agent 로그 파일 뷰어 및 편집기\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lf\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--dk9pnUd_sTmuTTbqEeL__--><html lang="ko" class="dark h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/b75131b58f8ca46a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/e411019f55d87c42.js"/><script src="/_next/static/chunks/103c802c8f4a5ea1.js" async=""></script><script src="/_next/static/chunks/305b077a9873cf54.js" async=""></script><script src="/_next/static/chunks/turbopack-0ac29803ce3c3c7a.js" async=""></script><script src="/_next/static/chunks/060f9a97930f3d04.js" async=""></script><script src="/_next/static/chunks/cdd12d5c1a5a6064.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Payload Log Viewer</title><meta name="description" content="AI Agent 로그 파일 뷰어 및 편집기"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><script src="/_next/static/chunks/e411019f55d87c42.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n4:I[5766,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\"],\"Toaster\"]\n5:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"OutletBoundary\"]\n7:I[11533,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"AsyncMetadataOutlet\"]\n9:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"ViewportBoundary\"]\nb:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[68027,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n:HL[\"/_next/static/chunks/b75131b58f8ca46a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"dk9pnUd-sTmuTTbqEeL__\",\"p\":\"\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b75131b58f8ca46a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cdd12d5c1a5a6064.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"ko\",\"className\":\"dark h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden\",\"children\":[[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L4\",null,{\"position\":\"bottom-right\",\"toastOptions\":{\"duration\":4000,\"style\":{\"background\":\"hsl(var(--background))\",\"color\":\"hsl(var(--foreground))\",\"border\":\"1px solid hsl(var(--border))\"}}}]]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:children:props:children:0:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",\"$undefined\"],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"f:I[27201,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"IconMark\"]\n8:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Payload Log Viewer\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Agent 로그 파일 뷰어 및 편집기\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lf\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--WjvWEjPqhHNIE_a6QIZaG--><html lang="ko" class="dark h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/b75131b58f8ca46a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/e411019f55d87c42.js"/><script src="/_next/static/chunks/103c802c8f4a5ea1.js" async=""></script><script src="/_next/static/chunks/305b077a9873cf54.js" async=""></script><script src="/_next/static/chunks/turbopack-0ac29803ce3c3c7a.js" async=""></script><script src="/_next/static/chunks/060f9a97930f3d04.js" async=""></script><script src="/_next/static/chunks/cdd12d5c1a5a6064.js" async=""></script><script src="/_next/static/chunks/f1ac9047ac4a3fde.js" async=""></script><script src="/_next/static/chunks/b6c0459f3789d25c.js" async=""></script><meta name="next-size-adjust" content=""/><title>Payload Log Viewer</title><meta name="description" content="AI Agent 로그 파일 뷰어 및 편집기"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="h-screen bg-background flex"><div class="flex-shrink-0 w-80 border-r border-border bg-background flex flex-col"><div class="flex-shrink-0 border-b border-border p-4"><h2 class="text-lg font-semibold flex items-center gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text h-5 w-5" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg>로그 파일</h2><p class="text-sm text-muted-foreground">로딩 중...</p></div><div class="flex-1 min-h-0"><div dir="ltr" class="relative overflow-hidden h-full" style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="h-full w-full rounded-[inherit]" style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class="p-4 text-center text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-refresh-cw h-6 w-6 animate-spin mx-auto mb-2" aria-hidden="true"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"></path><path d="M8 16H3v5"></path></svg>로딩 중...</div></div></div></div></div></div><div class="flex-1 min-w-0"><div class="rounded-lg border bg-card text-card-foreground shadow-sm h-full"><div class="p-6 pt-0 flex items-center justify-center h-full"><div class="text-center text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square-pen h-12 w-12 mx-auto mb-4 opacity-50" aria-hidden="true"><path d="M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z"></path></svg><p class="text-lg">REQ 파일을 선택하세요</p><p class="text-sm">요청 파일을 선택하면 내용을 편집하고 재실행할 수 있습니다</p></div></div></div></div></div><!--$--><!--/$--><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><script src="/_next/static/chunks/e411019f55d87c42.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n4:I[5766,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\"],\"Toaster\"]\n5:I[47257,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"ClientPageRoot\"]\n6:I[31713,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\",\"/_next/static/chunks/f1ac9047ac4a3fde.js\",\"/_next/static/chunks/b6c0459f3789d25c.js\"],\"default\"]\n9:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"OutletBoundary\"]\nb:I[11533,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"AsyncMetadataOutlet\"]\nd:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"MetadataBoundary\"]\n10:\"$Sreact.suspense\"\n12:I[68027,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\"],\"default\"]\n:HL[\"/_next/static/chunks/b75131b58f8ca46a.css\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"WjvWEjPqhHNIE_a6QIZaG\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b75131b58f8ca46a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cdd12d5c1a5a6064.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"ko\",\"className\":\"dark h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden\",\"children\":[[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L4\",null,{\"position\":\"bottom-right\",\"toastOptions\":{\"duration\":4000,\"style\":{\"background\":\"hsl(var(--background))\",\"color\":\"hsl(var(--foreground))\",\"border\":\"1px solid hsl(var(--border))\"}}}]]}]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{\"Component\":\"$6\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/f1ac9047ac4a3fde.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/b6c0459f3789d25c.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$La\",[\"$\",\"$Lb\",null,{\"promise\":\"$@c\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$10\",null,{\"fallback\":null,\"children\":\"$L11\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$12\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b75131b58f8ca46a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"7:{}\n8:\"$0:f:0:1:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\na:null\n"])</script><script>self.__next_f.push([1,"13:I[27201,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"IconMark\"]\nc:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Payload Log Viewer\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Agent 로그 파일 뷰어 및 편집기\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L13\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"11:\"$c:metadata\"\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><!--dk9pnUd_sTmuTTbqEeL__--><html lang="ko" class="dark h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/b75131b58f8ca46a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/e411019f55d87c42.js"/><script src="/_next/static/chunks/103c802c8f4a5ea1.js" async=""></script><script src="/_next/static/chunks/305b077a9873cf54.js" async=""></script><script src="/_next/static/chunks/turbopack-0ac29803ce3c3c7a.js" async=""></script><script src="/_next/static/chunks/060f9a97930f3d04.js" async=""></script><script src="/_next/static/chunks/cdd12d5c1a5a6064.js" async=""></script><script src="/_next/static/chunks/f1ac9047ac4a3fde.js" async=""></script><script src="/_next/static/chunks/b6c0459f3789d25c.js" async=""></script><meta name="next-size-adjust" content=""/><title>Payload Log Viewer</title><meta name="description" content="AI Agent 로그 파일 뷰어 및 편집기"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="h-screen bg-background flex"><div class="flex-shrink-0 w-80 border-r border-border bg-background flex flex-col"><div class="flex-shrink-0 border-b border-border p-4"><h2 class="text-lg font-semibold flex items-center gap-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-text h-5 w-5" aria-hidden="true"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path></svg>로그 파일</h2><p class="text-sm text-muted-foreground">로딩 중...</p></div><div class="flex-1 min-h-0"><div dir="ltr" class="relative overflow-hidden h-full" style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="h-full w-full rounded-[inherit]" style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class="p-4 text-center text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-refresh-cw h-6 w-6 animate-spin mx-auto mb-2" aria-hidden="true"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"></path><path d="M8 16H3v5"></path></svg>로딩 중...</div></div></div></div></div></div><div class="flex-1 min-w-0"><div class="rounded-lg border bg-card text-card-foreground shadow-sm h-full"><div class="p-6 pt-0 flex items-center justify-center h-full"><div class="text-center text-muted-foreground"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square-pen h-12 w-12 mx-auto mb-4 opacity-50" aria-hidden="true"><path d="M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z"></path></svg><p class="text-lg">REQ 파일을 선택하세요</p><p class="text-sm">요청 파일을 선택하면 내용을 편집하고 재실행할 수 있습니다</p></div></div></div></div></div><!--$--><!--/$--><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><script src="/_next/static/chunks/e411019f55d87c42.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"default\"]\n4:I[5766,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\"],\"Toaster\"]\n5:I[47257,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"ClientPageRoot\"]\n6:I[31713,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\",\"/_next/static/chunks/f1ac9047ac4a3fde.js\",\"/_next/static/chunks/b6c0459f3789d25c.js\"],\"default\"]\n9:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"OutletBoundary\"]\nb:I[11533,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"AsyncMetadataOutlet\"]\nd:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"MetadataBoundary\"]\n10:\"$Sreact.suspense\"\n12:I[68027,[\"/_next/static/chunks/cdd12d5c1a5a6064.js\"],\"default\"]\n:HL[\"/_next/static/chunks/b75131b58f8ca46a.css\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"dk9pnUd-sTmuTTbqEeL__\",\"p\":\"\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b75131b58f8ca46a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cdd12d5c1a5a6064.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"ko\",\"className\":\"dark h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden\",\"children\":[[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L4\",null,{\"position\":\"bottom-right\",\"toastOptions\":{\"duration\":4000,\"style\":{\"background\":\"hsl(var(--background))\",\"color\":\"hsl(var(--foreground))\",\"border\":\"1px solid hsl(var(--border))\"}}}]]}]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{\"Component\":\"$6\",\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/f1ac9047ac4a3fde.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/b6c0459f3789d25c.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$La\",[\"$\",\"$Lb\",null,{\"promise\":\"$@c\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$10\",null,{\"fallback\":null,\"children\":\"$L11\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$12\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b75131b58f8ca46a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"7:{}\n8:\"$0:f:0:1:2:children:1:props:children:0:props:params\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\na:null\n"])</script><script>self.__next_f.push([1,"13:I[27201,[\"/_next/static/chunks/060f9a97930f3d04.js\"],\"IconMark\"]\nc:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Payload Log Viewer\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI Agent 로그 파일 뷰어 및 편집기\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L13\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"11:\"$c:metadata\"\n"])</script></body></html>
|
|
@@ -13,7 +13,7 @@ f:I[97367,["/_next/static/chunks/060f9a97930f3d04.js"],"MetadataBoundary"]
|
|
|
13
13
|
:HL["/_next/static/chunks/b75131b58f8ca46a.css","style"]
|
|
14
14
|
:HL["/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
15
15
|
:HL["/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
16
|
-
0:{"P":null,"b":"
|
|
16
|
+
0:{"P":null,"b":"dk9pnUd-sTmuTTbqEeL__","p":"","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/b75131b58f8ca46a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/cdd12d5c1a5a6064.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"ko","className":"dark h-full","children":["$","body",null,{"className":"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased h-screen overflow-hidden","children":[["$","$L2",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L4",null,{"position":"bottom-right","toastOptions":{"duration":4000,"style":{"background":"hsl(var(--background))","color":"hsl(var(--foreground))","border":"1px solid hsl(var(--border))"}}}]]}]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","searchParams":{},"params":{},"promises":["$@7","$@8"]}],[["$","script","script-0",{"src":"/_next/static/chunks/f1ac9047ac4a3fde.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/b6c0459f3789d25c.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$La",["$","$Lb",null,{"promise":"$@c"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Ld",null,{"children":"$Le"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$Lf",null,{"children":["$","div",null,{"hidden":true,"children":["$","$10",null,{"fallback":null,"children":"$L11"}]}]}]]}],false]],"m":"$undefined","G":["$12",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/b75131b58f8ca46a.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"s":false,"S":true}
|
|
17
17
|
7:{}
|
|
18
18
|
8:"$0:f:0:1:2:children:1:props:children:0:props:params"
|
|
19
19
|
e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
@@ -9,6 +9,56 @@ import { createDebugLogger } from '../../util/debug_log.js';
|
|
|
9
9
|
|
|
10
10
|
const debugLog = createDebugLogger('zai_converter.log', 'zai_converter');
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Convert snake_case to camelCase
|
|
14
|
+
* @param {string} str - snake_case string
|
|
15
|
+
* @returns {string} camelCase string
|
|
16
|
+
*/
|
|
17
|
+
function snakeToCamel(str) {
|
|
18
|
+
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Convert camelCase to snake_case
|
|
23
|
+
* @param {string} str - camelCase string
|
|
24
|
+
* @returns {string} snake_case string
|
|
25
|
+
*/
|
|
26
|
+
function camelToSnake(str) {
|
|
27
|
+
return str.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Recursively add both snake_case and camelCase keys to an object
|
|
32
|
+
* This ensures compatibility with functions expecting either naming convention
|
|
33
|
+
* @param {any} obj - Object to process
|
|
34
|
+
* @returns {any} Object with both key formats
|
|
35
|
+
*/
|
|
36
|
+
function addBothCaseKeys(obj) {
|
|
37
|
+
if (obj === null || typeof obj !== 'object') {
|
|
38
|
+
return obj;
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(obj)) {
|
|
41
|
+
return obj.map(item => addBothCaseKeys(item));
|
|
42
|
+
}
|
|
43
|
+
const result = {};
|
|
44
|
+
for (const key of Object.keys(obj)) {
|
|
45
|
+
const value = addBothCaseKeys(obj[key]);
|
|
46
|
+
// Add original key
|
|
47
|
+
result[key] = value;
|
|
48
|
+
// Add camelCase version if key is snake_case
|
|
49
|
+
const camelKey = snakeToCamel(key);
|
|
50
|
+
if (camelKey !== key) {
|
|
51
|
+
result[camelKey] = value;
|
|
52
|
+
}
|
|
53
|
+
// Add snake_case version if key is camelCase
|
|
54
|
+
const snakeKey = camelToSnake(key);
|
|
55
|
+
if (snakeKey !== key) {
|
|
56
|
+
result[snakeKey] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
12
62
|
/**
|
|
13
63
|
* Convert Responses API request to Z.AI format
|
|
14
64
|
* @param {Object} responsesRequest - Responses API format request
|
|
@@ -475,7 +525,9 @@ export function convertZaiResponseToResponsesFormat(zaiResponse, model = 'glm-4.
|
|
|
475
525
|
} else if (block.type === 'tool_use') {
|
|
476
526
|
if (wasJsonSchemaRequest && block.name === schemaName) {
|
|
477
527
|
// json_schema 요청의 tool_use는 outputText로만 변환
|
|
478
|
-
|
|
528
|
+
// Convert snake_case keys to camelCase
|
|
529
|
+
const convertedInput = addBothCaseKeys(block.input);
|
|
530
|
+
const jsonOutput = JSON.stringify(convertedInput);
|
|
479
531
|
messageContent.push({
|
|
480
532
|
type: 'output_text',
|
|
481
533
|
text: jsonOutput,
|
|
@@ -484,11 +536,18 @@ export function convertZaiResponseToResponsesFormat(zaiResponse, model = 'glm-4.
|
|
|
484
536
|
outputText = jsonOutput; // outputText를 JSON만으로 설정 (덮어쓰기)
|
|
485
537
|
} else {
|
|
486
538
|
// Z.AI uses 'call_' prefix for tool IDs
|
|
539
|
+
// Convert snake_case keys to camelCase (some models like GLM return snake_case)
|
|
540
|
+
const convertedInput = addBothCaseKeys(block.input);
|
|
541
|
+
const originalKeys = Object.keys(block.input || {}).join(',');
|
|
542
|
+
const convertedKeys = Object.keys(convertedInput || {}).join(',');
|
|
543
|
+
if (originalKeys !== convertedKeys) {
|
|
544
|
+
debugLog(`[convertResponse] Added both case keys: ${originalKeys} -> ${convertedKeys}`);
|
|
545
|
+
}
|
|
487
546
|
output.push({
|
|
488
547
|
id: `fc_${block.id}`,
|
|
489
548
|
type: 'function_call',
|
|
490
549
|
status: 'completed',
|
|
491
|
-
arguments: JSON.stringify(
|
|
550
|
+
arguments: JSON.stringify(convertedInput),
|
|
492
551
|
call_id: block.id,
|
|
493
552
|
name: block.name
|
|
494
553
|
});
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import dotenv from "dotenv";
|
|
2
|
-
import { request,
|
|
2
|
+
import { request, getModelForProvider } from "../system/ai_request.js";
|
|
3
3
|
import { getOrchestratorConversation } from "./orchestrator.js";
|
|
4
4
|
import { createSystemMessage } from "../util/prompt_loader.js";
|
|
5
5
|
import { createDebugLogger } from "../util/debug_log.js";
|
|
6
6
|
import { getCurrentTodos } from "../system/session_memory.js";
|
|
7
|
-
import { cleanupOrphanOutputs, trimConversation } from "../system/conversation_trimmer.js";
|
|
8
7
|
|
|
9
8
|
dotenv.config({ quiet: true });
|
|
10
9
|
|
|
@@ -30,16 +29,6 @@ export const completionJudgmentSchema = {
|
|
|
30
29
|
strict: true
|
|
31
30
|
};
|
|
32
31
|
|
|
33
|
-
// systemMessage는 judgeMissionCompletion 호출 시 동적으로 생성됨
|
|
34
|
-
|
|
35
|
-
const completionJudgeConversation = [];
|
|
36
|
-
let lastOrchestratorSnapshotLength = 0;
|
|
37
|
-
|
|
38
|
-
function cloneMessage(message) {
|
|
39
|
-
return JSON.parse(JSON.stringify(message));
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
32
|
async function createCompletionJudgeRequestOptions() {
|
|
44
33
|
const model = await getModelForProvider();
|
|
45
34
|
return {
|
|
@@ -50,76 +39,150 @@ async function createCompletionJudgeRequestOptions() {
|
|
|
50
39
|
}
|
|
51
40
|
|
|
52
41
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
42
|
+
* Orchestrator 대화에서 요약된 컨텍스트를 추출합니다.
|
|
43
|
+
* 전체 대화 대신 핵심 정보만 텍스트로 요약하여 반환합니다.
|
|
44
|
+
*
|
|
45
|
+
* @returns {Object} { toolExecutionSummary: string, lastAssistantMessage: string }
|
|
55
46
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
47
|
+
function extractSummarizedContext() {
|
|
48
|
+
debugLog(`[extractSummarizedContext] START`);
|
|
49
|
+
const sourceConversation = getOrchestratorConversation();
|
|
50
|
+
|
|
51
|
+
if (!Array.isArray(sourceConversation) || !sourceConversation.length) {
|
|
52
|
+
debugLog(`[extractSummarizedContext] No source conversation`);
|
|
53
|
+
return { toolExecutionSummary: '', lastAssistantMessage: '' };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
debugLog(`[extractSummarizedContext] Source conversation length: ${sourceConversation.length}`);
|
|
57
|
+
|
|
58
|
+
// 도구 실행 결과 추출
|
|
59
|
+
const toolExecutions = [];
|
|
60
|
+
const functionCalls = new Map(); // call_id -> { name, arguments }
|
|
61
|
+
|
|
62
|
+
for (const entry of sourceConversation) {
|
|
63
|
+
if (!entry) continue;
|
|
64
|
+
|
|
65
|
+
// function_call 정보 수집
|
|
66
|
+
if (entry.type === 'function_call') {
|
|
67
|
+
functionCalls.set(entry.call_id || entry.id, {
|
|
68
|
+
name: entry.name,
|
|
69
|
+
arguments: entry.arguments
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// function_call_output에서 결과 추출
|
|
74
|
+
if (entry.type === 'function_call_output') {
|
|
75
|
+
const callId = entry.call_id;
|
|
76
|
+
const callInfo = functionCalls.get(callId);
|
|
77
|
+
const toolName = callInfo?.name || 'unknown';
|
|
78
|
+
|
|
79
|
+
let success = true;
|
|
80
|
+
let exitCode = null;
|
|
81
|
+
let errorMessage = '';
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const output = JSON.parse(entry.output || '{}');
|
|
85
|
+
if (output.exit_code !== undefined) {
|
|
86
|
+
exitCode = output.exit_code;
|
|
87
|
+
success = exitCode === 0;
|
|
88
|
+
}
|
|
89
|
+
if (output.operation_successful === false) {
|
|
90
|
+
success = false;
|
|
91
|
+
}
|
|
92
|
+
if (output.error_message) {
|
|
93
|
+
errorMessage = output.error_message;
|
|
94
|
+
}
|
|
95
|
+
if (output.stderr && output.stderr.trim()) {
|
|
96
|
+
errorMessage = output.stderr.substring(0, 100);
|
|
97
|
+
}
|
|
98
|
+
} catch (e) {
|
|
99
|
+
// JSON 파싱 실패 시 무시
|
|
66
100
|
}
|
|
67
|
-
]
|
|
68
|
-
};
|
|
69
101
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
102
|
+
// 인자에서 주요 정보 추출 (파일 경로 등)
|
|
103
|
+
let targetInfo = '';
|
|
104
|
+
if (callInfo?.arguments) {
|
|
105
|
+
try {
|
|
106
|
+
const args = JSON.parse(callInfo.arguments);
|
|
107
|
+
if (args.file_path) targetInfo = ` (${args.file_path})`;
|
|
108
|
+
else if (args.path) targetInfo = ` (${args.path})`;
|
|
109
|
+
else if (args.script) targetInfo = ` (bash)`;
|
|
110
|
+
else if (args.code) targetInfo = ` (python)`;
|
|
111
|
+
} catch (e) {}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const status = success ? '✓' : '✗';
|
|
115
|
+
const exitCodeStr = exitCode !== null ? ` [exit=${exitCode}]` : '';
|
|
116
|
+
const errorStr = !success && errorMessage ? ` - ${errorMessage}` : '';
|
|
117
|
+
|
|
118
|
+
toolExecutions.push(`${status} ${toolName}${targetInfo}${exitCodeStr}${errorStr}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 마지막 assistant 메시지 추출
|
|
123
|
+
let lastAssistantMessage = '';
|
|
124
|
+
for (let i = sourceConversation.length - 1; i >= 0; i--) {
|
|
125
|
+
const entry = sourceConversation[i];
|
|
126
|
+
if (entry?.type === 'message' && entry?.role === 'assistant') {
|
|
127
|
+
const textContent = entry.content?.find(c => c.type === 'output_text');
|
|
128
|
+
if (textContent?.text) {
|
|
129
|
+
lastAssistantMessage = textContent.text;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
80
132
|
}
|
|
81
133
|
}
|
|
134
|
+
|
|
135
|
+
const toolExecutionSummary = toolExecutions.length > 0
|
|
136
|
+
? toolExecutions.join('\n')
|
|
137
|
+
: '(도구 실행 없음)';
|
|
138
|
+
|
|
139
|
+
debugLog(`[extractSummarizedContext] Tool executions: ${toolExecutions.length}`);
|
|
140
|
+
debugLog(`[extractSummarizedContext] Last assistant message length: ${lastAssistantMessage.length}`);
|
|
141
|
+
debugLog(`[extractSummarizedContext] END`);
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
toolExecutionSummary,
|
|
145
|
+
lastAssistantMessage
|
|
146
|
+
};
|
|
82
147
|
}
|
|
83
148
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
debugLog(`[syncOrchestratorConversation] Current completionJudge conversation length: ${completionJudgeConversation.length}`);
|
|
149
|
+
/**
|
|
150
|
+
* 요약된 컨텍스트를 사용자 메시지로 포맷팅합니다.
|
|
151
|
+
*/
|
|
152
|
+
function buildContextMessage(mission, summarizedContext, currentTodos) {
|
|
153
|
+
const parts = [];
|
|
90
154
|
|
|
91
|
-
|
|
92
|
-
debugLog(`[syncOrchestratorConversation] No source conversation to sync`);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
155
|
+
parts.push(`## 원래 사용자 요청\n${mission}`);
|
|
95
156
|
|
|
96
|
-
|
|
97
|
-
for (let i = lastOrchestratorSnapshotLength; i < sourceConversation.length; i++) {
|
|
98
|
-
const entry = sourceConversation[i];
|
|
99
|
-
if (!entry) continue;
|
|
157
|
+
parts.push(`\n## 실행된 도구들\n${summarizedContext.toolExecutionSummary}`);
|
|
100
158
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
159
|
+
if (summarizedContext.lastAssistantMessage) {
|
|
160
|
+
// 너무 길면 truncate
|
|
161
|
+
const maxLength = 2000;
|
|
162
|
+
let assistantMsg = summarizedContext.lastAssistantMessage;
|
|
163
|
+
if (assistantMsg.length > maxLength) {
|
|
164
|
+
assistantMsg = assistantMsg.substring(0, maxLength) + '\n... (truncated)';
|
|
105
165
|
}
|
|
166
|
+
parts.push(`\n## 에이전트의 마지막 응답\n${assistantMsg}`);
|
|
167
|
+
}
|
|
106
168
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
169
|
+
if (currentTodos && currentTodos.length > 0) {
|
|
170
|
+
const todoList = currentTodos.map((todo, index) => {
|
|
171
|
+
const statusIcon = todo.status === 'completed' ? '✓' :
|
|
172
|
+
todo.status === 'in_progress' ? '→' : '○';
|
|
173
|
+
return `${index + 1}. [${statusIcon}] ${todo.content} (${todo.status})`;
|
|
174
|
+
}).join('\n');
|
|
175
|
+
parts.push(`\n## 현재 TODO 상태\n${todoList}`);
|
|
112
176
|
}
|
|
113
177
|
|
|
114
|
-
|
|
115
|
-
debugLog(`[syncOrchestratorConversation] Synced ${syncedCount} entries, new snapshot length: ${lastOrchestratorSnapshotLength}`);
|
|
116
|
-
debugLog(`[syncOrchestratorConversation] CompletionJudge conversation now has ${completionJudgeConversation.length} entries`);
|
|
117
|
-
debugLog(`[syncOrchestratorConversation] END`);
|
|
178
|
+
return parts.join('\n');
|
|
118
179
|
}
|
|
119
180
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
181
|
+
/**
|
|
182
|
+
* 독립적인 컨텍스트로 completion judge 요청을 보냅니다.
|
|
183
|
+
* Orchestrator 대화를 복사하지 않고, 요약된 정보만 전달합니다.
|
|
184
|
+
*/
|
|
185
|
+
async function dispatchCompletionJudgeRequest(options, summarizedContext) {
|
|
123
186
|
debugLog(`[dispatchCompletionJudgeRequest] START`);
|
|
124
187
|
|
|
125
188
|
if (!options) {
|
|
@@ -127,113 +190,89 @@ async function dispatchCompletionJudgeRequest(options) {
|
|
|
127
190
|
throw new Error('Completion judge request options not initialized.');
|
|
128
191
|
}
|
|
129
192
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
let attemptCount = 0;
|
|
133
|
-
while (true) {
|
|
134
|
-
attemptCount++;
|
|
135
|
-
debugLog(`[dispatchCompletionJudgeRequest] Attempt ${attemptCount} - starting cleanup...`);
|
|
136
|
-
cleanupOrphanOutputs(completionJudgeConversation);
|
|
137
|
-
|
|
138
|
-
debugLog(`[dispatchCompletionJudgeRequest] Conversation has ${completionJudgeConversation.length} entries`);
|
|
139
|
-
|
|
140
|
-
// Conversation 구조 분석
|
|
141
|
-
const conversationTypes = {};
|
|
142
|
-
completionJudgeConversation.forEach(entry => {
|
|
143
|
-
const type = entry?.type || entry?.role || 'unknown';
|
|
144
|
-
conversationTypes[type] = (conversationTypes[type] || 0) + 1;
|
|
145
|
-
});
|
|
146
|
-
debugLog(`[dispatchCompletionJudgeRequest] Conversation structure: ${JSON.stringify(conversationTypes)}`);
|
|
147
|
-
|
|
148
|
-
// function_call_output 항목들 확인
|
|
149
|
-
const functionCallOutputs = completionJudgeConversation.filter(item => item.type === 'function_call_output');
|
|
150
|
-
debugLog(`[dispatchCompletionJudgeRequest] Found ${functionCallOutputs.length} function_call_output entries`);
|
|
151
|
-
|
|
152
|
-
functionCallOutputs.forEach((item, index) => {
|
|
153
|
-
debugLog(`[dispatchCompletionJudgeRequest] function_call_output[${index}] - call_id: ${item.call_id}, output length: ${item.output?.length || 0}, output preview: ${item.output?.substring(0, 200)}`);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
const { model, isGpt5Model, taskName } = options;
|
|
157
|
-
|
|
158
|
-
const requestPayload = {
|
|
159
|
-
model,
|
|
160
|
-
input: completionJudgeConversation,
|
|
161
|
-
text: {
|
|
162
|
-
format: {
|
|
163
|
-
type: "json_schema",
|
|
164
|
-
name: completionJudgmentSchema.name,
|
|
165
|
-
strict: completionJudgmentSchema.strict,
|
|
166
|
-
schema: completionJudgmentSchema.schema
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
reasoning: {},
|
|
170
|
-
tool_choice: "none",
|
|
171
|
-
tools: [],
|
|
172
|
-
top_p: 1,
|
|
173
|
-
store: true
|
|
174
|
-
};
|
|
193
|
+
const { model, isGpt5Model, taskName, systemMessage, mission, currentTodos } = options;
|
|
194
|
+
debugLog(`[dispatchCompletionJudgeRequest] Options - model: ${model}, taskName: ${taskName}`);
|
|
175
195
|
|
|
176
|
-
|
|
177
|
-
|
|
196
|
+
// 독립적인 대화 구성 (도구 호출 기록 없음)
|
|
197
|
+
const conversation = [
|
|
198
|
+
// System 메시지
|
|
199
|
+
{
|
|
200
|
+
role: "system",
|
|
201
|
+
content: [{ type: "input_text", text: systemMessage }]
|
|
202
|
+
},
|
|
203
|
+
// User 메시지: 요약된 컨텍스트
|
|
204
|
+
{
|
|
205
|
+
role: "user",
|
|
206
|
+
content: [{
|
|
207
|
+
type: "input_text",
|
|
208
|
+
text: buildContextMessage(mission, summarizedContext, currentTodos)
|
|
209
|
+
}]
|
|
178
210
|
}
|
|
211
|
+
];
|
|
179
212
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const apiDuration = Date.now() - apiStartTime;
|
|
190
|
-
debugLog(`[dispatchCompletionJudgeRequest] <<<<< API request successful in ${apiDuration}ms`);
|
|
191
|
-
debugLog(`[dispatchCompletionJudgeRequest] Response output_text length: ${response?.output_text?.length || 0}`);
|
|
192
|
-
debugLog(`[dispatchCompletionJudgeRequest] END - success`);
|
|
193
|
-
return response;
|
|
194
|
-
} catch (error) {
|
|
195
|
-
const apiDuration = Date.now() - apiStartTime;
|
|
196
|
-
debugLog(`[dispatchCompletionJudgeRequest] <<<<< API request FAILED after ${apiDuration}ms: ${error.message}`);
|
|
197
|
-
debugLog(`[dispatchCompletionJudgeRequest] Error name: ${error.name}, type: ${error?.constructor?.name}`);
|
|
198
|
-
|
|
199
|
-
// AbortError는 즉시 전파 (세션 중단)
|
|
200
|
-
if (error.name === 'AbortError') {
|
|
201
|
-
debugLog(`[dispatchCompletionJudgeRequest] Request aborted by user, propagating AbortError`);
|
|
202
|
-
throw error;
|
|
213
|
+
const requestPayload = {
|
|
214
|
+
model,
|
|
215
|
+
input: conversation,
|
|
216
|
+
text: {
|
|
217
|
+
format: {
|
|
218
|
+
type: "json_schema",
|
|
219
|
+
name: completionJudgmentSchema.name,
|
|
220
|
+
strict: completionJudgmentSchema.strict,
|
|
221
|
+
schema: completionJudgmentSchema.schema
|
|
203
222
|
}
|
|
223
|
+
},
|
|
224
|
+
reasoning: {},
|
|
225
|
+
tool_choice: "none",
|
|
226
|
+
tools: [],
|
|
227
|
+
top_p: 1,
|
|
228
|
+
store: true
|
|
229
|
+
};
|
|
204
230
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
}
|
|
231
|
+
if (!isGpt5Model) {
|
|
232
|
+
requestPayload.temperature = 0;
|
|
233
|
+
}
|
|
209
234
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
235
|
+
// 토큰 추정
|
|
236
|
+
const conversationJson = JSON.stringify(conversation);
|
|
237
|
+
const estimatedTokens = Math.ceil(conversationJson.length / 4);
|
|
238
|
+
debugLog(`[dispatchCompletionJudgeRequest] Estimated tokens: ${estimatedTokens} (conversation size: ${conversationJson.length} bytes)`);
|
|
239
|
+
|
|
240
|
+
const apiStartTime = Date.now();
|
|
241
|
+
debugLog(`[dispatchCompletionJudgeRequest] >>>>> Sending API request at ${new Date(apiStartTime).toISOString()}...`);
|
|
242
|
+
|
|
243
|
+
try {
|
|
244
|
+
const response = await request(taskName, requestPayload);
|
|
245
|
+
const apiDuration = Date.now() - apiStartTime;
|
|
246
|
+
debugLog(`[dispatchCompletionJudgeRequest] <<<<< API request successful in ${apiDuration}ms`);
|
|
247
|
+
debugLog(`[dispatchCompletionJudgeRequest] Response output_text length: ${response?.output_text?.length || 0}`);
|
|
248
|
+
debugLog(`[dispatchCompletionJudgeRequest] END - success`);
|
|
249
|
+
return response;
|
|
250
|
+
} catch (error) {
|
|
251
|
+
const apiDuration = Date.now() - apiStartTime;
|
|
252
|
+
debugLog(`[dispatchCompletionJudgeRequest] <<<<< API request FAILED after ${apiDuration}ms: ${error.message}`);
|
|
253
|
+
debugLog(`[dispatchCompletionJudgeRequest] Error name: ${error.name}, type: ${error?.constructor?.name}`);
|
|
254
|
+
|
|
255
|
+
// AbortError는 즉시 전파 (세션 중단)
|
|
256
|
+
if (error.name === 'AbortError') {
|
|
257
|
+
debugLog(`[dispatchCompletionJudgeRequest] Request aborted by user, propagating AbortError`);
|
|
258
|
+
throw error;
|
|
218
259
|
}
|
|
260
|
+
|
|
261
|
+
throw error;
|
|
219
262
|
}
|
|
220
263
|
}
|
|
221
264
|
|
|
265
|
+
// Legacy exports (하위 호환성 - 실제로는 더 이상 사용하지 않음)
|
|
222
266
|
export function resetCompletionJudgeConversation() {
|
|
223
|
-
|
|
224
|
-
lastOrchestratorSnapshotLength = 0;
|
|
267
|
+
// No-op: 독립 컨텍스트 방식에서는 대화를 유지하지 않음
|
|
225
268
|
}
|
|
226
269
|
|
|
227
270
|
export function getCompletionJudgeConversation() {
|
|
228
|
-
return
|
|
271
|
+
return [];
|
|
229
272
|
}
|
|
230
273
|
|
|
231
274
|
export function restoreCompletionJudgeConversation(savedConversation, savedSnapshotLength = 0) {
|
|
232
|
-
|
|
233
|
-
if (Array.isArray(savedConversation)) {
|
|
234
|
-
completionJudgeConversation.push(...savedConversation);
|
|
235
|
-
}
|
|
236
|
-
lastOrchestratorSnapshotLength = savedSnapshotLength;
|
|
275
|
+
// No-op: 독립 컨텍스트 방식에서는 복원할 대화가 없음
|
|
237
276
|
}
|
|
238
277
|
|
|
239
278
|
/**
|
|
@@ -249,47 +288,48 @@ export async function judgeMissionCompletion(templateVars = {}) {
|
|
|
249
288
|
debugLog('=== judgeMissionCompletion START =======');
|
|
250
289
|
debugLog('========================================');
|
|
251
290
|
debugLog(`[judgeMissionCompletion] Called with templateVars: ${JSON.stringify(Object.keys(templateVars))}`);
|
|
252
|
-
|
|
253
|
-
|
|
291
|
+
|
|
292
|
+
const mission = templateVars.what_user_requests || '';
|
|
293
|
+
if (mission) {
|
|
294
|
+
debugLog(`[judgeMissionCompletion] what_user_requests: ${mission.substring(0, 200)}`);
|
|
254
295
|
}
|
|
255
296
|
|
|
256
297
|
try {
|
|
257
298
|
debugLog(`[judgeMissionCompletion] Creating request options...`);
|
|
258
|
-
const
|
|
259
|
-
debugLog(`[judgeMissionCompletion] Request options - model: ${
|
|
299
|
+
const baseOptions = await createCompletionJudgeRequestOptions();
|
|
300
|
+
debugLog(`[judgeMissionCompletion] Request options - model: ${baseOptions.model}, isGpt5Model: ${baseOptions.isGpt5Model}`);
|
|
260
301
|
|
|
261
|
-
// 현재 todos를
|
|
302
|
+
// 현재 todos를 가져옴
|
|
262
303
|
const currentTodos = getCurrentTodos();
|
|
263
304
|
debugLog(`[judgeMissionCompletion] Current todos count: ${currentTodos.length}`);
|
|
264
305
|
|
|
265
|
-
//
|
|
306
|
+
// 시스템 메시지 로드
|
|
266
307
|
const enhancedTemplateVars = {
|
|
267
308
|
...templateVars,
|
|
268
309
|
currentTodos: currentTodos
|
|
269
310
|
};
|
|
311
|
+
const systemMessageObj = await createSystemMessage("completion_judge.txt", enhancedTemplateVars);
|
|
312
|
+
debugLog(`[judgeMissionCompletion] System message loaded`);
|
|
313
|
+
|
|
314
|
+
// Orchestrator 대화에서 요약된 컨텍스트 추출
|
|
315
|
+
debugLog(`[judgeMissionCompletion] Extracting summarized context...`);
|
|
316
|
+
const summarizedContext = extractSummarizedContext();
|
|
317
|
+
debugLog(`[judgeMissionCompletion] Context extracted - tools: ${summarizedContext.toolExecutionSummary.split('\n').length}, assistant msg len: ${summarizedContext.lastAssistantMessage.length}`);
|
|
318
|
+
|
|
319
|
+
// 옵션에 추가 정보 포함
|
|
320
|
+
const requestOptions = {
|
|
321
|
+
...baseOptions,
|
|
322
|
+
systemMessage: systemMessageObj.content,
|
|
323
|
+
mission: mission,
|
|
324
|
+
currentTodos: currentTodos
|
|
325
|
+
};
|
|
270
326
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
await ensureCompletionJudgeConversationInitialized(enhancedTemplateVars);
|
|
274
|
-
debugLog(`[judgeMissionCompletion] Conversation initialized, length: ${completionJudgeConversation.length}`);
|
|
275
|
-
|
|
276
|
-
// Orchestrator의 대화 내용 동기화 (system 메시지 제외)
|
|
277
|
-
debugLog(`[judgeMissionCompletion] Syncing orchestrator conversation...`);
|
|
278
|
-
syncOrchestratorConversation();
|
|
279
|
-
debugLog(`[judgeMissionCompletion] Sync complete, conversation length: ${completionJudgeConversation.length}`);
|
|
280
|
-
|
|
281
|
-
debugLog(`[judgeMissionCompletion] Sending request with ${completionJudgeConversation.length} conversation entries`);
|
|
282
|
-
|
|
283
|
-
const response = await dispatchCompletionJudgeRequest(requestOptions);
|
|
327
|
+
debugLog(`[judgeMissionCompletion] Sending request with summarized context...`);
|
|
328
|
+
const response = await dispatchCompletionJudgeRequest(requestOptions, summarizedContext);
|
|
284
329
|
|
|
285
330
|
debugLog(`[judgeMissionCompletion] Received response, parsing output_text`);
|
|
286
331
|
debugLog(`[judgeMissionCompletion] Raw output_text: ${response.output_text?.substring(0, 500)}`);
|
|
287
332
|
|
|
288
|
-
// Completion judge 자신의 응답은 히스토리에 추가하지 않음 (Orchestrator와 동일한 히스토리 유지)
|
|
289
|
-
// 대화 기록 초기화 (다음 판단을 위해)
|
|
290
|
-
debugLog(`[judgeMissionCompletion] Resetting completion judge conversation...`);
|
|
291
|
-
resetCompletionJudgeConversation();
|
|
292
|
-
|
|
293
333
|
try {
|
|
294
334
|
let outputText = response.output_text || '';
|
|
295
335
|
let judgment = null;
|
|
@@ -339,17 +379,23 @@ export async function judgeMissionCompletion(templateVars = {}) {
|
|
|
339
379
|
debugLog(`[judgeMissionCompletion] Parse error: ${parseError.message}`);
|
|
340
380
|
debugLog(`[judgeMissionCompletion] Failed to parse output_text as JSON`);
|
|
341
381
|
debugLog(`[judgeMissionCompletion] Raw output_text: ${response.output_text}`);
|
|
342
|
-
|
|
382
|
+
|
|
383
|
+
// JSON 파싱 실패 시 안전하게 완료 처리 (무한 루프 방지)
|
|
384
|
+
// orchestrator가 이미 message만 반환한 시점이므로 완료로 처리
|
|
385
|
+
debugLog(`[judgeMissionCompletion] Defaulting to complete to prevent infinite loop`);
|
|
386
|
+
|
|
387
|
+
debugLog('========================================');
|
|
388
|
+
debugLog('=== judgeMissionCompletion END (PARSE_ERROR) =');
|
|
389
|
+
debugLog('========================================');
|
|
390
|
+
debugLog('');
|
|
391
|
+
|
|
392
|
+
return { shouldComplete: true, whatUserShouldSay: "" };
|
|
343
393
|
}
|
|
344
394
|
|
|
345
395
|
} catch (error) {
|
|
346
396
|
debugLog(`[judgeMissionCompletion] ERROR: ${error.message}, error.name: ${error.name}`);
|
|
347
397
|
debugLog(`[judgeMissionCompletion] Error stack: ${error.stack}`);
|
|
348
398
|
|
|
349
|
-
// 에러 발생 시 대화 기록 초기화
|
|
350
|
-
debugLog(`[judgeMissionCompletion] Resetting completion judge conversation due to error...`);
|
|
351
|
-
resetCompletionJudgeConversation();
|
|
352
|
-
|
|
353
399
|
// AbortError는 즉시 전파 (세션 중단)
|
|
354
400
|
if (error.name === 'AbortError') {
|
|
355
401
|
debugLog(`[judgeMissionCompletion] AbortError detected, propagating to caller`);
|
|
@@ -360,15 +406,15 @@ export async function judgeMissionCompletion(templateVars = {}) {
|
|
|
360
406
|
throw error;
|
|
361
407
|
}
|
|
362
408
|
|
|
363
|
-
// 다른 에러 발생 시 안전하게
|
|
364
|
-
debugLog(`[judgeMissionCompletion] Non-abort error, returning safe default (shouldComplete=
|
|
409
|
+
// 다른 에러 발생 시 안전하게 완료 처리 (무한 루프 방지)
|
|
410
|
+
debugLog(`[judgeMissionCompletion] Non-abort error, returning safe default (shouldComplete=true to prevent loop)`);
|
|
365
411
|
debugLog('========================================');
|
|
366
412
|
debugLog('=== judgeMissionCompletion END (ERROR) =');
|
|
367
413
|
debugLog('========================================');
|
|
368
414
|
debugLog('');
|
|
369
415
|
|
|
370
416
|
return {
|
|
371
|
-
shouldComplete:
|
|
417
|
+
shouldComplete: true,
|
|
372
418
|
whatUserShouldSay: ""
|
|
373
419
|
};
|
|
374
420
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|