@infinitedusky/indusk-mcp 1.36.0 → 1.36.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/admin/.next/BUILD_ID +1 -1
  2. package/admin/.next/build-manifest.json +3 -3
  3. package/admin/.next/fallback-build-manifest.json +3 -3
  4. package/admin/.next/server/app/_global-error.html +1 -1
  5. package/admin/.next/server/app/_global-error.rsc +1 -1
  6. package/admin/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/admin/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/admin/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/admin/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/admin/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/admin/.next/server/chunks/ssr/[root-of-the-server]__0f9b~qs._.js +1 -1
  12. package/admin/.next/server/chunks/ssr/[root-of-the-server]__0f9b~qs._.js.map +1 -1
  13. package/admin/.next/server/middleware-build-manifest.js +3 -3
  14. package/admin/.next/server/pages/500.html +1 -1
  15. package/admin/.next/trace +1 -1
  16. package/admin/.next/trace-build +1 -1
  17. package/dist/bin/cli.js +15 -1
  18. package/dist/bin/commands/init.js +3 -4
  19. package/dist/bin/commands/telemetry.d.ts +14 -0
  20. package/dist/bin/commands/telemetry.js +35 -2
  21. package/dist/bin/commands/update.js +1 -15
  22. package/dist/lib/config.d.ts +0 -10
  23. package/dist/lib/eval/findings.d.ts +1 -2
  24. package/dist/lib/eval/findings.js +1 -2
  25. package/dist/lib/eval/prompt-builder.d.ts +4 -3
  26. package/dist/lib/eval/prompt-builder.js +4 -3
  27. package/dist/lib/telemetry/daemon.d.ts +25 -0
  28. package/dist/lib/telemetry/daemon.js +42 -0
  29. package/dist/lib/telemetry/orphans.d.ts +64 -0
  30. package/dist/lib/telemetry/orphans.js +82 -0
  31. package/extensions/local-telemetry/manifest.json +2 -2
  32. package/package.json +2 -2
  33. /package/admin/.next/static/{NhCz5cvfQdZYJkuB2tJCx → b30fOo0tUhHOxiaUT2sKQ}/_buildManifest.js +0 -0
  34. /package/admin/.next/static/{NhCz5cvfQdZYJkuB2tJCx → b30fOo0tUhHOxiaUT2sKQ}/_clientMiddlewareManifest.js +0 -0
  35. /package/admin/.next/static/{NhCz5cvfQdZYJkuB2tJCx → b30fOo0tUhHOxiaUT2sKQ}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- NhCz5cvfQdZYJkuB2tJCx
1
+ b30fOo0tUhHOxiaUT2sKQ
@@ -7,9 +7,9 @@
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/NhCz5cvfQdZYJkuB2tJCx/_buildManifest.js",
11
- "static/NhCz5cvfQdZYJkuB2tJCx/_ssgManifest.js",
12
- "static/NhCz5cvfQdZYJkuB2tJCx/_clientMiddlewareManifest.js"
10
+ "static/b30fOo0tUhHOxiaUT2sKQ/_buildManifest.js",
11
+ "static/b30fOo0tUhHOxiaUT2sKQ/_ssgManifest.js",
12
+ "static/b30fOo0tUhHOxiaUT2sKQ/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/15r3deq0oc~d..js",
@@ -5,9 +5,9 @@
5
5
  "devFiles": [],
6
6
  "polyfillFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/NhCz5cvfQdZYJkuB2tJCx/_buildManifest.js",
9
- "static/NhCz5cvfQdZYJkuB2tJCx/_ssgManifest.js",
10
- "static/NhCz5cvfQdZYJkuB2tJCx/_clientMiddlewareManifest.js"
8
+ "static/b30fOo0tUhHOxiaUT2sKQ/_buildManifest.js",
9
+ "static/b30fOo0tUhHOxiaUT2sKQ/_ssgManifest.js",
10
+ "static/b30fOo0tUhHOxiaUT2sKQ/_clientMiddlewareManifest.js"
11
11
  ],
12
12
  "rootMainFiles": []
13
13
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/15r3deq0oc~d..js"/><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/0gomaooulfzoq.js" async=""></script><script src="/_next/static/chunks/turbopack-130jszne6su0h.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/15r3deq0oc~d..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[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$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\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"NhCz5cvfQdZYJkuB2tJCx\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/15r3deq0oc~d..js"/><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/0gomaooulfzoq.js" async=""></script><script src="/_next/static/chunks/turbopack-130jszne6su0h.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/15r3deq0oc~d..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[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$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\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"b30fOo0tUhHOxiaUT2sKQ\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
@@ -6,7 +6,7 @@
6
6
  8:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"ViewportBoundary"]
7
7
  a:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"MetadataBoundary"]
8
8
  c:I[59179,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$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":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"NhCz5cvfQdZYJkuB2tJCx"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$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":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"b30fOo0tUhHOxiaUT2sKQ"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -1,5 +1,5 @@
1
1
  1:"$Sreact.fragment"
2
2
  2:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"OutletBoundary"]
3
3
  3:"$Sreact.suspense"
4
- 0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"NhCz5cvfQdZYJkuB2tJCx"}
4
+ 0:{"rsc":["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L2",null,{"children":["$","$3",null,{"name":"Next.MetadataOutlet","children":"$@4"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"b30fOo0tUhHOxiaUT2sKQ"}
5
5
  4:null
@@ -6,7 +6,7 @@
6
6
  8:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"ViewportBoundary"]
7
7
  a:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"MetadataBoundary"]
8
8
  c:I[59179,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default",1]
9
- 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$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":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"NhCz5cvfQdZYJkuB2tJCx"}
9
+ 0:{"P":null,"c":["","_global-error"],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]}],[["$","$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":[["$","$1","c",{"children":[["$","html",null,{"id":"__next_error__","children":[["$","head",null,{"children":[["$","title",null,{"children":"500: This page couldn’t load"}],["$","style",null,{"dangerouslySetInnerHTML":{"__html":":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }"}}]]}],["$","body",null,{"children":["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","display":"flex","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"style":{"marginTop":"-32px","maxWidth":"325px","padding":"32px 28px","textAlign":"left"},"children":[["$","svg",null,{"width":"32","height":"32","viewBox":"-0.2 -1.5 32 32","fill":"none","style":{"marginBottom":"24px"},"children":["$","path",null,{"d":"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z","fill":"var(--next-error-title)"}]}],["$","h1",null,{"style":{"fontSize":"24px","fontWeight":500,"letterSpacing":"-0.02em","lineHeight":"32px","margin":"0 0 12px 0","color":"var(--next-error-title)"},"children":"This page couldn’t load"}],["$","p",null,{"style":{"fontSize":"14px","fontWeight":400,"lineHeight":"21px","margin":"0 0 20px 0","color":"var(--next-error-message)"},"children":"A server error occurred. Reload to try again."}],["$","form",null,{"style":{"margin":0},"children":["$","button",null,{"type":"submit","style":{"display":"inline-flex","alignItems":"center","justifyContent":"center","height":"32px","padding":"0 12px","fontSize":"14px","fontWeight":500,"lineHeight":"20px","borderRadius":"6px","cursor":"pointer","color":"var(--next-error-btn-text)","background":"var(--next-error-btn-bg)","border":"var(--next-error-btn-border)"},"children":"Reload"}]}]]}]}]}]]}],null,["$","$L4",null,{"children":["$","$5",null,{"name":"Next.MetadataOutlet","children":"$@6"}]}]]}],{},null,false,null]},null,false,"$@7"],["$","$1","h",{"children":[null,["$","$L8",null,{"children":"$L9"}],["$","div",null,{"hidden":true,"children":["$","$La",null,{"children":["$","$5",null,{"name":"Next.Metadata","children":"$Lb"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$c",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"b30fOo0tUhHOxiaUT2sKQ"}
10
10
  d:[]
11
11
  7:"$Wd"
12
12
  9:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
@@ -3,4 +3,4 @@
3
3
  3:I[76614,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"MetadataBoundary"]
4
4
  4:"$Sreact.suspense"
5
5
  5:I[61299,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"IconMark"]
6
- 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"NhCz5cvfQdZYJkuB2tJCx"}
6
+ 0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","link","0",{"rel":"icon","href":"/favicon.ico?favicon.0x3dzn~oxb6tn.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","1",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"b30fOo0tUhHOxiaUT2sKQ"}
@@ -2,4 +2,4 @@
2
2
  2:I[85530,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default"]
3
3
  3:I[50571,["/_next/static/chunks/0.v8w524wvk94.js","/_next/static/chunks/0yelgl0o38y_u.js"],"default"]
4
4
  4:[]
5
- 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"NhCz5cvfQdZYJkuB2tJCx"}
5
+ 0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"b30fOo0tUhHOxiaUT2sKQ"}
@@ -1 +1 @@
1
- 0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"NhCz5cvfQdZYJkuB2tJCx"}
1
+ 0:{"tree":{"name":"","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}},"staleTime":300,"buildId":"b30fOo0tUhHOxiaUT2sKQ"}
@@ -1,3 +1,3 @@
1
- module.exports=[22301,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"InvariantError",{enumerable:!0,get:function(){return d}});class d extends Error{constructor(a,b){super(`Invariant: ${a.endsWith(".")?a:a+"."} This is a bug in Next.js.`,b),this.name="InvariantError"}}},93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},68406,a=>{a.v("/_next/static/media/favicon.0x3dzn~oxb6tn.ico"+(globalThis.NEXT_CLIENT_ASSET_SUFFIX||""))},97568,a=>{"use strict";let b={src:a.i(68406).default,width:256,height:256};a.s(["default",0,b])},74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},54779,a=>{"use strict";var b=a.i(44673),c=a.i(23272),d=a.i(20858),e=a.i(64309),f=a.i(57729);function g({scorecards:a,descriptions:c}){let d=[...a].sort((a,b)=>b.timestamp.localeCompare(a.timestamp));return(0,b.jsxs)("section",{className:"flex flex-col gap-4","data-testid":"scorecards-list",children:[(0,b.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,b.jsx)("h1",{className:"text-xl font-semibold text-gray-900",children:"Eval Scorecards"}),(0,b.jsxs)("p",{className:"text-sm text-gray-600",children:["Per-commit scores produced by the eval agent on every"," ",(0,b.jsx)("code",{className:"rounded bg-gray-100 px-1 text-xs font-mono",children:"jj describe"}),". This is a self-improvement signal — what worked, what didn't, what the system could improve. Not tied to any single plan."]}),(0,b.jsxs)("p",{className:"text-xs text-gray-500",children:["Source: ",(0,b.jsx)("span",{className:"font-mono",children:".indusk/eval/results.log"})," ","across every registered project (",d.length," entries, most recent first)"]})]}),0===d.length?(0,b.jsxs)("p",{className:"text-sm text-gray-500","data-testid":"scorecards-empty",children:["No scorecards yet — run a few"," ",(0,b.jsx)("code",{className:"font-mono",children:"jj describe"})," commands inside Claude Code, and they'll start appearing."]}):(0,b.jsx)("div",{className:"flex flex-col gap-2",children:d.map(a=>(0,b.jsx)(h,{card:a,jjDescription:a.changeId?c?.get(String(a.changeId)):void 0},`${a.timestamp}-${a.changeId??"unknown"}-${a.project??""}`))})]})}function h({card:a,jjDescription:f}){var g;let k,l=a.error?"error":"ok",m=a.summary??a.message,n=f?.split("\n")[0]?.trim()||m||"(no description)",o=Array.isArray(a.questions)?a.questions:[],p=(0,b.jsxs)("span",{className:"flex flex-1 items-center gap-2 truncate",children:[(0,b.jsx)("span",{className:"text-xs text-gray-500 font-mono shrink-0",children:Number.isNaN((k=new Date(g=a.timestamp)).getTime())?g:k.toISOString().replace("T"," ").replace(/\.\d+Z$/,"Z")}),a.project?(0,b.jsx)(d.Badge,{variant:"neutral","data-testid":"scorecard-project-label",className:"shrink-0",children:a.project}):null,(0,b.jsx)("span",{className:"text-xs text-gray-500 font-mono shrink-0",children:(a.changeId??"—").slice(0,8)}),(0,b.jsx)("span",{className:"text-sm text-gray-800 truncate",children:n})]}),q=(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[a.mode?(0,b.jsx)("span",{className:"text-xs text-gray-500",children:String(a.mode)}):null,(0,b.jsx)(d.Badge,{variant:"error"===l?"blocked":"passing",children:"error"===l?"✗ error":"✓ ok"})]});return(0,b.jsx)(e.CollapsibleSection,{title:p,headerRight:q,defaultOpen:!1,children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[f&&(0,b.jsxs)("section",{className:"rounded border border-blue-200 bg-blue-50 p-3","data-testid":"scorecard-commit-message",children:[(0,b.jsx)("h3",{className:"text-xs font-semibold uppercase tracking-wide text-blue-700",children:"Commit message"}),(0,b.jsx)("pre",{className:"mt-1 text-sm text-gray-800 whitespace-pre-wrap font-sans",children:f})]}),(0,b.jsx)(i,{card:a}),o.length>0&&(0,b.jsx)(j,{questions:o}),0===o.length&&(0,b.jsxs)("p",{className:"text-xs text-gray-500",children:["No question results recorded for this scorecard.",a.error?" The eval run errored before producing a structured scorecard — see the message below.":""]}),a.error&&a.message?(0,b.jsx)("pre",{className:"overflow-x-auto rounded bg-red-50 p-3 text-xs font-mono text-red-800 whitespace-pre-wrap",children:String(a.message)}):null,a.error||f||!m?null:(0,b.jsx)(c.Markdown,{children:`**Eval-agent summary:** ${m}`})]})})}function i({card:a}){let c=[["Change",a.changeId?String(a.changeId):void 0],["Timestamp",a.timestamp],["Mode",a.mode?String(a.mode):void 0],["Graphiti writes","number"==typeof a.graphitiWrites?a.graphitiWrites:void 0],["Project group",a.projectGroup?String(a.projectGroup):void 0]];return(0,b.jsx)("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-gray-700 sm:grid-cols-3",children:c.filter(([,a])=>void 0!==a&&""!==a).map(([a,c])=>(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("dt",{className:"font-semibold text-gray-500 uppercase tracking-wide",children:a}),(0,b.jsx)("dd",{className:"font-mono break-all",children:String(c)})]},a))})}function j({questions:a}){return(0,b.jsxs)(f.Table,{children:[(0,b.jsx)(f.TableHeader,{children:(0,b.jsxs)(f.TableRow,{children:[(0,b.jsx)(f.TableHead,{children:"Question"}),(0,b.jsx)(f.TableHead,{children:"Answer"}),(0,b.jsx)(f.TableHead,{children:"Severity"}),(0,b.jsx)(f.TableHead,{children:"Finding / Evidence"})]})}),(0,b.jsx)(f.TableBody,{children:a.map(a=>{let c;return(0,b.jsxs)(f.TableRow,{children:[(0,b.jsx)(f.TableCell,{children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("span",{className:"font-semibold text-xs text-gray-900",children:a.id??"—"}),a.question&&(0,b.jsx)("span",{className:"text-xs text-gray-600",children:a.question})]})}),(0,b.jsx)(f.TableCell,{children:a.answer??"—"}),(0,b.jsx)(f.TableCell,{children:(0,b.jsx)(d.Badge,{variant:"high"===(c=(a.severity??"").toLowerCase())||"critical"===c||"blocker"===c?"blocked":"medium"===c||"warn"===c||"warning"===c?"writable":"low"===c||"info"===c||"ok"===c?"passing":"neutral",children:a.severity??"—"})}),(0,b.jsx)(f.TableCell,{children:(0,b.jsxs)("div",{className:"flex flex-col gap-1",children:[a.finding&&(0,b.jsx)("span",{className:"text-sm text-gray-800",children:a.finding}),a.evidence&&(0,b.jsxs)("span",{className:"text-xs text-gray-500 italic",children:["Evidence: ",a.evidence]})]})})]},a.id??`${a.question}-${a.answer}`)})})]})}var k=a.i(34011),l=a.i(42717),m=a.i(765),n=a.i(74533);async function o({params:a}){let{project:c}=await a,d=(0,m.getProjectPath)(c);if(!d||!(0,m.projectPathExists)(d))return(0,b.jsx)(k.StaleProjectFailurePage,{projectName:c,projectPath:d??void 0});let e=new Date(0),f=new Date(Date.now()+15768e7),h=await (0,l.readEvalScorecards)(d,{from:e,to:f}).catch(()=>[]),i=function(a,b){let c=new Map;for(let d of new Set(b)){let b=function(a,b){if(!b||!/^[a-z0-9]+$/i.test(b))return null;try{let c=(0,n.execFileSync)("jj",["log","-r",b,"--no-graph","-T","description","--ignore-working-copy"],{cwd:a,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim();if(""!==c)return c}catch{}try{let c=(0,n.execFileSync)("git",["log","-1","--format=%B",b],{cwd:a,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim();if(""!==c)return c}catch{}return null}(a,d);b&&c.set(d,b)}return c}(d,h.map(a=>a.changeId?String(a.changeId):"").filter(a=>""!==a));return 0===h.length?(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("h1",{className:"text-lg font-semibold text-gray-900",children:["Scorecards — ",c]}),(0,b.jsx)("p",{className:"text-sm text-gray-500",children:"No eval scorecards recorded for this project yet. Commit via `jj describe` to trigger the eval agent."})]}):(0,b.jsx)(g,{scorecards:h,descriptions:i})}a.s(["default",0,o],54779)},99459,a=>{a.n(a.i(54779))}];
1
+ module.exports=[22301,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"InvariantError",{enumerable:!0,get:function(){return d}});class d extends Error{constructor(a,b){super(`Invariant: ${a.endsWith(".")?a:a+"."} This is a bug in Next.js.`,b),this.name="InvariantError"}}},93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},68406,a=>{a.v("/_next/static/media/favicon.0x3dzn~oxb6tn.ico"+(globalThis.NEXT_CLIENT_ASSET_SUFFIX||""))},97568,a=>{"use strict";let b={src:a.i(68406).default,width:256,height:256};a.s(["default",0,b])},74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},54779,a=>{"use strict";var b=a.i(44673),c=a.i(23272),d=a.i(20858),e=a.i(64309),f=a.i(57729);function g({scorecards:a,descriptions:c}){let d=[...a].sort((a,b)=>b.timestamp.localeCompare(a.timestamp));return(0,b.jsxs)("section",{className:"flex flex-col gap-4","data-testid":"scorecards-list",children:[(0,b.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,b.jsx)("h1",{className:"text-xl font-semibold text-gray-900",children:"Eval Scorecards"}),(0,b.jsxs)("p",{className:"text-sm text-gray-600",children:["Per-commit scores produced by the eval agent on every"," ",(0,b.jsx)("code",{className:"rounded bg-gray-100 px-1 text-xs font-mono",children:"git commit"}),". This is a self-improvement signal — what worked, what didn't, what the system could improve. Not tied to any single plan."]}),(0,b.jsxs)("p",{className:"text-xs text-gray-500",children:["Source: ",(0,b.jsx)("span",{className:"font-mono",children:".indusk/eval/results.log"})," ","across every registered project (",d.length," entries, most recent first)"]})]}),0===d.length?(0,b.jsxs)("p",{className:"text-sm text-gray-500","data-testid":"scorecards-empty",children:["No scorecards yet — make a few"," ",(0,b.jsx)("code",{className:"font-mono",children:"git commit"}),"s inside Claude Code, and they'll start appearing."]}):(0,b.jsx)("div",{className:"flex flex-col gap-2",children:d.map(a=>(0,b.jsx)(h,{card:a,commitMessage:a.changeId?c?.get(String(a.changeId)):void 0},`${a.timestamp}-${a.changeId??"unknown"}-${a.project??""}`))})]})}function h({card:a,commitMessage:f}){var g;let k,l=a.error?"error":"ok",m=a.summary??a.message,n=f?.split("\n")[0]?.trim()||m||"(no description)",o=Array.isArray(a.questions)?a.questions:[],p=(0,b.jsxs)("span",{className:"flex flex-1 items-center gap-2 truncate",children:[(0,b.jsx)("span",{className:"text-xs text-gray-500 font-mono shrink-0",children:Number.isNaN((k=new Date(g=a.timestamp)).getTime())?g:k.toISOString().replace("T"," ").replace(/\.\d+Z$/,"Z")}),a.project?(0,b.jsx)(d.Badge,{variant:"neutral","data-testid":"scorecard-project-label",className:"shrink-0",children:a.project}):null,(0,b.jsx)("span",{className:"text-xs text-gray-500 font-mono shrink-0",children:(a.changeId??"—").slice(0,8)}),(0,b.jsx)("span",{className:"text-sm text-gray-800 truncate",children:n})]}),q=(0,b.jsxs)("span",{className:"flex items-center gap-2",children:[a.mode?(0,b.jsx)("span",{className:"text-xs text-gray-500",children:String(a.mode)}):null,(0,b.jsx)(d.Badge,{variant:"error"===l?"blocked":"passing",children:"error"===l?"✗ error":"✓ ok"})]});return(0,b.jsx)(e.CollapsibleSection,{title:p,headerRight:q,defaultOpen:!1,children:(0,b.jsxs)("div",{className:"flex flex-col gap-3",children:[f&&(0,b.jsxs)("section",{className:"rounded border border-blue-200 bg-blue-50 p-3","data-testid":"scorecard-commit-message",children:[(0,b.jsx)("h3",{className:"text-xs font-semibold uppercase tracking-wide text-blue-700",children:"Commit message"}),(0,b.jsx)("pre",{className:"mt-1 text-sm text-gray-800 whitespace-pre-wrap font-sans",children:f})]}),(0,b.jsx)(i,{card:a}),o.length>0&&(0,b.jsx)(j,{questions:o}),0===o.length&&(0,b.jsxs)("p",{className:"text-xs text-gray-500",children:["No question results recorded for this scorecard.",a.error?" The eval run errored before producing a structured scorecard — see the message below.":""]}),a.error&&a.message?(0,b.jsx)("pre",{className:"overflow-x-auto rounded bg-red-50 p-3 text-xs font-mono text-red-800 whitespace-pre-wrap",children:String(a.message)}):null,a.error||f||!m?null:(0,b.jsx)(c.Markdown,{children:`**Eval-agent summary:** ${m}`})]})})}function i({card:a}){let c=[["Change",a.changeId?String(a.changeId):void 0],["Timestamp",a.timestamp],["Mode",a.mode?String(a.mode):void 0],["Graphiti writes","number"==typeof a.graphitiWrites?a.graphitiWrites:void 0],["Project group",a.projectGroup?String(a.projectGroup):void 0]];return(0,b.jsx)("dl",{className:"grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-gray-700 sm:grid-cols-3",children:c.filter(([,a])=>void 0!==a&&""!==a).map(([a,c])=>(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("dt",{className:"font-semibold text-gray-500 uppercase tracking-wide",children:a}),(0,b.jsx)("dd",{className:"font-mono break-all",children:String(c)})]},a))})}function j({questions:a}){return(0,b.jsxs)(f.Table,{children:[(0,b.jsx)(f.TableHeader,{children:(0,b.jsxs)(f.TableRow,{children:[(0,b.jsx)(f.TableHead,{children:"Question"}),(0,b.jsx)(f.TableHead,{children:"Answer"}),(0,b.jsx)(f.TableHead,{children:"Severity"}),(0,b.jsx)(f.TableHead,{children:"Finding / Evidence"})]})}),(0,b.jsx)(f.TableBody,{children:a.map(a=>{let c;return(0,b.jsxs)(f.TableRow,{children:[(0,b.jsx)(f.TableCell,{children:(0,b.jsxs)("div",{className:"flex flex-col",children:[(0,b.jsx)("span",{className:"font-semibold text-xs text-gray-900",children:a.id??"—"}),a.question&&(0,b.jsx)("span",{className:"text-xs text-gray-600",children:a.question})]})}),(0,b.jsx)(f.TableCell,{children:a.answer??"—"}),(0,b.jsx)(f.TableCell,{children:(0,b.jsx)(d.Badge,{variant:"high"===(c=(a.severity??"").toLowerCase())||"critical"===c||"blocker"===c?"blocked":"medium"===c||"warn"===c||"warning"===c?"writable":"low"===c||"info"===c||"ok"===c?"passing":"neutral",children:a.severity??"—"})}),(0,b.jsx)(f.TableCell,{children:(0,b.jsxs)("div",{className:"flex flex-col gap-1",children:[a.finding&&(0,b.jsx)("span",{className:"text-sm text-gray-800",children:a.finding}),a.evidence&&(0,b.jsxs)("span",{className:"text-xs text-gray-500 italic",children:["Evidence: ",a.evidence]})]})})]},a.id??`${a.question}-${a.answer}`)})})]})}var k=a.i(34011),l=a.i(42717),m=a.i(765),n=a.i(74533);async function o({params:a}){let{project:c}=await a,d=(0,m.getProjectPath)(c);if(!d||!(0,m.projectPathExists)(d))return(0,b.jsx)(k.StaleProjectFailurePage,{projectName:c,projectPath:d??void 0});let e=new Date(0),f=new Date(Date.now()+15768e7),h=await (0,l.readEvalScorecards)(d,{from:e,to:f}).catch(()=>[]),i=function(a,b){let c=new Map;for(let d of new Set(b)){let b=function(a,b){if(!b||!/^[a-z0-9]+$/i.test(b))return null;try{let c=(0,n.execFileSync)("git",["log","-1","--format=%B",b],{cwd:a,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim();if(""!==c)return c}catch{}return null}(a,d);b&&c.set(d,b)}return c}(d,h.map(a=>a.changeId?String(a.changeId):"").filter(a=>""!==a));return 0===h.length?(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,b.jsxs)("h1",{className:"text-lg font-semibold text-gray-900",children:["Scorecards — ",c]}),(0,b.jsx)("p",{className:"text-sm text-gray-500",children:"No eval scorecards recorded for this project yet. Make a `git commit` to trigger the eval agent."})]}):(0,b.jsx)(g,{scorecards:h,descriptions:i})}a.s(["default",0,o],54779)},99459,a=>{a.n(a.i(54779))}];
2
2
 
3
3
  //# sourceMappingURL=%5Broot-of-the-server%5D__0f9b~qs._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../node_modules/.pnpm/next%4016.2.4_%40opentelemetry%2Bapi%401.9.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/shared/lib/invariant-error.ts","../../../../../../apps/indusk-admin/src/app/favicon.ico.mjs%20%28structured%20image%20object%29","../../../../../../apps/indusk-admin/src/components/Scorecards.tsx","../../../../../../apps/indusk-admin/src/app/p/%5Bproject%5D/scorecards/page.tsx","../../../../../../apps/indusk-admin/src/lib/vcs.ts"],"sourcesContent":["export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","import src from \"IMAGE\";\nexport default { src, width: 256, height: 256 }\n","import { Markdown } from \"@/components/Markdown\";\nimport { Badge, type BadgeVariant } from \"@/components/ui/Badge\";\nimport { CollapsibleSection } from \"@/components/ui/CollapsibleSection\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/Table\";\nimport type { Scorecard } from \"@/lib/planning-reader\";\n\n/**\n * Scorecard rendering. Used by the global /scorecards page (every scorecard\n * from `.indusk/eval/results.log`, framed as a system-improvement signal,\n * not as plan-specific data).\n *\n * Per the user's framing: scorecards are not relevant to any individual plan\n * — they're a feedback loop on the whole system. The `/scorecards` page is\n * the place where they live; PlanDetail no longer renders them.\n */\n\ninterface ScorecardQuestion {\n id?: string;\n question?: string;\n answer?: string;\n severity?: string;\n evidence?: string;\n finding?: string;\n}\n\nexport interface ScorecardsListProps {\n scorecards: Scorecard[];\n /**\n * Optional commit message per change-or-commit ID. Surfaces the human-\n * authored intent of the commit alongside the LLM-generated summary —\n * the real \"what was being scored\" signal. Resolved by `getCommitMessages`\n * in `src/lib/vcs.ts` (tries jj, falls back to git).\n */\n descriptions?: Map<string, string>;\n}\n\nexport function ScorecardsList({\n scorecards,\n descriptions,\n}: ScorecardsListProps) {\n // Most-recent-first sort (ISO 8601 timestamps sort lexicographically in\n // reverse). Done here so the page-level walker can pass an unsorted\n // union of per-project entries — the list owns the ordering contract.\n const sorted = [...scorecards].sort((a, b) =>\n b.timestamp.localeCompare(a.timestamp),\n );\n return (\n <section className=\"flex flex-col gap-4\" data-testid=\"scorecards-list\">\n <header className=\"flex flex-col gap-1\">\n <h1 className=\"text-xl font-semibold text-gray-900\">Eval Scorecards</h1>\n <p className=\"text-sm text-gray-600\">\n Per-commit scores produced by the eval agent on every{\" \"}\n <code className=\"rounded bg-gray-100 px-1 text-xs font-mono\">\n jj describe\n </code>\n . This is a self-improvement signal — what worked, what didn't, what\n the system could improve. Not tied to any single plan.\n </p>\n <p className=\"text-xs text-gray-500\">\n Source: <span className=\"font-mono\">.indusk/eval/results.log</span>{\" \"}\n across every registered project ({sorted.length} entries, most recent\n first)\n </p>\n </header>\n\n {sorted.length === 0 ? (\n <p className=\"text-sm text-gray-500\" data-testid=\"scorecards-empty\">\n No scorecards yet — run a few{\" \"}\n <code className=\"font-mono\">jj describe</code> commands inside Claude\n Code, and they'll start appearing.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {sorted.map((card) => (\n <ScorecardCard\n key={`${card.timestamp}-${card.changeId ?? \"unknown\"}-${card.project ?? \"\"}`}\n card={card}\n jjDescription={\n card.changeId\n ? descriptions?.get(String(card.changeId))\n : undefined\n }\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction ScorecardCard({\n card,\n jjDescription,\n}: {\n card: Scorecard;\n jjDescription?: string;\n}) {\n const status = card.error ? \"error\" : \"ok\";\n const llmSummary =\n (card.summary as string | undefined) ??\n (card.message as string | undefined);\n // Prefer the actual jj describe text when we have it — it's the human-\n // authored intent of the commit being scored. Fall back to the LLM-\n // generated summary, then to a placeholder.\n const headerLine =\n jjDescription?.split(\"\\n\")[0]?.trim() || llmSummary || \"(no description)\";\n const questions = Array.isArray(card.questions)\n ? (card.questions as ScorecardQuestion[])\n : [];\n const titleNode = (\n <span className=\"flex flex-1 items-center gap-2 truncate\">\n <span className=\"text-xs text-gray-500 font-mono shrink-0\">\n {formatTimestamp(card.timestamp)}\n </span>\n {card.project ? (\n <Badge\n variant=\"neutral\"\n data-testid=\"scorecard-project-label\"\n className=\"shrink-0\"\n >\n {card.project}\n </Badge>\n ) : null}\n <span className=\"text-xs text-gray-500 font-mono shrink-0\">\n {(card.changeId ?? \"—\").slice(0, 8)}\n </span>\n <span className=\"text-sm text-gray-800 truncate\">{headerLine}</span>\n </span>\n );\n const headerRight = (\n <span className=\"flex items-center gap-2\">\n {card.mode ? (\n <span className=\"text-xs text-gray-500\">{String(card.mode)}</span>\n ) : null}\n <Badge variant={status === \"error\" ? \"blocked\" : \"passing\"}>\n {status === \"error\" ? \"✗ error\" : \"✓ ok\"}\n </Badge>\n </span>\n );\n return (\n <CollapsibleSection\n title={titleNode}\n headerRight={headerRight}\n defaultOpen={false}\n >\n <div className=\"flex flex-col gap-3\">\n {jjDescription && (\n <section\n className=\"rounded border border-blue-200 bg-blue-50 p-3\"\n data-testid=\"scorecard-commit-message\"\n >\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-blue-700\">\n Commit message\n </h3>\n <pre className=\"mt-1 text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {jjDescription}\n </pre>\n </section>\n )}\n <ScorecardMeta card={card} />\n {questions.length > 0 && <ScorecardQuestions questions={questions} />}\n {questions.length === 0 && (\n <p className=\"text-xs text-gray-500\">\n No question results recorded for this scorecard.\n {card.error\n ? \" The eval run errored before producing a structured scorecard — see the message below.\"\n : \"\"}\n </p>\n )}\n {card.error && card.message ? (\n <pre className=\"overflow-x-auto rounded bg-red-50 p-3 text-xs font-mono text-red-800 whitespace-pre-wrap\">\n {String(card.message)}\n </pre>\n ) : null}\n {!card.error && !jjDescription && llmSummary ? (\n // Fallback when we couldn't resolve the commit message — show the\n // LLM-generated summary so the card isn't completely contextless.\n <Markdown>{`**Eval-agent summary:** ${llmSummary}`}</Markdown>\n ) : null}\n </div>\n </CollapsibleSection>\n );\n}\n\nfunction ScorecardMeta({ card }: { card: Scorecard }) {\n const fields: Array<[string, string | number | undefined]> = [\n [\"Change\", card.changeId ? String(card.changeId) : undefined],\n [\"Timestamp\", card.timestamp],\n [\"Mode\", card.mode ? String(card.mode) : undefined],\n [\n \"Graphiti writes\",\n typeof card.graphitiWrites === \"number\" ? card.graphitiWrites : undefined,\n ],\n [\n \"Project group\",\n card.projectGroup ? String(card.projectGroup) : undefined,\n ],\n ];\n return (\n <dl className=\"grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-gray-700 sm:grid-cols-3\">\n {fields\n .filter(([, v]) => v !== undefined && v !== \"\")\n .map(([k, v]) => (\n <div key={k} className=\"flex flex-col\">\n <dt className=\"font-semibold text-gray-500 uppercase tracking-wide\">\n {k}\n </dt>\n <dd className=\"font-mono break-all\">{String(v)}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\nfunction ScorecardQuestions({ questions }: { questions: ScorecardQuestion[] }) {\n return (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Question</TableHead>\n <TableHead>Answer</TableHead>\n <TableHead>Severity</TableHead>\n <TableHead>Finding / Evidence</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {questions.map((q) => (\n <TableRow key={q.id ?? `${q.question}-${q.answer}`}>\n <TableCell>\n <div className=\"flex flex-col\">\n <span className=\"font-semibold text-xs text-gray-900\">\n {q.id ?? \"—\"}\n </span>\n {q.question && (\n <span className=\"text-xs text-gray-600\">{q.question}</span>\n )}\n </div>\n </TableCell>\n <TableCell>{q.answer ?? \"—\"}</TableCell>\n <TableCell>\n <Badge variant={severityToBadge(q.severity)}>\n {q.severity ?? \"—\"}\n </Badge>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col gap-1\">\n {q.finding && (\n <span className=\"text-sm text-gray-800\">{q.finding}</span>\n )}\n {q.evidence && (\n <span className=\"text-xs text-gray-500 italic\">\n Evidence: {q.evidence}\n </span>\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nfunction severityToBadge(severity: string | undefined): BadgeVariant {\n const s = (severity ?? \"\").toLowerCase();\n if (s === \"high\" || s === \"critical\" || s === \"blocker\") return \"blocked\";\n if (s === \"medium\" || s === \"warn\" || s === \"warning\") return \"writable\";\n if (s === \"low\" || s === \"info\" || s === \"ok\") return \"passing\";\n return \"neutral\";\n}\n\nfunction formatTimestamp(ts: string): string {\n const d = new Date(ts);\n if (Number.isNaN(d.getTime())) return ts;\n return d\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d+Z$/, \"Z\");\n}\n","import { ScorecardsList } from \"@/components/Scorecards\";\nimport { StaleProjectFailurePage } from \"@/components/StaleProjectFailurePage\";\nimport { readEvalScorecards } from \"@/lib/planning-reader\";\nimport { getProjectPath, projectPathExists } from \"@/lib/registry-client\";\nimport { getCommitMessages } from \"@/lib/vcs\";\n\ninterface ScorecardsRouteProps {\n params: Promise<{ project: string }>;\n}\n\n/**\n * Per-project scorecards view — reads a single project's\n * `.indusk/eval/results.log` and renders the list. Replaces the Phase 4\n * cross-project `/scorecards` route, which is removed in Phase 6 as part\n * of the project-siloing move.\n *\n * Behavior parallels the per-project layout's stale-path handling: if the\n * project name isn't registered or its path no longer exists on disk,\n * render the same `<StaleProjectFailurePage>` (HTTP 200) that the rest of\n * the `/p/{project}/...` routes use — not a 404 or 500. Unregistered\n * `{project}` inside `/p/[project]/...` is an inherited contract from T11\n * and we keep it here.\n */\nexport default async function PerProjectScorecardsPage({\n params,\n}: ScorecardsRouteProps) {\n const { project } = await params;\n const projectPath = getProjectPath(project);\n\n if (!projectPath || !projectPathExists(projectPath)) {\n return (\n <StaleProjectFailurePage\n projectName={project}\n projectPath={projectPath ?? undefined}\n />\n );\n }\n\n const since = new Date(0);\n const until = new Date(Date.now() + 5 * 365 * 24 * 60 * 60 * 1000);\n\n const scorecards = await readEvalScorecards(projectPath, {\n from: since,\n to: until,\n }).catch(() => []);\n\n const ids = scorecards\n .map((s) => (s.changeId ? String(s.changeId) : \"\"))\n .filter((id) => id !== \"\");\n const messages = getCommitMessages(projectPath, ids);\n\n // Single-project view — deliberately omit the project-name label per row\n // (it'd be redundant noise since every scorecard belongs to {project}).\n // ScorecardsList handles `undefined` / missing `project` fields by not\n // rendering the label.\n if (scorecards.length === 0) {\n // Not an error — just no scorecards yet. Surface a calm empty state.\n return (\n <div className=\"flex flex-col gap-2\">\n <h1 className=\"text-lg font-semibold text-gray-900\">\n Scorecards — {project}\n </h1>\n <p className=\"text-sm text-gray-500\">\n No eval scorecards recorded for this project yet. Commit via `jj\n describe` to trigger the eval agent.\n </p>\n </div>\n );\n }\n\n return <ScorecardsList scorecards={scorecards} descriptions={messages} />;\n}\n","import { execFileSync } from \"node:child_process\";\n\n/**\n * Look up the commit message for a change-or-commit identifier.\n *\n * The eval agent fires on EITHER `jj describe` OR a git commit — both\n * produce a commit-like artifact with a message. The scorecard's\n * `changeId` is whichever the trigger captured. We try jj first (it's\n * the project default in dusk and InDusk-using repos) and fall back to\n * git (for repos where the trigger comes from a git commit instead).\n *\n * Returns `null` when:\n * - neither jj nor git resolves the id\n * - id is empty / non-alphanumeric\n * - both lookups fail (not a vcs repo, id abandoned, etc.)\n *\n * Both calls are read-only — `jj log --ignore-working-copy` doesn't snapshot,\n * and `git log` is always read-only.\n */\nexport function getCommitMessage(\n projectRoot: string,\n id: string,\n): string | null {\n if (!id || !/^[a-z0-9]+$/i.test(id)) return null;\n\n // Try jj first\n try {\n const out = execFileSync(\n \"jj\",\n [\n \"log\",\n \"-r\",\n id,\n \"--no-graph\",\n \"-T\",\n \"description\",\n \"--ignore-working-copy\",\n ],\n {\n cwd: projectRoot,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n },\n );\n const trimmed = out.trim();\n if (trimmed !== \"\") return trimmed;\n } catch {\n // jj missing or id not in jj — fall through to git\n }\n\n // Fall back to git\n try {\n const out = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%B\", id], {\n cwd: projectRoot,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n const trimmed = out.trim();\n if (trimmed !== \"\") return trimmed;\n } catch {\n // git missing or id not in git either\n }\n\n return null;\n}\n\n/**\n * Bulk-resolve commit messages for many ids. Deduplicates by id so the same\n * commit isn't queried twice per render.\n */\nexport function getCommitMessages(\n projectRoot: string,\n ids: string[],\n): Map<string, string> {\n const out = new Map<string, string>();\n for (const id of new Set(ids)) {\n const msg = getCommitMessage(projectRoot, id);\n if (msg) out.set(id, msg);\n }\n return out;\n}\n"],"names":["InvariantError","Error","constructor","message","options","endsWith","name","src","width","height","ScorecardsList","scorecards","descriptions","sorted","sort","a","b","timestamp","localeCompare","className","length","map","card","ScorecardCard","jjDescription","changeId","get","String","undefined","project","status","error","llmSummary","summary","headerLine","split","trim","questions","Array","isArray","titleNode","formatTimestamp","variant","slice","headerRight","mode","title","defaultOpen","ScorecardMeta","ScorecardQuestions","fields","graphitiWrites","projectGroup","filter","v","k","q","id","question","answer","severityToBadge","severity","finding","evidence","s","toLowerCase","ts","d","Date","Number","isNaN","getTime","toISOString","replace"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../../../node_modules/.pnpm/next%4016.2.4_%40opentelemetry%2Bapi%401.9.1_react-dom%4019.2.4_react%4019.2.4__react%4019.2.4/node_modules/next/src/shared/lib/invariant-error.ts","../../../../../../apps/indusk-admin/src/app/favicon.ico.mjs%20%28structured%20image%20object%29","../../../../../../apps/indusk-admin/src/components/Scorecards.tsx","../../../../../../apps/indusk-admin/src/app/p/%5Bproject%5D/scorecards/page.tsx","../../../../../../apps/indusk-admin/src/lib/vcs.ts"],"sourcesContent":["export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","import src from \"IMAGE\";\nexport default { src, width: 256, height: 256 }\n","import { Markdown } from \"@/components/Markdown\";\nimport { Badge, type BadgeVariant } from \"@/components/ui/Badge\";\nimport { CollapsibleSection } from \"@/components/ui/CollapsibleSection\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/Table\";\nimport type { Scorecard } from \"@/lib/planning-reader\";\n\n/**\n * Scorecard rendering. Used by the global /scorecards page (every scorecard\n * from `.indusk/eval/results.log`, framed as a system-improvement signal,\n * not as plan-specific data).\n *\n * Per the user's framing: scorecards are not relevant to any individual plan\n * — they're a feedback loop on the whole system. The `/scorecards` page is\n * the place where they live; PlanDetail no longer renders them.\n */\n\ninterface ScorecardQuestion {\n id?: string;\n question?: string;\n answer?: string;\n severity?: string;\n evidence?: string;\n finding?: string;\n}\n\nexport interface ScorecardsListProps {\n scorecards: Scorecard[];\n /**\n * Optional commit message per commit ID. Surfaces the human-authored\n * intent of the commit alongside the LLM-generated summary — the real\n * \"what was being scored\" signal. Resolved by `getCommitMessages` in\n * `src/lib/vcs.ts`.\n */\n descriptions?: Map<string, string>;\n}\n\nexport function ScorecardsList({\n scorecards,\n descriptions,\n}: ScorecardsListProps) {\n // Most-recent-first sort (ISO 8601 timestamps sort lexicographically in\n // reverse). Done here so the page-level walker can pass an unsorted\n // union of per-project entries — the list owns the ordering contract.\n const sorted = [...scorecards].sort((a, b) =>\n b.timestamp.localeCompare(a.timestamp),\n );\n return (\n <section className=\"flex flex-col gap-4\" data-testid=\"scorecards-list\">\n <header className=\"flex flex-col gap-1\">\n <h1 className=\"text-xl font-semibold text-gray-900\">Eval Scorecards</h1>\n <p className=\"text-sm text-gray-600\">\n Per-commit scores produced by the eval agent on every{\" \"}\n <code className=\"rounded bg-gray-100 px-1 text-xs font-mono\">\n git commit\n </code>\n . This is a self-improvement signal — what worked, what didn't, what\n the system could improve. Not tied to any single plan.\n </p>\n <p className=\"text-xs text-gray-500\">\n Source: <span className=\"font-mono\">.indusk/eval/results.log</span>{\" \"}\n across every registered project ({sorted.length} entries, most recent\n first)\n </p>\n </header>\n\n {sorted.length === 0 ? (\n <p className=\"text-sm text-gray-500\" data-testid=\"scorecards-empty\">\n No scorecards yet — make a few{\" \"}\n <code className=\"font-mono\">git commit</code>s inside Claude Code, and\n they'll start appearing.\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {sorted.map((card) => (\n <ScorecardCard\n key={`${card.timestamp}-${card.changeId ?? \"unknown\"}-${card.project ?? \"\"}`}\n card={card}\n commitMessage={\n card.changeId\n ? descriptions?.get(String(card.changeId))\n : undefined\n }\n />\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction ScorecardCard({\n card,\n commitMessage,\n}: {\n card: Scorecard;\n commitMessage?: string;\n}) {\n const status = card.error ? \"error\" : \"ok\";\n const llmSummary =\n (card.summary as string | undefined) ??\n (card.message as string | undefined);\n // Prefer the actual commit message when we have it — it's the human-\n // authored intent of the commit being scored. Fall back to the LLM-\n // generated summary, then to a placeholder.\n const headerLine =\n commitMessage?.split(\"\\n\")[0]?.trim() || llmSummary || \"(no description)\";\n const questions = Array.isArray(card.questions)\n ? (card.questions as ScorecardQuestion[])\n : [];\n const titleNode = (\n <span className=\"flex flex-1 items-center gap-2 truncate\">\n <span className=\"text-xs text-gray-500 font-mono shrink-0\">\n {formatTimestamp(card.timestamp)}\n </span>\n {card.project ? (\n <Badge\n variant=\"neutral\"\n data-testid=\"scorecard-project-label\"\n className=\"shrink-0\"\n >\n {card.project}\n </Badge>\n ) : null}\n <span className=\"text-xs text-gray-500 font-mono shrink-0\">\n {(card.changeId ?? \"—\").slice(0, 8)}\n </span>\n <span className=\"text-sm text-gray-800 truncate\">{headerLine}</span>\n </span>\n );\n const headerRight = (\n <span className=\"flex items-center gap-2\">\n {card.mode ? (\n <span className=\"text-xs text-gray-500\">{String(card.mode)}</span>\n ) : null}\n <Badge variant={status === \"error\" ? \"blocked\" : \"passing\"}>\n {status === \"error\" ? \"✗ error\" : \"✓ ok\"}\n </Badge>\n </span>\n );\n return (\n <CollapsibleSection\n title={titleNode}\n headerRight={headerRight}\n defaultOpen={false}\n >\n <div className=\"flex flex-col gap-3\">\n {commitMessage && (\n <section\n className=\"rounded border border-blue-200 bg-blue-50 p-3\"\n data-testid=\"scorecard-commit-message\"\n >\n <h3 className=\"text-xs font-semibold uppercase tracking-wide text-blue-700\">\n Commit message\n </h3>\n <pre className=\"mt-1 text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {commitMessage}\n </pre>\n </section>\n )}\n <ScorecardMeta card={card} />\n {questions.length > 0 && <ScorecardQuestions questions={questions} />}\n {questions.length === 0 && (\n <p className=\"text-xs text-gray-500\">\n No question results recorded for this scorecard.\n {card.error\n ? \" The eval run errored before producing a structured scorecard — see the message below.\"\n : \"\"}\n </p>\n )}\n {card.error && card.message ? (\n <pre className=\"overflow-x-auto rounded bg-red-50 p-3 text-xs font-mono text-red-800 whitespace-pre-wrap\">\n {String(card.message)}\n </pre>\n ) : null}\n {!card.error && !commitMessage && llmSummary ? (\n // Fallback when we couldn't resolve the commit message — show the\n // LLM-generated summary so the card isn't completely contextless.\n <Markdown>{`**Eval-agent summary:** ${llmSummary}`}</Markdown>\n ) : null}\n </div>\n </CollapsibleSection>\n );\n}\n\nfunction ScorecardMeta({ card }: { card: Scorecard }) {\n const fields: Array<[string, string | number | undefined]> = [\n [\"Change\", card.changeId ? String(card.changeId) : undefined],\n [\"Timestamp\", card.timestamp],\n [\"Mode\", card.mode ? String(card.mode) : undefined],\n [\n \"Graphiti writes\",\n typeof card.graphitiWrites === \"number\" ? card.graphitiWrites : undefined,\n ],\n [\n \"Project group\",\n card.projectGroup ? String(card.projectGroup) : undefined,\n ],\n ];\n return (\n <dl className=\"grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-gray-700 sm:grid-cols-3\">\n {fields\n .filter(([, v]) => v !== undefined && v !== \"\")\n .map(([k, v]) => (\n <div key={k} className=\"flex flex-col\">\n <dt className=\"font-semibold text-gray-500 uppercase tracking-wide\">\n {k}\n </dt>\n <dd className=\"font-mono break-all\">{String(v)}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\nfunction ScorecardQuestions({ questions }: { questions: ScorecardQuestion[] }) {\n return (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Question</TableHead>\n <TableHead>Answer</TableHead>\n <TableHead>Severity</TableHead>\n <TableHead>Finding / Evidence</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {questions.map((q) => (\n <TableRow key={q.id ?? `${q.question}-${q.answer}`}>\n <TableCell>\n <div className=\"flex flex-col\">\n <span className=\"font-semibold text-xs text-gray-900\">\n {q.id ?? \"—\"}\n </span>\n {q.question && (\n <span className=\"text-xs text-gray-600\">{q.question}</span>\n )}\n </div>\n </TableCell>\n <TableCell>{q.answer ?? \"—\"}</TableCell>\n <TableCell>\n <Badge variant={severityToBadge(q.severity)}>\n {q.severity ?? \"—\"}\n </Badge>\n </TableCell>\n <TableCell>\n <div className=\"flex flex-col gap-1\">\n {q.finding && (\n <span className=\"text-sm text-gray-800\">{q.finding}</span>\n )}\n {q.evidence && (\n <span className=\"text-xs text-gray-500 italic\">\n Evidence: {q.evidence}\n </span>\n )}\n </div>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nfunction severityToBadge(severity: string | undefined): BadgeVariant {\n const s = (severity ?? \"\").toLowerCase();\n if (s === \"high\" || s === \"critical\" || s === \"blocker\") return \"blocked\";\n if (s === \"medium\" || s === \"warn\" || s === \"warning\") return \"writable\";\n if (s === \"low\" || s === \"info\" || s === \"ok\") return \"passing\";\n return \"neutral\";\n}\n\nfunction formatTimestamp(ts: string): string {\n const d = new Date(ts);\n if (Number.isNaN(d.getTime())) return ts;\n return d\n .toISOString()\n .replace(\"T\", \" \")\n .replace(/\\.\\d+Z$/, \"Z\");\n}\n","import { ScorecardsList } from \"@/components/Scorecards\";\nimport { StaleProjectFailurePage } from \"@/components/StaleProjectFailurePage\";\nimport { readEvalScorecards } from \"@/lib/planning-reader\";\nimport { getProjectPath, projectPathExists } from \"@/lib/registry-client\";\nimport { getCommitMessages } from \"@/lib/vcs\";\n\ninterface ScorecardsRouteProps {\n params: Promise<{ project: string }>;\n}\n\n/**\n * Per-project scorecards view — reads a single project's\n * `.indusk/eval/results.log` and renders the list. Replaces the Phase 4\n * cross-project `/scorecards` route, which is removed in Phase 6 as part\n * of the project-siloing move.\n *\n * Behavior parallels the per-project layout's stale-path handling: if the\n * project name isn't registered or its path no longer exists on disk,\n * render the same `<StaleProjectFailurePage>` (HTTP 200) that the rest of\n * the `/p/{project}/...` routes use — not a 404 or 500. Unregistered\n * `{project}` inside `/p/[project]/...` is an inherited contract from T11\n * and we keep it here.\n */\nexport default async function PerProjectScorecardsPage({\n params,\n}: ScorecardsRouteProps) {\n const { project } = await params;\n const projectPath = getProjectPath(project);\n\n if (!projectPath || !projectPathExists(projectPath)) {\n return (\n <StaleProjectFailurePage\n projectName={project}\n projectPath={projectPath ?? undefined}\n />\n );\n }\n\n const since = new Date(0);\n const until = new Date(Date.now() + 5 * 365 * 24 * 60 * 60 * 1000);\n\n const scorecards = await readEvalScorecards(projectPath, {\n from: since,\n to: until,\n }).catch(() => []);\n\n const ids = scorecards\n .map((s) => (s.changeId ? String(s.changeId) : \"\"))\n .filter((id) => id !== \"\");\n const messages = getCommitMessages(projectPath, ids);\n\n // Single-project view — deliberately omit the project-name label per row\n // (it'd be redundant noise since every scorecard belongs to {project}).\n // ScorecardsList handles `undefined` / missing `project` fields by not\n // rendering the label.\n if (scorecards.length === 0) {\n // Not an error — just no scorecards yet. Surface a calm empty state.\n return (\n <div className=\"flex flex-col gap-2\">\n <h1 className=\"text-lg font-semibold text-gray-900\">\n Scorecards — {project}\n </h1>\n <p className=\"text-sm text-gray-500\">\n No eval scorecards recorded for this project yet. Make a `git commit`\n to trigger the eval agent.\n </p>\n </div>\n );\n }\n\n return <ScorecardsList scorecards={scorecards} descriptions={messages} />;\n}\n","import { execFileSync } from \"node:child_process\";\n\n/**\n * Look up the commit message for a commit identifier.\n *\n * The eval agent fires on `git commit`, so the scorecard's `changeId` is the\n * commit the trigger captured. Git is the only substrate as of 1.31.0.\n *\n * Returns `null` when:\n * - id is empty / non-alphanumeric\n * - git does not resolve it (not a repo, unknown commit, empty message)\n *\n * The call is read-only — `git log` never mutates.\n */\nexport function getCommitMessage(\n projectRoot: string,\n id: string,\n): string | null {\n if (!id || !/^[a-z0-9]+$/i.test(id)) return null;\n\n try {\n const out = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%B\", id], {\n cwd: projectRoot,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n const trimmed = out.trim();\n if (trimmed !== \"\") return trimmed;\n } catch {\n // git missing, not a repo, or id unknown\n }\n\n return null;\n}\n\n/**\n * Bulk-resolve commit messages for many ids. Deduplicates by id so the same\n * commit isn't queried twice per render.\n */\nexport function getCommitMessages(\n projectRoot: string,\n ids: string[],\n): Map<string, string> {\n const out = new Map<string, string>();\n for (const id of new Set(ids)) {\n const msg = getCommitMessage(projectRoot, id);\n if (msg) out.set(id, msg);\n }\n return out;\n}\n"],"names":["InvariantError","Error","constructor","message","options","endsWith","name","src","width","height","ScorecardsList","scorecards","descriptions","sorted","sort","a","b","timestamp","localeCompare","className","length","map","card","ScorecardCard","commitMessage","changeId","get","String","undefined","project","status","error","llmSummary","summary","headerLine","split","trim","questions","Array","isArray","titleNode","formatTimestamp","variant","slice","headerRight","mode","title","defaultOpen","ScorecardMeta","ScorecardQuestions","fields","graphitiWrites","projectGroup","filter","v","k","q","id","question","answer","severityToBadge","severity","finding","evidence","s","toLowerCase","ts","d","Date","Number","isNaN","getTime","toISOString","replace"],"mappings":"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","ignoreList":[0]}
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/NhCz5cvfQdZYJkuB2tJCx/_buildManifest.js",
11
- "static/NhCz5cvfQdZYJkuB2tJCx/_ssgManifest.js",
12
- "static/NhCz5cvfQdZYJkuB2tJCx/_clientMiddlewareManifest.js"
10
+ "static/b30fOo0tUhHOxiaUT2sKQ/_buildManifest.js",
11
+ "static/b30fOo0tUhHOxiaUT2sKQ/_ssgManifest.js",
12
+ "static/b30fOo0tUhHOxiaUT2sKQ/_clientMiddlewareManifest.js"
13
13
  ],
14
14
  "rootMainFiles": [
15
15
  "static/chunks/15r3deq0oc~d..js",
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/15r3deq0oc~d..js"/><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/0gomaooulfzoq.js" async=""></script><script src="/_next/static/chunks/turbopack-130jszne6su0h.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/15r3deq0oc~d..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[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$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\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"NhCz5cvfQdZYJkuB2tJCx\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/15r3deq0oc~d..js"/><script src="/_next/static/chunks/0_r.3~d-5z8~_.js" async=""></script><script src="/_next/static/chunks/02p8lah64~lvh.js" async=""></script><script src="/_next/static/chunks/0gomaooulfzoq.js" async=""></script><script src="/_next/static/chunks/turbopack-130jszne6su0h.js" async=""></script><script src="/_next/static/chunks/0.v8w524wvk94.js" async=""></script><script src="/_next/static/chunks/0yelgl0o38y_u.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: This page couldn’t load</title><link rel="icon" href="/favicon.ico?favicon.0x3dzn~oxb6tn.ico" sizes="256x256" type="image/x-icon"/><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/15r3deq0oc~d..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[85530,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n3:I[50571,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\"]\n4:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"ViewportBoundary\"]\na:I[76614,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"MetadataBoundary\"]\nc:I[59179,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"default\",1]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$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\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"b30fOo0tUhHOxiaUT2sKQ\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[61299,[\"/_next/static/chunks/0.v8w524wvk94.js\",\"/_next/static/chunks/0yelgl0o38y_u.js\"],\"IconMark\"]\n6:null\nb:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Le\",\"1\",{}]]\n"])</script></body></html>
package/admin/.next/trace CHANGED
@@ -1 +1 @@
1
- [{"name":"generate-buildid","duration":130,"timestamp":1764934818901,"id":4,"parentId":1,"tags":{},"startTime":1786568714970,"traceId":"a2b20363ee569704"},{"name":"load-custom-routes","duration":211,"timestamp":1764934819085,"id":5,"parentId":1,"tags":{},"startTime":1786568714970,"traceId":"a2b20363ee569704"},{"name":"create-dist-dir","duration":95,"timestamp":1764934819309,"id":6,"parentId":1,"tags":{},"startTime":1786568714970,"traceId":"a2b20363ee569704"},{"name":"clean","duration":35608,"timestamp":1764934819947,"id":7,"parentId":1,"tags":{},"startTime":1786568714971,"traceId":"a2b20363ee569704"},{"name":"discover-routes","duration":3880,"timestamp":1764934862346,"id":8,"parentId":1,"tags":{},"startTime":1786568715013,"traceId":"a2b20363ee569704"},{"name":"create-root-mapping","duration":31,"timestamp":1764934866257,"id":9,"parentId":1,"tags":{},"startTime":1786568715017,"traceId":"a2b20363ee569704"},{"name":"generate-route-types","duration":11792,"timestamp":1764934866950,"id":10,"parentId":1,"tags":{},"startTime":1786568715018,"traceId":"a2b20363ee569704"},{"name":"public-dir-conflict-check","duration":51,"timestamp":1764934878789,"id":11,"parentId":1,"tags":{},"startTime":1786568715029,"traceId":"a2b20363ee569704"},{"name":"generate-routes-manifest","duration":1264,"timestamp":1764934878887,"id":12,"parentId":1,"tags":{},"startTime":1786568715030,"traceId":"a2b20363ee569704"},{"name":"run-turbopack","duration":6120115,"timestamp":1764934881944,"id":14,"parentId":1,"tags":{},"startTime":1786568715033,"traceId":"a2b20363ee569704"},{"name":"turbopack-build-events","duration":53,"timestamp":1764935049886,"id":15,"parentId":1,"tags":{},"startTime":1786568715201,"traceId":"a2b20363ee569704"},{"name":"run-typescript","duration":2391241,"timestamp":1764941074217,"id":16,"parentId":1,"tags":{},"startTime":1786568721225,"traceId":"a2b20363ee569704"},{"name":"generate-required-server-files","duration":1956,"timestamp":1764943466780,"id":18,"parentId":1,"tags":{},"startTime":1786568723617,"traceId":"a2b20363ee569704"},{"name":"check-static-error-page","duration":14915,"timestamp":1764943484041,"id":20,"parentId":19,"tags":{},"startTime":1786568723635,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":177763,"timestamp":1764943505018,"id":30,"parentId":22,"tags":{},"startTime":1786568723656,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":191424,"timestamp":1764943491440,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1786568723642,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":225311,"timestamp":1764943504681,"id":29,"parentId":21,"tags":{},"startTime":1786568723655,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":241352,"timestamp":1764943488677,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1786568723639,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":224974,"timestamp":1764943505099,"id":31,"parentId":23,"tags":{},"startTime":1786568723656,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":235768,"timestamp":1764943494320,"id":23,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1786568723645,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":228240,"timestamp":1764943511503,"id":32,"parentId":28,"tags":{},"startTime":1786568723662,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":240882,"timestamp":1764943498892,"id":28,"parentId":19,"tags":{"page":"/"},"startTime":1786568723650,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":233015,"timestamp":1764943511605,"id":33,"parentId":24,"tags":{},"startTime":1786568723662,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":246153,"timestamp":1764943498514,"id":24,"parentId":19,"tags":{"page":"/p/[project]"},"startTime":1786568723649,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":236210,"timestamp":1764943511703,"id":36,"parentId":27,"tags":{},"startTime":1786568723662,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":249101,"timestamp":1764943498850,"id":27,"parentId":19,"tags":{"page":"/p/[project]/scorecards"},"startTime":1786568723650,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":249567,"timestamp":1764943511668,"id":35,"parentId":26,"tags":{},"startTime":1786568723662,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":262466,"timestamp":1764943498806,"id":26,"parentId":19,"tags":{"page":"/p/[project]/research/[slug]"},"startTime":1786568723649,"traceId":"a2b20363ee569704"},{"name":"is-page-static","duration":255998,"timestamp":1764943511637,"id":34,"parentId":25,"tags":{},"startTime":1786568723662,"traceId":"a2b20363ee569704"},{"name":"check-page","duration":268967,"timestamp":1764943498704,"id":25,"parentId":19,"tags":{"page":"/p/[project]/plan/[name]"},"startTime":1786568723649,"traceId":"a2b20363ee569704"},{"name":"static-check","duration":284051,"timestamp":1764943483634,"id":19,"parentId":1,"tags":{},"startTime":1786568723634,"traceId":"a2b20363ee569704"},{"name":"write-routes-manifest","duration":5823,"timestamp":1764943776527,"id":38,"parentId":1,"tags":{},"startTime":1786568723927,"traceId":"a2b20363ee569704"},{"name":"load-dotenv","duration":21,"timestamp":1764943792496,"id":41,"parentId":40,"tags":{},"startTime":1786568723943,"traceId":"a2b20363ee569704"},{"name":"run-export-path-map","duration":393,"timestamp":1764943793937,"id":42,"parentId":40,"tags":{},"startTime":1786568723945,"traceId":"a2b20363ee569704"},{"name":"next-export","duration":217285,"timestamp":1764943791933,"id":40,"parentId":1,"tags":{},"startTime":1786568723943,"traceId":"a2b20363ee569704"},{"name":"move-exported-app-global-error-","duration":3991,"timestamp":1764944009912,"id":43,"parentId":39,"tags":{},"startTime":1786568724161,"traceId":"a2b20363ee569704"},{"name":"static-generation","duration":236277,"timestamp":1764943787517,"id":39,"parentId":1,"tags":{},"startTime":1786568723938,"traceId":"a2b20363ee569704"},{"name":"write-routes-manifest","duration":1136,"timestamp":1764944024116,"id":44,"parentId":1,"tags":{},"startTime":1786568724175,"traceId":"a2b20363ee569704"},{"name":"print-tree-view","duration":2035,"timestamp":1764944037805,"id":45,"parentId":1,"tags":{},"startTime":1786568724188,"traceId":"a2b20363ee569704"},{"name":"write-route-bundle-stats","duration":4986,"timestamp":1764944039855,"id":46,"parentId":1,"tags":{},"startTime":1786568724191,"traceId":"a2b20363ee569704"},{"name":"telemetry-flush","duration":485448,"timestamp":1764944044853,"id":47,"parentId":1,"tags":{},"startTime":1786568724196,"traceId":"a2b20363ee569704"},{"name":"next-build","duration":9820294,"timestamp":1764934710038,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1786568714861,"traceId":"a2b20363ee569704"}]
1
+ [{"name":"generate-buildid","duration":119,"timestamp":2217018078857,"id":4,"parentId":1,"tags":{},"startTime":1787020798044,"traceId":"d1f9a810cb5784d7"},{"name":"load-custom-routes","duration":206,"timestamp":2217018079033,"id":5,"parentId":1,"tags":{},"startTime":1787020798044,"traceId":"d1f9a810cb5784d7"},{"name":"create-dist-dir","duration":106,"timestamp":2217018079253,"id":6,"parentId":1,"tags":{},"startTime":1787020798045,"traceId":"d1f9a810cb5784d7"},{"name":"clean","duration":21101,"timestamp":2217018079713,"id":7,"parentId":1,"tags":{},"startTime":1787020798045,"traceId":"d1f9a810cb5784d7"},{"name":"discover-routes","duration":3382,"timestamp":2217018106465,"id":8,"parentId":1,"tags":{},"startTime":1787020798072,"traceId":"d1f9a810cb5784d7"},{"name":"create-root-mapping","duration":33,"timestamp":2217018109875,"id":9,"parentId":1,"tags":{},"startTime":1787020798075,"traceId":"d1f9a810cb5784d7"},{"name":"generate-route-types","duration":9990,"timestamp":2217018110590,"id":10,"parentId":1,"tags":{},"startTime":1787020798076,"traceId":"d1f9a810cb5784d7"},{"name":"public-dir-conflict-check","duration":48,"timestamp":2217018120625,"id":11,"parentId":1,"tags":{},"startTime":1787020798086,"traceId":"d1f9a810cb5784d7"},{"name":"generate-routes-manifest","duration":1086,"timestamp":2217018120718,"id":12,"parentId":1,"tags":{},"startTime":1787020798086,"traceId":"d1f9a810cb5784d7"},{"name":"run-turbopack","duration":5269379,"timestamp":2217018127274,"id":14,"parentId":1,"tags":{},"startTime":1787020798093,"traceId":"d1f9a810cb5784d7"},{"name":"turbopack-build-events","duration":46,"timestamp":2217018245176,"id":15,"parentId":1,"tags":{},"startTime":1787020798211,"traceId":"d1f9a810cb5784d7"},{"name":"run-typescript","duration":2112089,"timestamp":2217023424313,"id":16,"parentId":1,"tags":{},"startTime":1787020803390,"traceId":"d1f9a810cb5784d7"},{"name":"generate-required-server-files","duration":521,"timestamp":2217025537288,"id":18,"parentId":1,"tags":{},"startTime":1787020805503,"traceId":"d1f9a810cb5784d7"},{"name":"check-static-error-page","duration":2141,"timestamp":2217025551633,"id":20,"parentId":19,"tags":{},"startTime":1787020805517,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":157379,"timestamp":2217025556601,"id":30,"parentId":22,"tags":{},"startTime":1787020805522,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":161204,"timestamp":2217025552956,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1787020805518,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":202880,"timestamp":2217025557167,"id":31,"parentId":23,"tags":{},"startTime":1787020805523,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":206770,"timestamp":2217025553312,"id":23,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1787020805519,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":208483,"timestamp":2217025556466,"id":29,"parentId":21,"tags":{},"startTime":1787020805522,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":212886,"timestamp":2217025552081,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1787020805517,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":208037,"timestamp":2217025560494,"id":32,"parentId":28,"tags":{},"startTime":1787020805526,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":214827,"timestamp":2217025553731,"id":28,"parentId":19,"tags":{"page":"/"},"startTime":1787020805519,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":215460,"timestamp":2217025560566,"id":33,"parentId":24,"tags":{},"startTime":1787020805526,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":222540,"timestamp":2217025553550,"id":24,"parentId":19,"tags":{"page":"/p/[project]"},"startTime":1787020805519,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":222676,"timestamp":2217025560654,"id":36,"parentId":27,"tags":{},"startTime":1787020805526,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":229671,"timestamp":2217025553691,"id":27,"parentId":19,"tags":{"page":"/p/[project]/scorecards"},"startTime":1787020805519,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":223485,"timestamp":2217025560598,"id":34,"parentId":25,"tags":{},"startTime":1787020805526,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":230503,"timestamp":2217025553608,"id":25,"parentId":19,"tags":{"page":"/p/[project]/plan/[name]"},"startTime":1787020805519,"traceId":"d1f9a810cb5784d7"},{"name":"is-page-static","duration":231394,"timestamp":2217025560625,"id":35,"parentId":26,"tags":{},"startTime":1787020805526,"traceId":"d1f9a810cb5784d7"},{"name":"check-page","duration":238416,"timestamp":2217025553652,"id":26,"parentId":19,"tags":{"page":"/p/[project]/research/[slug]"},"startTime":1787020805519,"traceId":"d1f9a810cb5784d7"},{"name":"static-check","duration":240786,"timestamp":2217025551300,"id":19,"parentId":1,"tags":{},"startTime":1787020805517,"traceId":"d1f9a810cb5784d7"},{"name":"write-routes-manifest","duration":394,"timestamp":2217025793060,"id":38,"parentId":1,"tags":{},"startTime":1787020805758,"traceId":"d1f9a810cb5784d7"},{"name":"load-dotenv","duration":29,"timestamp":2217025798972,"id":41,"parentId":40,"tags":{},"startTime":1787020805764,"traceId":"d1f9a810cb5784d7"},{"name":"run-export-path-map","duration":221,"timestamp":2217025800135,"id":42,"parentId":40,"tags":{},"startTime":1787020805766,"traceId":"d1f9a810cb5784d7"},{"name":"next-export","duration":194043,"timestamp":2217025798340,"id":40,"parentId":1,"tags":{},"startTime":1787020805764,"traceId":"d1f9a810cb5784d7"},{"name":"move-exported-app-global-error-","duration":299,"timestamp":2217025992946,"id":43,"parentId":39,"tags":{},"startTime":1787020805958,"traceId":"d1f9a810cb5784d7"},{"name":"static-generation","duration":199418,"timestamp":2217025794590,"id":39,"parentId":1,"tags":{},"startTime":1787020805760,"traceId":"d1f9a810cb5784d7"},{"name":"write-routes-manifest","duration":157,"timestamp":2217025994084,"id":44,"parentId":1,"tags":{},"startTime":1787020805959,"traceId":"d1f9a810cb5784d7"},{"name":"print-tree-view","duration":1026,"timestamp":2217026001661,"id":45,"parentId":1,"tags":{},"startTime":1787020805967,"traceId":"d1f9a810cb5784d7"},{"name":"write-route-bundle-stats","duration":3260,"timestamp":2217026002697,"id":46,"parentId":1,"tags":{},"startTime":1787020805968,"traceId":"d1f9a810cb5784d7"},{"name":"telemetry-flush","duration":491198,"timestamp":2217026005984,"id":47,"parentId":1,"tags":{},"startTime":1787020805971,"traceId":"d1f9a810cb5784d7"},{"name":"next-build","duration":8444351,"timestamp":2217018053009,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1787020798018,"traceId":"d1f9a810cb5784d7"}]
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":6120115,"timestamp":1764934881944,"id":14,"parentId":1,"tags":{},"startTime":1786568715033,"traceId":"a2b20363ee569704"},{"name":"turbopack-build-events","duration":53,"timestamp":1764935049886,"id":15,"parentId":1,"tags":{},"startTime":1786568715201,"traceId":"a2b20363ee569704"},{"name":"run-typescript","duration":2391241,"timestamp":1764941074217,"id":16,"parentId":1,"tags":{},"startTime":1786568721225,"traceId":"a2b20363ee569704"},{"name":"static-check","duration":284051,"timestamp":1764943483634,"id":19,"parentId":1,"tags":{},"startTime":1786568723634,"traceId":"a2b20363ee569704"},{"name":"static-generation","duration":236277,"timestamp":1764943787517,"id":39,"parentId":1,"tags":{},"startTime":1786568723938,"traceId":"a2b20363ee569704"},{"name":"telemetry-flush","duration":485448,"timestamp":1764944044853,"id":47,"parentId":1,"tags":{},"startTime":1786568724196,"traceId":"a2b20363ee569704"},{"name":"next-build","duration":9820294,"timestamp":1764934710038,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1786568714861,"traceId":"a2b20363ee569704"}]
1
+ [{"name":"run-turbopack","duration":5269379,"timestamp":2217018127274,"id":14,"parentId":1,"tags":{},"startTime":1787020798093,"traceId":"d1f9a810cb5784d7"},{"name":"turbopack-build-events","duration":46,"timestamp":2217018245176,"id":15,"parentId":1,"tags":{},"startTime":1787020798211,"traceId":"d1f9a810cb5784d7"},{"name":"run-typescript","duration":2112089,"timestamp":2217023424313,"id":16,"parentId":1,"tags":{},"startTime":1787020803390,"traceId":"d1f9a810cb5784d7"},{"name":"static-check","duration":240786,"timestamp":2217025551300,"id":19,"parentId":1,"tags":{},"startTime":1787020805517,"traceId":"d1f9a810cb5784d7"},{"name":"static-generation","duration":199418,"timestamp":2217025794590,"id":39,"parentId":1,"tags":{},"startTime":1787020805760,"traceId":"d1f9a810cb5784d7"},{"name":"telemetry-flush","duration":491198,"timestamp":2217026005984,"id":47,"parentId":1,"tags":{},"startTime":1787020805971,"traceId":"d1f9a810cb5784d7"},{"name":"next-build","duration":8444351,"timestamp":2217018053009,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1787020798018,"traceId":"d1f9a810cb5784d7"}]
package/dist/bin/cli.js CHANGED
@@ -332,10 +332,15 @@ const telemetryCmd = program
332
332
  telemetryCmd
333
333
  .command("start")
334
334
  .description("Start the telemetry daemon (Jaeger + otelcol)")
335
+ .option("--allow-port-bump", "Start on a different port when the requested one is already in use (default: refuse)")
335
336
  .action(async function () {
336
337
  const opts = this.optsWithGlobals();
337
338
  const { telemetryStart } = await import("./commands/telemetry.js");
338
- await telemetryStart({ otlpPort: opts.otlpPort, uiPort: opts.uiPort });
339
+ await telemetryStart({
340
+ otlpPort: opts.otlpPort,
341
+ uiPort: opts.uiPort,
342
+ allowPortBump: opts.allowPortBump,
343
+ });
339
344
  });
340
345
  telemetryCmd
341
346
  .command("stop")
@@ -344,6 +349,15 @@ telemetryCmd
344
349
  const { telemetryStop } = await import("./commands/telemetry.js");
345
350
  await telemetryStop();
346
351
  });
352
+ telemetryCmd
353
+ .command("reap")
354
+ .description("Kill telemetry processes whose --config path no longer exists (orphans from deleted temp homes)")
355
+ .option("--dry-run", "List what would be killed without signalling anything")
356
+ .action(async function () {
357
+ const opts = this.opts();
358
+ const { telemetryReap } = await import("./commands/telemetry.js");
359
+ await telemetryReap({ dryRun: opts.dryRun });
360
+ });
347
361
  telemetryCmd
348
362
  .command("restart")
349
363
  .description("Stop + start — picks up new binaries from `npm i -g` of a newer indusk-mcp")
@@ -84,7 +84,6 @@ function createCgcIgnore(projectRoot) {
84
84
  "dist/",
85
85
  "build/",
86
86
  ".git/",
87
- ".jj/",
88
87
  ".indusk/",
89
88
  ".claude/",
90
89
  "*.png",
@@ -793,9 +792,9 @@ export async function init(projectRoot, options = {}) {
793
792
  // from the package source via globSync rather than maintaining a hardcoded
794
793
  // list — matches the pattern in `update.ts:240` so any new hook the
795
794
  // package ships gets installed on next `init` without code changes.
796
- // Pre-Phase-6 (git-or-jj-substrate) the array was hardcoded and missed
797
- // `eval-trigger.js`; settings.json registered it but the file was never
798
- // copied, so the eval hook silently never fired on fresh-init projects.
795
+ // The array was once hardcoded and missed `eval-trigger.js`; settings.json
796
+ // registered it but the file was never copied, so the eval hook silently
797
+ // never fired on fresh-init projects.
799
798
  console.info("\n[Hooks]");
800
799
  const hooksSource = join(packageRoot, "hooks");
801
800
  const hooksTarget = join(projectRoot, ".claude/hooks");
@@ -1,6 +1,8 @@
1
1
  export interface TelemetryStartOptions {
2
2
  otlpPort: string;
3
3
  uiPort: string;
4
+ /** Proceed on a different port when the requested one is already served. */
5
+ allowPortBump?: boolean;
4
6
  }
5
7
  /**
6
8
  * Start the telemetry daemon (Jaeger + otelcol). If already running, prints
@@ -11,6 +13,18 @@ export declare function telemetryStart(opts: TelemetryStartOptions): Promise<voi
11
13
  * Stop the telemetry daemon. Reports whether it was running, the PIDs it
12
14
  * signaled, and whether SIGKILL was required.
13
15
  */
16
+ export interface TelemetryReapOptions {
17
+ dryRun?: boolean;
18
+ }
19
+ /**
20
+ * Kill telemetry processes whose config no longer exists.
21
+ *
22
+ * The daemon is spawned detached so it survives its terminal, and its PIDs live
23
+ * only in `$INDUSK_HOME/telemetry.json`. Anything that deletes that home severs
24
+ * the only handle on the processes — they keep running against a config path
25
+ * that is gone, holding memory and, worse, binding ports the real daemon wants.
26
+ */
27
+ export declare function telemetryReap(opts?: TelemetryReapOptions): Promise<void>;
14
28
  export declare function telemetryStop(): Promise<void>;
15
29
  export interface TelemetryRestartOptions {
16
30
  otlpPort?: string;
@@ -100,6 +100,7 @@ export async function telemetryStart(opts) {
100
100
  const meta = await daemonStart({
101
101
  otlpPort: otlpRequested,
102
102
  uiPort: uiRequested,
103
+ allowPortBump: opts.allowPortBump,
103
104
  });
104
105
  console.info(` OTLP: http://localhost:${meta.otlpPort}`);
105
106
  console.info(` Jaeger UI: http://localhost:${meta.uiPort}`);
@@ -114,9 +115,41 @@ export async function telemetryStart(opts) {
114
115
  }
115
116
  }
116
117
  /**
117
- * Stop the telemetry daemon. Reports whether it was running, the PIDs it
118
- * signaled, and whether SIGKILL was required.
118
+ * Kill telemetry processes whose config no longer exists.
119
+ *
120
+ * The daemon is spawned detached so it survives its terminal, and its PIDs live
121
+ * only in `$INDUSK_HOME/telemetry.json`. Anything that deletes that home severs
122
+ * the only handle on the processes — they keep running against a config path
123
+ * that is gone, holding memory and, worse, binding ports the real daemon wants.
119
124
  */
125
+ export async function telemetryReap(opts = {}) {
126
+ const { reapOrphans } = await import("../../lib/telemetry/orphans.js");
127
+ const status = await daemonStatus();
128
+ // The running daemon is never a candidate, whatever its config looks like.
129
+ const protectPids = status.running ? [status.jaegerPid, status.otelcolPid] : [];
130
+ const result = reapOrphans({ dryRun: opts.dryRun, protectPids });
131
+ if (result.orphans.length === 0) {
132
+ console.info("No orphaned telemetry processes found.");
133
+ if (result.protectedPids.length > 0) {
134
+ console.info(` (${result.protectedPids.length} skipped — claimed by the running daemon)`);
135
+ }
136
+ return;
137
+ }
138
+ const verb = opts.dryRun ? "Would reap" : "Reaped";
139
+ console.info(`${verb} ${result.orphans.length} orphaned telemetry process(es):`);
140
+ for (const o of result.orphans) {
141
+ console.info(` ${o.binary} pid=${o.pid} — config gone: ${o.configPath}`);
142
+ }
143
+ if (result.protectedPids.length > 0) {
144
+ console.info(` skipped ${result.protectedPids.length} claimed by the running daemon`);
145
+ }
146
+ if (result.failed.length > 0) {
147
+ for (const f of result.failed) {
148
+ console.error(` could not signal pid=${f.pid}: ${f.reason}`);
149
+ }
150
+ process.exitCode = 1;
151
+ }
152
+ }
120
153
  export async function telemetryStop() {
121
154
  const result = await daemonStop();
122
155
  if (!result.stopped) {
@@ -561,22 +561,8 @@ export async function update(projectRoot) {
561
561
  const ceNotice = ceDeprecationNotice(projectRoot);
562
562
  if (ceNotice)
563
563
  console.info(ceNotice);
564
- // 7c. SCM field migration. Pre-1.28.x projects don't have `scm` in their
565
- // Legacy `scm` field migration (git-only-substrate Phase 5).
566
- // git is the only SCM as of 1.31.0. Existing `scm: "jj"` config fields
567
- // become a no-op; emit one stderr nudge so the user knows the field
568
- // is safe to remove from `.indusk/config.json`. The file itself is
569
- // NOT modified — removing the field is the user's call.
570
- console.info("\n[SCM]\n");
564
+ // Config helpers, loaded once several later migration steps need them.
571
565
  const { readConfig, writeConfig, ensureCleanupConfig, getCleanupConfig } = await import("../../lib/config.js");
572
- const scmConfig = readConfig(projectRoot);
573
- if (scmConfig?.scm) {
574
- process.stderr.write("scm field no longer used; safe to remove from .indusk/config.json\n");
575
- console.info(` nudge: scm: "${scmConfig.scm}" (no longer used; safe to remove)`);
576
- }
577
- else {
578
- console.info(" ok: (no scm field; git is the only SCM as of 1.31.0)");
579
- }
580
566
  // 7c. Multi-agent scaffolding (handoff-multi-agent Phase 4, reshaped in
581
567
  // handoff-multi-agent-section-shape Phase 4). Idempotently migrate
582
568
  // pre-1.29 projects:
@@ -56,16 +56,6 @@ export interface InduskConfig {
56
56
  */
57
57
  role?: "service" | "library" | "tool" | "none";
58
58
  };
59
- /**
60
- * Legacy SCM field. No longer read or written by InDusk as of 1.31.0
61
- * (git-only-substrate Phase 4) — git is the only SCM. The field is
62
- * retained in the type so config-readers don't reject existing
63
- * `scm: "jj"` entries; `indusk update` emits a one-time stderr nudge
64
- * telling the user the field is safe to remove.
65
- *
66
- * @deprecated Remove from `.indusk/config.json` — no longer used.
67
- */
68
- scm?: "jj" | "git";
69
59
  /**
70
60
  * Eval-agent configuration. Most of this is read directly via JSON
71
61
  * traversal in `lib/eval/otel.ts`; the schema here is documentary.
@@ -2,8 +2,7 @@
2
2
  * Tracks eval finding resolution state.
3
3
  *
4
4
  * Findings persist as "unresolved" until explicitly fixed or ignored.
5
- * The eval hook surfaces unresolved findings on every commit (jj describe
6
- * on jj projects, git commit on git projects).
5
+ * The eval hook surfaces unresolved findings on every `git commit`.
7
6
  */
8
7
  import type { EvalScorecard } from "./types.js";
9
8
  export type FindingState = "unresolved" | "fixed" | "ignored";
@@ -2,8 +2,7 @@
2
2
  * Tracks eval finding resolution state.
3
3
  *
4
4
  * Findings persist as "unresolved" until explicitly fixed or ignored.
5
- * The eval hook surfaces unresolved findings on every commit (jj describe
6
- * on jj projects, git commit on git projects).
5
+ * The eval hook surfaces unresolved findings on every `git commit`.
7
6
  */
8
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
8
  import { dirname, join } from "node:path";
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Builds the evaluator agent's system prompt.
3
3
  *
4
- * The prompt instructs the evaluator to: do catchup, read the transcript, read the
5
- * diff itself via jj, answer each rubric question, write findings to Graphiti
6
- * (eval mode only), and output a JSON scorecard.
4
+ * The prompt instructs the evaluator to: do catchup, read the transcript, read
5
+ * the diff itself via git, answer each rubric question, materialize durable
6
+ * highlights into lessons via `add_lesson` (eval mode only), and output a JSON
7
+ * scorecard.
7
8
  *
8
9
  * The diff is NOT embedded in the prompt — the evaluator reads it via tool calls.
9
10
  * This keeps the prompt small regardless of commit size.
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Builds the evaluator agent's system prompt.
3
3
  *
4
- * The prompt instructs the evaluator to: do catchup, read the transcript, read the
5
- * diff itself via jj, answer each rubric question, write findings to Graphiti
6
- * (eval mode only), and output a JSON scorecard.
4
+ * The prompt instructs the evaluator to: do catchup, read the transcript, read
5
+ * the diff itself via git, answer each rubric question, materialize durable
6
+ * highlights into lessons via `add_lesson` (eval mode only), and output a JSON
7
+ * scorecard.
7
8
  *
8
9
  * The diff is NOT embedded in the prompt — the evaluator reads it via tool calls.
9
10
  * This keeps the prompt small regardless of commit size.
@@ -16,6 +16,11 @@ export interface DaemonMeta {
16
16
  export interface DaemonStartOptions {
17
17
  otlpPort?: number;
18
18
  uiPort?: number;
19
+ /**
20
+ * Start on a different port when the requested one is already served by
21
+ * something this daemon does not own. Off by default — see `assertRequestedPortsFree`.
22
+ */
23
+ allowPortBump?: boolean;
19
24
  }
20
25
  export type DaemonStatusResult = {
21
26
  running: true;
@@ -42,6 +47,26 @@ export interface DaemonStopResult {
42
47
  export declare function resolveBinary(name: "jaeger" | "otelcol"): string;
43
48
  export declare function isPortListening(port: number): Promise<boolean>;
44
49
  export declare function findFreePort(requested: number): Promise<number>;
50
+ /**
51
+ * Refuse to start when a requested port is already served by something we do
52
+ * not own.
53
+ *
54
+ * `findFreePort` silently falls back to a random high port when the requested
55
+ * one is taken, and that silence is how the reported failure happened: a leaked
56
+ * jaeger held `:4318`, this daemon came up on a random port instead, and the
57
+ * dev stack — configured for the canonical port — kept exporting into the
58
+ * stray, which answered `404` because it is not an OTLP receiver. Every trace
59
+ * vanished, and every component reported healthy.
60
+ *
61
+ * The caller already asked for a specific port. Coming up somewhere else and
62
+ * saying nothing is the one behaviour that cannot be right. A port of `0` means
63
+ * "any", so it is exempt.
64
+ *
65
+ * Note this deliberately does NOT adopt the listener: without its PIDs the
66
+ * daemon cannot be managed, so claiming to reuse it would be a lie. Refuse,
67
+ * name the port, and point at the command that fixes the common cause.
68
+ */
69
+ export declare function assertRequestedPortsFree(opts: DaemonStartOptions): Promise<void>;
45
70
  export declare function daemonStart(opts?: DaemonStartOptions): Promise<DaemonMeta>;
46
71
  export declare function daemonStatus(): Promise<DaemonStatusResult>;
47
72
  export declare function daemonStop(): Promise<DaemonStopResult>;
@@ -287,6 +287,47 @@ service:
287
287
  `;
288
288
  }
289
289
  // ---- daemonStart / daemonStop / daemonStatus / daemonRestart ---------------
290
+ /**
291
+ * Refuse to start when a requested port is already served by something we do
292
+ * not own.
293
+ *
294
+ * `findFreePort` silently falls back to a random high port when the requested
295
+ * one is taken, and that silence is how the reported failure happened: a leaked
296
+ * jaeger held `:4318`, this daemon came up on a random port instead, and the
297
+ * dev stack — configured for the canonical port — kept exporting into the
298
+ * stray, which answered `404` because it is not an OTLP receiver. Every trace
299
+ * vanished, and every component reported healthy.
300
+ *
301
+ * The caller already asked for a specific port. Coming up somewhere else and
302
+ * saying nothing is the one behaviour that cannot be right. A port of `0` means
303
+ * "any", so it is exempt.
304
+ *
305
+ * Note this deliberately does NOT adopt the listener: without its PIDs the
306
+ * daemon cannot be managed, so claiming to reuse it would be a lie. Refuse,
307
+ * name the port, and point at the command that fixes the common cause.
308
+ */
309
+ export async function assertRequestedPortsFree(opts) {
310
+ if (opts.allowPortBump)
311
+ return;
312
+ const requested = [
313
+ { name: "OTLP", port: opts.otlpPort ?? 4318 },
314
+ { name: "Jaeger UI", port: opts.uiPort ?? 16686 },
315
+ ].filter((p) => p.port !== 0);
316
+ const occupied = [];
317
+ for (const p of requested) {
318
+ if (await isPortListening(p.port))
319
+ occupied.push(p);
320
+ }
321
+ if (occupied.length === 0)
322
+ return;
323
+ const detail = occupied.map((p) => `${p.name} :${p.port}`).join(", ");
324
+ throw new Error(`Refusing to start: ${detail} already in use by a process this daemon does not own.\n` +
325
+ `Starting anyway would bind a random port instead, and anything configured for the ` +
326
+ `requested port would keep talking to whatever is there — silently.\n` +
327
+ ` If it is a leaked telemetry process: indusk telemetry reap\n` +
328
+ ` If it is another tool you want to keep: indusk telemetry start --allow-port-bump\n` +
329
+ ` Or choose explicitly: indusk telemetry start --otlp-port <n> --ui-port <n>`);
330
+ }
290
331
  export async function daemonStart(opts = {}) {
291
332
  ensureHome();
292
333
  // Fail fast if already running (up-stream uiStart-style guard)
@@ -294,6 +335,7 @@ export async function daemonStart(opts = {}) {
294
335
  if (existing.running) {
295
336
  throw new Error(`Telemetry daemon is already running (Jaeger PID ${existing.jaegerPid}, otelcol PID ${existing.otelcolPid}, OTLP :${existing.otlpPort}, UI :${existing.uiPort}). Run 'indusk telemetry stop' first.`);
296
337
  }
338
+ await assertRequestedPortsFree(opts);
297
339
  const jaegerBin = resolveBinary("jaeger");
298
340
  const otelcolBin = resolveBinary("otelcol");
299
341
  // Pick 8 ports simultaneously to avoid sequential-pickFreePort collision
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Finding and reaping telemetry processes that outlived their configuration.
3
+ *
4
+ * The daemon is spawned `detached` + `unref()`ed so it survives the terminal
5
+ * that started it — correct for a daemon, and the reason an orphan is possible
6
+ * at all. Its PIDs live only in `$INDUSK_HOME/telemetry.json`, so anything that
7
+ * removes that home (a test fixture, a deleted worktree, `rm -rf /tmp/...`)
8
+ * severs the only handle anyone had on the processes.
9
+ *
10
+ * The reliable signal for "orphan" is the one the reporter of this bug
11
+ * identified: **the `--config` path the process was started with no longer
12
+ * exists.** A live daemon's config sits inside its live home; an orphan's
13
+ * points into a directory that has been deleted. Every one of the 2,058
14
+ * processes found on 2026-08-13 matched that test, and the real daemon did not.
15
+ */
16
+ /** A telemetry process discovered on this machine. */
17
+ export interface TelemetryProcess {
18
+ pid: number;
19
+ /** `jaeger` or `otelcol`, derived from the binary path. */
20
+ binary: string;
21
+ /** The `--config=` value, with any `file:` scheme stripped. Empty if absent. */
22
+ configPath: string;
23
+ /** True when `configPath` no longer exists on disk — the orphan signal. */
24
+ orphaned: boolean;
25
+ }
26
+ /**
27
+ * Every running jaeger/otelcol this package could have started.
28
+ *
29
+ * Uses `ps -eo pid=,args=`, which behaves the same on macOS and Linux. Returns
30
+ * an empty list rather than throwing when `ps` is unavailable — a reap that
31
+ * cannot enumerate must report "found nothing to do", not crash a health check.
32
+ */
33
+ export declare function listTelemetryProcesses(): TelemetryProcess[];
34
+ export interface ReapResult {
35
+ /** Orphans identified, whether or not they were killed. */
36
+ orphans: TelemetryProcess[];
37
+ /** PIDs actually signalled. Empty when `dryRun`. */
38
+ killed: number[];
39
+ /** Orphans that survived the signal, with the reason. */
40
+ failed: {
41
+ pid: number;
42
+ reason: string;
43
+ }[];
44
+ /** PIDs skipped because the live registry claims them. */
45
+ protectedPids: number[];
46
+ }
47
+ export interface ReapOptions {
48
+ dryRun?: boolean;
49
+ /**
50
+ * PIDs the current registry claims. Never signalled, even if their config
51
+ * path is missing — a running daemon whose config was deleted underneath it
52
+ * is a different problem, and killing the daemon the user is actively using
53
+ * is not this command's job.
54
+ */
55
+ protectPids?: number[];
56
+ }
57
+ /**
58
+ * Kill every orphaned telemetry process.
59
+ *
60
+ * SIGTERM only. These are collectors with no shutdown-critical state — a
61
+ * SIGKILL escalation would buy nothing and risks leaving port bindings in
62
+ * TIME_WAIT longer than the graceful path.
63
+ */
64
+ export declare function reapOrphans(opts?: ReapOptions): ReapResult;
@@ -0,0 +1,82 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ /** Matches the platform-split binaries this package ships. */
4
+ const TELEMETRY_BINARY = /telemetry-binaries-[a-z0-9-]+\/bin\/(jaeger|otelcol)\b/;
5
+ const CONFIG_ARG = /--config=(\S+)/;
6
+ /**
7
+ * Every running jaeger/otelcol this package could have started.
8
+ *
9
+ * Uses `ps -eo pid=,args=`, which behaves the same on macOS and Linux. Returns
10
+ * an empty list rather than throwing when `ps` is unavailable — a reap that
11
+ * cannot enumerate must report "found nothing to do", not crash a health check.
12
+ */
13
+ export function listTelemetryProcesses() {
14
+ let out;
15
+ try {
16
+ out = execFileSync("ps", ["-eo", "pid=,args="], {
17
+ encoding: "utf-8",
18
+ maxBuffer: 8 * 1024 * 1024,
19
+ });
20
+ }
21
+ catch {
22
+ return [];
23
+ }
24
+ const found = [];
25
+ for (const line of out.split("\n")) {
26
+ const trimmed = line.trim();
27
+ if (trimmed === "")
28
+ continue;
29
+ const binaryMatch = TELEMETRY_BINARY.exec(trimmed);
30
+ if (!binaryMatch)
31
+ continue;
32
+ const space = trimmed.indexOf(" ");
33
+ const pid = Number.parseInt(trimmed.slice(0, space), 10);
34
+ if (!Number.isInteger(pid) || pid <= 0)
35
+ continue;
36
+ const configMatch = CONFIG_ARG.exec(trimmed);
37
+ // jaeger is started as `--config=file:/path`; otelcol as `--config=/path`.
38
+ const configPath = configMatch ? configMatch[1].replace(/^file:/, "") : "";
39
+ found.push({
40
+ pid,
41
+ binary: binaryMatch[1],
42
+ // No --config at all is NOT treated as orphaned: absence of evidence.
43
+ // Killing something we cannot identify is worse than leaving it.
44
+ orphaned: configPath !== "" && !existsSync(configPath),
45
+ configPath,
46
+ });
47
+ }
48
+ return found;
49
+ }
50
+ /**
51
+ * Kill every orphaned telemetry process.
52
+ *
53
+ * SIGTERM only. These are collectors with no shutdown-critical state — a
54
+ * SIGKILL escalation would buy nothing and risks leaving port bindings in
55
+ * TIME_WAIT longer than the graceful path.
56
+ */
57
+ export function reapOrphans(opts = {}) {
58
+ const protectedPids = new Set(opts.protectPids ?? []);
59
+ const all = listTelemetryProcesses();
60
+ const orphans = all.filter((p) => p.orphaned && !protectedPids.has(p.pid));
61
+ const skipped = all.filter((p) => p.orphaned && protectedPids.has(p.pid)).map((p) => p.pid);
62
+ const killed = [];
63
+ const failed = [];
64
+ if (opts.dryRun)
65
+ return { orphans, killed, failed, protectedPids: skipped };
66
+ for (const proc of orphans) {
67
+ try {
68
+ process.kill(proc.pid, "SIGTERM");
69
+ killed.push(proc.pid);
70
+ }
71
+ catch (err) {
72
+ // ESRCH means it exited between listing and signalling — that is the
73
+ // outcome we wanted, not a failure.
74
+ const reason = err.code ?? String(err);
75
+ if (reason === "ESRCH")
76
+ killed.push(proc.pid);
77
+ else
78
+ failed.push({ pid: proc.pid, reason });
79
+ }
80
+ }
81
+ return { orphans, killed, failed, protectedPids: skipped };
82
+ }
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "local-telemetry",
3
- "description": "Local OTel telemetry daemon Jaeger + OTel Collector running natively, agent-queryable via MCP tools for fast 'why did this just fail' diagnosis",
3
+ "description": "Local OTel telemetry daemon \u2014 Jaeger + OTel Collector running natively, agent-queryable via MCP tools for fast 'why did this just fail' diagnosis",
4
4
  "required": true,
5
5
  "provides": {
6
6
  "skill": true,
7
7
  "health_checks": [
8
8
  {
9
9
  "name": "telemetry-daemon-running",
10
- "command": "node -e \"const p=require('os').homedir()+'/.indusk/telemetry.pid';const fs=require('fs');process.exit(fs.existsSync(p) ? 0 : 1)\""
10
+ "command": "node -e \"const p=require('os').homedir()+'/.indusk/telemetry.json';const fs=require('fs');if(!fs.existsSync(p))process.exit(1);let m;try{m=JSON.parse(fs.readFileSync(p,'utf-8'))}catch{process.exit(1)}for(const pid of [m.jaegerPid,m.otelcolPid]){if(!pid)process.exit(1);try{process.kill(pid,0)}catch{process.exit(1)}}process.exit(0)\""
11
11
  },
12
12
  {
13
13
  "name": "telemetry-otlp-listening",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@infinitedusky/indusk-mcp",
3
- "version": "1.36.0",
4
- "description": "InDusk development system \u2014 skills, MCP tools, and CLI for structured AI-assisted development",
3
+ "version": "1.36.2",
4
+ "description": "InDusk development system skills, MCP tools, and CLI for structured AI-assisted development",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",