@infinitedusky/indusk-mcp 1.57.0 → 1.57.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 (29) 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]__0h32kmi._.js.map +1 -1
  12. package/admin/.next/server/chunks/ssr/[root-of-the-server]__0wm9s16._.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/commands/promises.js +8 -20
  18. package/dist/lib/eval/scorecard-extractor.d.ts +4 -3
  19. package/dist/lib/eval/scorecard-extractor.js +19 -16
  20. package/dist/lib/promises/incidents.d.ts +3 -1
  21. package/dist/lib/promises/incidents.js +15 -5
  22. package/dist/lib/promises/reopen.d.ts +21 -1
  23. package/dist/lib/promises/reopen.js +22 -3
  24. package/dist/lib/promises/watch.d.ts +30 -5
  25. package/dist/lib/promises/watch.js +95 -18
  26. package/package.json +3 -2
  27. /package/admin/.next/static/{cfBb4Ykd8a8KEE1Zj6ihm → J9OMtrT45NqCFCk5PfvFj}/_buildManifest.js +0 -0
  28. /package/admin/.next/static/{cfBb4Ykd8a8KEE1Zj6ihm → J9OMtrT45NqCFCk5PfvFj}/_clientMiddlewareManifest.js +0 -0
  29. /package/admin/.next/static/{cfBb4Ykd8a8KEE1Zj6ihm → J9OMtrT45NqCFCk5PfvFj}/_ssgManifest.js +0 -0
@@ -7,9 +7,9 @@ globalThis.__BUILD_MANIFEST = {
7
7
  "static/chunks/03~yq9q893hmn.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/cfBb4Ykd8a8KEE1Zj6ihm/_buildManifest.js",
11
- "static/cfBb4Ykd8a8KEE1Zj6ihm/_ssgManifest.js",
12
- "static/cfBb4Ykd8a8KEE1Zj6ihm/_clientMiddlewareManifest.js"
10
+ "static/J9OMtrT45NqCFCk5PfvFj/_buildManifest.js",
11
+ "static/J9OMtrT45NqCFCk5PfvFj/_ssgManifest.js",
12
+ "static/J9OMtrT45NqCFCk5PfvFj/_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\":\"cfBb4Ykd8a8KEE1Zj6ihm\"}\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\":\"J9OMtrT45NqCFCk5PfvFj\"}\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":105,"timestamp":175143534793,"id":4,"parentId":1,"tags":{},"startTime":1790993636476,"traceId":"4be8956b3ec9241c"},{"name":"load-custom-routes","duration":210,"timestamp":175143534952,"id":5,"parentId":1,"tags":{},"startTime":1790993636476,"traceId":"4be8956b3ec9241c"},{"name":"create-dist-dir","duration":74,"timestamp":175143535174,"id":6,"parentId":1,"tags":{},"startTime":1790993636476,"traceId":"4be8956b3ec9241c"},{"name":"clean","duration":51507,"timestamp":175143535743,"id":7,"parentId":1,"tags":{},"startTime":1790993636477,"traceId":"4be8956b3ec9241c"},{"name":"discover-routes","duration":3896,"timestamp":175143592678,"id":8,"parentId":1,"tags":{},"startTime":1790993636533,"traceId":"4be8956b3ec9241c"},{"name":"create-root-mapping","duration":29,"timestamp":175143596599,"id":9,"parentId":1,"tags":{},"startTime":1790993636537,"traceId":"4be8956b3ec9241c"},{"name":"generate-route-types","duration":9887,"timestamp":175143597239,"id":10,"parentId":1,"tags":{},"startTime":1790993636538,"traceId":"4be8956b3ec9241c"},{"name":"public-dir-conflict-check","duration":56,"timestamp":175143607174,"id":11,"parentId":1,"tags":{},"startTime":1790993636548,"traceId":"4be8956b3ec9241c"},{"name":"generate-routes-manifest","duration":1206,"timestamp":175143607286,"id":12,"parentId":1,"tags":{},"startTime":1790993636548,"traceId":"4be8956b3ec9241c"},{"name":"run-turbopack","duration":5536622,"timestamp":175143612851,"id":14,"parentId":1,"tags":{},"startTime":1790993636554,"traceId":"4be8956b3ec9241c"},{"name":"turbopack-build-events","duration":44,"timestamp":175143754845,"id":15,"parentId":1,"tags":{},"startTime":1790993636696,"traceId":"4be8956b3ec9241c"},{"name":"run-typescript","duration":2628772,"timestamp":175149192513,"id":16,"parentId":1,"tags":{},"startTime":1790993642133,"traceId":"4be8956b3ec9241c"},{"name":"generate-required-server-files","duration":927,"timestamp":175151823291,"id":18,"parentId":1,"tags":{},"startTime":1790993644764,"traceId":"4be8956b3ec9241c"},{"name":"check-static-error-page","duration":10221,"timestamp":175151837245,"id":20,"parentId":19,"tags":{},"startTime":1790993644778,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":227615,"timestamp":175151854685,"id":31,"parentId":22,"tags":{},"startTime":1790993644795,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":237920,"timestamp":175151844536,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1790993644785,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":265651,"timestamp":175151854484,"id":30,"parentId":21,"tags":{},"startTime":1790993644795,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":282366,"timestamp":175151837830,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1790993644779,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":284410,"timestamp":175151854720,"id":32,"parentId":23,"tags":{},"startTime":1790993644796,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":294553,"timestamp":175151844918,"id":23,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1790993644786,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":282353,"timestamp":175151862088,"id":33,"parentId":29,"tags":{},"startTime":1790993644803,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":297058,"timestamp":175151847410,"id":29,"parentId":19,"tags":{"page":"/"},"startTime":1790993644788,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":293946,"timestamp":175151862231,"id":36,"parentId":26,"tags":{},"startTime":1790993644803,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":308971,"timestamp":175151847241,"id":26,"parentId":19,"tags":{"page":"/p/[project]/promises"},"startTime":1790993644788,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":301926,"timestamp":175151862288,"id":38,"parentId":28,"tags":{},"startTime":1790993644803,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":317015,"timestamp":175151847364,"id":28,"parentId":19,"tags":{"page":"/p/[project]/scorecards"},"startTime":1790993644788,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":309117,"timestamp":175151862176,"id":34,"parentId":24,"tags":{},"startTime":1790993644803,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":324545,"timestamp":175151846810,"id":24,"parentId":19,"tags":{"page":"/p/[project]"},"startTime":1790993644788,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":330456,"timestamp":175151862265,"id":37,"parentId":27,"tags":{},"startTime":1790993644803,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":345445,"timestamp":175151847301,"id":27,"parentId":19,"tags":{"page":"/p/[project]/research/[slug]"},"startTime":1790993644788,"traceId":"4be8956b3ec9241c"},{"name":"is-page-static","duration":342755,"timestamp":175151862205,"id":35,"parentId":25,"tags":{},"startTime":1790993644803,"traceId":"4be8956b3ec9241c"},{"name":"check-page","duration":357921,"timestamp":175151847078,"id":25,"parentId":19,"tags":{"page":"/p/[project]/plan/[name]"},"startTime":1790993644788,"traceId":"4be8956b3ec9241c"},{"name":"static-check","duration":368197,"timestamp":175151836816,"id":19,"parentId":1,"tags":{},"startTime":1790993644778,"traceId":"4be8956b3ec9241c"},{"name":"write-routes-manifest","duration":332,"timestamp":175152206090,"id":40,"parentId":1,"tags":{},"startTime":1790993645147,"traceId":"4be8956b3ec9241c"},{"name":"load-dotenv","duration":27,"timestamp":175152212301,"id":43,"parentId":42,"tags":{},"startTime":1790993645153,"traceId":"4be8956b3ec9241c"},{"name":"run-export-path-map","duration":400,"timestamp":175152214181,"id":44,"parentId":42,"tags":{},"startTime":1790993645155,"traceId":"4be8956b3ec9241c"},{"name":"next-export","duration":77971,"timestamp":175152211698,"id":42,"parentId":1,"tags":{},"startTime":1790993645153,"traceId":"4be8956b3ec9241c"},{"name":"move-exported-app-global-error-","duration":359,"timestamp":175152290561,"id":45,"parentId":41,"tags":{},"startTime":1790993645231,"traceId":"4be8956b3ec9241c"},{"name":"static-generation","duration":84643,"timestamp":175152207490,"id":41,"parentId":1,"tags":{},"startTime":1790993645148,"traceId":"4be8956b3ec9241c"},{"name":"write-routes-manifest","duration":219,"timestamp":175152292251,"id":46,"parentId":1,"tags":{},"startTime":1790993645233,"traceId":"4be8956b3ec9241c"},{"name":"print-tree-view","duration":1296,"timestamp":175152305278,"id":47,"parentId":1,"tags":{},"startTime":1790993645246,"traceId":"4be8956b3ec9241c"},{"name":"write-route-bundle-stats","duration":4741,"timestamp":175152306591,"id":48,"parentId":1,"tags":{},"startTime":1790993645247,"traceId":"4be8956b3ec9241c"},{"name":"telemetry-flush","duration":486194,"timestamp":175152311345,"id":49,"parentId":1,"tags":{},"startTime":1790993645252,"traceId":"4be8956b3ec9241c"},{"name":"next-build","duration":9358256,"timestamp":175143439322,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1790993636380,"traceId":"4be8956b3ec9241c"}]
1
+ [{"name":"generate-buildid","duration":87,"timestamp":188006830030,"id":4,"parentId":1,"tags":{},"startTime":1791006499763,"traceId":"165e106feed0dd71"},{"name":"load-custom-routes","duration":191,"timestamp":188006830162,"id":5,"parentId":1,"tags":{},"startTime":1791006499763,"traceId":"165e106feed0dd71"},{"name":"create-dist-dir","duration":83,"timestamp":188006830366,"id":6,"parentId":1,"tags":{},"startTime":1791006499763,"traceId":"165e106feed0dd71"},{"name":"clean","duration":37509,"timestamp":188006831029,"id":7,"parentId":1,"tags":{},"startTime":1791006499764,"traceId":"165e106feed0dd71"},{"name":"discover-routes","duration":4154,"timestamp":188006874010,"id":8,"parentId":1,"tags":{},"startTime":1791006499807,"traceId":"165e106feed0dd71"},{"name":"create-root-mapping","duration":44,"timestamp":188006878193,"id":9,"parentId":1,"tags":{},"startTime":1791006499811,"traceId":"165e106feed0dd71"},{"name":"generate-route-types","duration":10056,"timestamp":188006878872,"id":10,"parentId":1,"tags":{},"startTime":1791006499812,"traceId":"165e106feed0dd71"},{"name":"public-dir-conflict-check","duration":46,"timestamp":188006888967,"id":11,"parentId":1,"tags":{},"startTime":1791006499822,"traceId":"165e106feed0dd71"},{"name":"generate-routes-manifest","duration":1201,"timestamp":188006889062,"id":12,"parentId":1,"tags":{},"startTime":1791006499822,"traceId":"165e106feed0dd71"},{"name":"run-turbopack","duration":5321918,"timestamp":188006894174,"id":14,"parentId":1,"tags":{},"startTime":1791006499827,"traceId":"165e106feed0dd71"},{"name":"turbopack-build-events","duration":48,"timestamp":188007033937,"id":15,"parentId":1,"tags":{},"startTime":1791006499967,"traceId":"165e106feed0dd71"},{"name":"run-typescript","duration":2605173,"timestamp":188012239360,"id":16,"parentId":1,"tags":{},"startTime":1791006505172,"traceId":"165e106feed0dd71"},{"name":"generate-required-server-files","duration":608,"timestamp":188014845432,"id":18,"parentId":1,"tags":{},"startTime":1791006507778,"traceId":"165e106feed0dd71"},{"name":"check-static-error-page","duration":4651,"timestamp":188014866022,"id":20,"parentId":19,"tags":{},"startTime":1791006507799,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":161127,"timestamp":188014874054,"id":31,"parentId":22,"tags":{},"startTime":1791006507807,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":167864,"timestamp":188014867440,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1791006507800,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":203074,"timestamp":188014874083,"id":32,"parentId":23,"tags":{},"startTime":1791006507807,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":207046,"timestamp":188014870143,"id":23,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1791006507803,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":212624,"timestamp":188014886420,"id":34,"parentId":24,"tags":{},"startTime":1791006507819,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":228712,"timestamp":188014870394,"id":24,"parentId":19,"tags":{"page":"/p/[project]"},"startTime":1791006507803,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":212708,"timestamp":188014886478,"id":36,"parentId":26,"tags":{},"startTime":1791006507819,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":228718,"timestamp":188014870491,"id":26,"parentId":19,"tags":{"page":"/p/[project]/promises"},"startTime":1791006507804,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":232476,"timestamp":188014873897,"id":30,"parentId":21,"tags":{},"startTime":1791006507807,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":239854,"timestamp":188014866567,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1791006507800,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":224464,"timestamp":188014886332,"id":33,"parentId":29,"tags":{},"startTime":1791006507819,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":240253,"timestamp":188014870624,"id":29,"parentId":19,"tags":{"page":"/"},"startTime":1791006507804,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":235114,"timestamp":188014886518,"id":37,"parentId":27,"tags":{},"startTime":1791006507820,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":251133,"timestamp":188014870537,"id":27,"parentId":19,"tags":{"page":"/p/[project]/research/[slug]"},"startTime":1791006507804,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":240065,"timestamp":188014886450,"id":35,"parentId":25,"tags":{},"startTime":1791006507819,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":256099,"timestamp":188014870439,"id":25,"parentId":19,"tags":{"page":"/p/[project]/plan/[name]"},"startTime":1791006507803,"traceId":"165e106feed0dd71"},{"name":"is-page-static","duration":274760,"timestamp":188014886542,"id":38,"parentId":28,"tags":{},"startTime":1791006507820,"traceId":"165e106feed0dd71"},{"name":"check-page","duration":290761,"timestamp":188014870578,"id":28,"parentId":19,"tags":{"page":"/p/[project]/scorecards"},"startTime":1791006507804,"traceId":"165e106feed0dd71"},{"name":"static-check","duration":295747,"timestamp":188014865610,"id":19,"parentId":1,"tags":{},"startTime":1791006507799,"traceId":"165e106feed0dd71"},{"name":"write-routes-manifest","duration":531,"timestamp":188015162712,"id":40,"parentId":1,"tags":{},"startTime":1791006508096,"traceId":"165e106feed0dd71"},{"name":"load-dotenv","duration":25,"timestamp":188015169994,"id":43,"parentId":42,"tags":{},"startTime":1791006508103,"traceId":"165e106feed0dd71"},{"name":"run-export-path-map","duration":215,"timestamp":188015171541,"id":44,"parentId":42,"tags":{},"startTime":1791006508105,"traceId":"165e106feed0dd71"},{"name":"next-export","duration":69730,"timestamp":188015169475,"id":42,"parentId":1,"tags":{},"startTime":1791006508102,"traceId":"165e106feed0dd71"},{"name":"move-exported-app-global-error-","duration":364,"timestamp":188015239850,"id":45,"parentId":41,"tags":{},"startTime":1791006508173,"traceId":"165e106feed0dd71"},{"name":"static-generation","duration":75610,"timestamp":188015165470,"id":41,"parentId":1,"tags":{},"startTime":1791006508098,"traceId":"165e106feed0dd71"},{"name":"write-routes-manifest","duration":148,"timestamp":188015241176,"id":46,"parentId":1,"tags":{},"startTime":1791006508174,"traceId":"165e106feed0dd71"},{"name":"print-tree-view","duration":1720,"timestamp":188015245554,"id":47,"parentId":1,"tags":{},"startTime":1791006508179,"traceId":"165e106feed0dd71"},{"name":"write-route-bundle-stats","duration":6378,"timestamp":188015247286,"id":48,"parentId":1,"tags":{},"startTime":1791006508180,"traceId":"165e106feed0dd71"},{"name":"telemetry-flush","duration":490823,"timestamp":188015253681,"id":49,"parentId":1,"tags":{},"startTime":1791006508187,"traceId":"165e106feed0dd71"},{"name":"next-build","duration":9004979,"timestamp":188006739632,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791006499673,"traceId":"165e106feed0dd71"}]
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":5536622,"timestamp":175143612851,"id":14,"parentId":1,"tags":{},"startTime":1790993636554,"traceId":"4be8956b3ec9241c"},{"name":"turbopack-build-events","duration":44,"timestamp":175143754845,"id":15,"parentId":1,"tags":{},"startTime":1790993636696,"traceId":"4be8956b3ec9241c"},{"name":"run-typescript","duration":2628772,"timestamp":175149192513,"id":16,"parentId":1,"tags":{},"startTime":1790993642133,"traceId":"4be8956b3ec9241c"},{"name":"static-check","duration":368197,"timestamp":175151836816,"id":19,"parentId":1,"tags":{},"startTime":1790993644778,"traceId":"4be8956b3ec9241c"},{"name":"static-generation","duration":84643,"timestamp":175152207490,"id":41,"parentId":1,"tags":{},"startTime":1790993645148,"traceId":"4be8956b3ec9241c"},{"name":"telemetry-flush","duration":486194,"timestamp":175152311345,"id":49,"parentId":1,"tags":{},"startTime":1790993645252,"traceId":"4be8956b3ec9241c"},{"name":"next-build","duration":9358256,"timestamp":175143439322,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1790993636380,"traceId":"4be8956b3ec9241c"}]
1
+ [{"name":"run-turbopack","duration":5321918,"timestamp":188006894174,"id":14,"parentId":1,"tags":{},"startTime":1791006499827,"traceId":"165e106feed0dd71"},{"name":"turbopack-build-events","duration":48,"timestamp":188007033937,"id":15,"parentId":1,"tags":{},"startTime":1791006499967,"traceId":"165e106feed0dd71"},{"name":"run-typescript","duration":2605173,"timestamp":188012239360,"id":16,"parentId":1,"tags":{},"startTime":1791006505172,"traceId":"165e106feed0dd71"},{"name":"static-check","duration":295747,"timestamp":188014865610,"id":19,"parentId":1,"tags":{},"startTime":1791006507799,"traceId":"165e106feed0dd71"},{"name":"static-generation","duration":75610,"timestamp":188015165470,"id":41,"parentId":1,"tags":{},"startTime":1791006508098,"traceId":"165e106feed0dd71"},{"name":"telemetry-flush","duration":490823,"timestamp":188015253681,"id":49,"parentId":1,"tags":{},"startTime":1791006508187,"traceId":"165e106feed0dd71"},{"name":"next-build","duration":9004979,"timestamp":188006739632,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791006499673,"traceId":"165e106feed0dd71"}]
@@ -4,7 +4,7 @@ import { getQuietWindowDays } from "../../lib/promises/config.js";
4
4
  import { readPromises } from "../../lib/promises/registry.js";
5
5
  import { formatStatus, parseDuration } from "../../lib/promises/status.js";
6
6
  import { JaegerUnreachable, readPromiseMarks } from "../../lib/promises/telemetry.js";
7
- import { watchPromises } from "../../lib/promises/watch.js";
7
+ import { watchPromises, watchReport } from "../../lib/promises/watch.js";
8
8
  /**
9
9
  * `indusk promises check`.
10
10
  *
@@ -104,23 +104,11 @@ export async function promisesWatch(projectRoot, opts = {}) {
104
104
  process.exitCode = 2;
105
105
  return;
106
106
  }
107
- console.info(`Read from Jaeger at ${result.source}.`);
108
- if (result.changes.length === 0) {
109
- console.info("No new violations — nothing recorded.");
110
- return;
111
- }
112
- for (const c of result.changes) {
113
- const n = c.traces.length;
114
- console.info(`${c.kind} ${c.id} (${c.promise}, ${n} new trace${n === 1 ? "" : "s"})`);
115
- if (c.reopen.reopened) {
116
- console.info(` reopened ${c.owner}: Build Phase ${c.reopen.phase}: Maintenance — ${c.id}`);
117
- }
118
- else if (c.reopen.reason === "copy-problem") {
119
- console.error(` ${c.owner} was not reopened — its worktree assignment could not be read: ${c.reopen.detail}`);
120
- }
121
- else if (c.reopen.reason === "no-owner") {
122
- console.error(` owner "${c.owner}" is not a plan folder — nothing was reopened`);
123
- }
124
- }
125
- console.info("\nWritten, not committed: review the incidents and commit them.");
107
+ const report = watchReport(result);
108
+ for (const line of report.out)
109
+ console.info(line);
110
+ for (const line of report.err)
111
+ console.error(line);
112
+ if (report.exitCode !== 0)
113
+ process.exitCode = report.exitCode;
126
114
  }
@@ -18,9 +18,10 @@
18
18
  * Strategy order:
19
19
  * 1. If the text trims to a string starting with `{`, try parsing as-is.
20
20
  * 2. If a markdown code fence wraps the JSON, extract from inside the fence.
21
- * 3. Otherwise scan for the first `{` and find its matching `}` by
22
- * tracking nesting depth and string-literal state (so braces inside
23
- * string values don't fool the depth counter).
21
+ * 3. Otherwise scan from each `{` in turn for its matching `}`, tracking
22
+ * nesting depth and string-literal state (so braces inside string
23
+ * values don't fool the depth counter), and return the first balanced
24
+ * object that parses — prose before the scorecard often has braces too.
24
25
  *
25
26
  * The caller is responsible for `JSON.parse`-ing the returned substring.
26
27
  * This function only locates the JSON; it doesn't validate it.
@@ -18,9 +18,10 @@
18
18
  * Strategy order:
19
19
  * 1. If the text trims to a string starting with `{`, try parsing as-is.
20
20
  * 2. If a markdown code fence wraps the JSON, extract from inside the fence.
21
- * 3. Otherwise scan for the first `{` and find its matching `}` by
22
- * tracking nesting depth and string-literal state (so braces inside
23
- * string values don't fool the depth counter).
21
+ * 3. Otherwise scan from each `{` in turn for its matching `}`, tracking
22
+ * nesting depth and string-literal state (so braces inside string
23
+ * values don't fool the depth counter), and return the first balanced
24
+ * object that parses — prose before the scorecard often has braces too.
24
25
  *
25
26
  * The caller is responsible for `JSON.parse`-ing the returned substring.
26
27
  * This function only locates the JSON; it doesn't validate it.
@@ -51,31 +52,33 @@ export function extractScorecardJson(text) {
51
52
  // Fall through — fence content wasn't valid JSON, try balanced-brace scan
52
53
  }
53
54
  }
54
- // Strategy 3: balanced-brace scan
55
- const balanced = findFirstBalancedJsonObject(text);
56
- if (balanced) {
55
+ // Strategy 3: balanced-brace scan, from each `{` in turn. The first `{` is
56
+ // often prose — "rows keyed {kind, number}" — and giving up there lost
57
+ // five scorecards whose fenced JSON quoted a fence of its own
58
+ // (i-2026-10-03-every-commit-evaluated).
59
+ for (let start = text.indexOf("{"); start !== -1; start = text.indexOf("{", start + 1)) {
60
+ const balanced = balancedJsonObjectAt(text, start);
61
+ if (!balanced)
62
+ continue;
57
63
  try {
58
64
  JSON.parse(balanced);
59
65
  return balanced;
60
66
  }
61
67
  catch {
62
- return null;
68
+ // Prose that happens to balance — try the next `{`.
63
69
  }
64
70
  }
65
71
  return null;
66
72
  }
67
73
  /**
68
- * Walk the text looking for the first `{` and find its matching `}`,
69
- * tracking string-literal state and escape characters so braces inside
70
- * string values don't confuse the depth counter.
74
+ * From the `{` at `start`, find its matching `}`, tracking string-literal
75
+ * state and escape characters so braces inside string values don't confuse
76
+ * the depth counter.
71
77
  *
72
- * Returns the substring including both braces, or null if no balanced
73
- * object exists in the text.
78
+ * Returns the substring including both braces, or null if the brace at
79
+ * `start` never closes.
74
80
  */
75
- function findFirstBalancedJsonObject(text) {
76
- const start = text.indexOf("{");
77
- if (start === -1)
78
- return null;
81
+ function balancedJsonObjectAt(text, start) {
79
82
  let depth = 0;
80
83
  let inString = false;
81
84
  let escaped = false;
@@ -44,4 +44,6 @@ export declare function oneLine(value: string): string;
44
44
  * Record `violations` of `promise` in the registry at `registry.dir`. Returns
45
45
  * what changed, or null when every trace was already recorded.
46
46
  */
47
- export declare function recordViolations(registry: Registry, promise: PromiseEntry, violations: MarkedSpan[], source: IncidentSource, now: Date): IncidentChange | null;
47
+ export declare function recordViolations(registry: Registry, promise: PromiseEntry, violations: MarkedSpan[], source: IncidentSource, now: Date,
48
+ /** Ids an opened incident must not take: those the owner's Maintenance phases name. */
49
+ avoid?: ReadonlySet<string>): IncidentChange | null;
@@ -18,12 +18,20 @@ export function recorded(path) {
18
18
  lastSeen: last instanceof Date ? iso(last) : typeof last === "string" ? last : null,
19
19
  };
20
20
  }
21
- function newIncidentId(dir, promise, day) {
21
+ /**
22
+ * The next free incident id for a promise on a day. An id is taken when its
23
+ * file exists OR when `avoid` names it — the ids the owner's Maintenance
24
+ * phases already carry. A phase outlives its incident file, and a deleted
25
+ * file once freed its id for the next incident to collide with
26
+ * (watch-reopen-collision).
27
+ */
28
+ function newIncidentId(dir, promise, day, avoid) {
29
+ const free = (id) => !avoid.has(id) && !existsSync(join(dir, `${id}.md`));
22
30
  const base = `i-${day}-${promise}`;
23
- if (!existsSync(join(dir, `${base}.md`)))
31
+ if (free(base))
24
32
  return base;
25
33
  for (let n = 2;; n++) {
26
- if (!existsSync(join(dir, `${base}-${n}.md`)))
34
+ if (free(`${base}-${n}`))
27
35
  return `${base}-${n}`;
28
36
  }
29
37
  }
@@ -62,7 +70,9 @@ function incidentText(o) {
62
70
  * Record `violations` of `promise` in the registry at `registry.dir`. Returns
63
71
  * what changed, or null when every trace was already recorded.
64
72
  */
65
- export function recordViolations(registry, promise, violations, source, now) {
73
+ export function recordViolations(registry, promise, violations, source, now,
74
+ /** Ids an opened incident must not take: those the owner's Maintenance phases name. */
75
+ avoid = new Set()) {
66
76
  const dir = join(registry.dir, INCIDENTS_SUBDIR);
67
77
  const mine = registry.incidents.filter((i) => i.promise === promise.name);
68
78
  const known = new Set(mine.flatMap((i) => recorded(join(registry.dir, i.file)).traces));
@@ -85,7 +95,7 @@ export function recordViolations(registry, promise, violations, source, now) {
85
95
  }
86
96
  mkdirSync(dir, { recursive: true });
87
97
  const oldest = fresh.reduce((a, b) => (b.at < a.at ? b : a));
88
- const id = newIncidentId(dir, promise.name, iso(now).slice(0, 10));
98
+ const id = newIncidentId(dir, promise.name, iso(now).slice(0, 10), avoid);
89
99
  writeFileSync(join(dir, `${id}.md`), incidentText({
90
100
  id,
91
101
  promise: promise.name,
@@ -11,6 +11,13 @@
11
11
  */
12
12
  export declare const MAINTENANCE_TITLE = "Maintenance";
13
13
  export declare function maintenanceHeadingName(incidentId: string): string;
14
+ /**
15
+ * The incident ids an impl's Build-phase Maintenance headings already name —
16
+ * the inverse of `maintenanceHeadingName`. The id allocator avoids them
17
+ * (watch-reopen-collision): a phase outlives its incident file, so a deleted
18
+ * file must not free its id for the next incident to collide with.
19
+ */
20
+ export declare function maintenanceIncidentIds(implText: string): Set<string>;
14
21
  /** The owner's folder: active wins over archived, as everywhere else. */
15
22
  export declare function ownerDir(planRoot: string, owner: string): string | null;
16
23
  export type ReopenResult = {
@@ -21,6 +28,17 @@ export type ReopenResult = {
21
28
  reopened: false;
22
29
  reason: "already" | "no-owner";
23
30
  }
31
+ /**
32
+ * An opened incident whose Maintenance heading the owner already carries.
33
+ * Never a quiet "already": a new incident cannot have a phase yet, so a
34
+ * matching heading belongs to something else, and nothing was written
35
+ * (watch-reopen-collision).
36
+ */
37
+ | {
38
+ reopened: false;
39
+ reason: "collision";
40
+ heading: string;
41
+ }
24
42
  /** The plan-worktree record could not say where the owner lives; nothing was written. */
25
43
  | {
26
44
  reopened: false;
@@ -30,7 +48,9 @@ export type ReopenResult = {
30
48
  /** Append the incident's Maintenance phase to `owner`'s impl. */
31
49
  export declare function reopenOwner(planRoot: string, owner: string, incidentId: string, promise: string,
32
50
  /** The owner's live folder when it is assigned to a worktree (day-monitor A29); else found here. */
33
- liveDir?: string): ReopenResult;
51
+ liveDir?: string,
52
+ /** Whether the incident was just opened or extended; an existing heading means different things. */
53
+ kind?: "opened" | "extended"): ReopenResult;
34
54
  /** An impl with an unchecked item under a Maintenance phase — the plan is reopened. */
35
55
  export declare function openMaintenancePhases(implText: string): string[];
36
56
  /** `openMaintenancePhases` of the impl in plan folder `dir`; none when there is no impl. */
@@ -18,6 +18,19 @@ export const MAINTENANCE_TITLE = "Maintenance";
18
18
  export function maintenanceHeadingName(incidentId) {
19
19
  return `${MAINTENANCE_TITLE} — ${incidentId}`;
20
20
  }
21
+ /**
22
+ * The incident ids an impl's Build-phase Maintenance headings already name —
23
+ * the inverse of `maintenanceHeadingName`. The id allocator avoids them
24
+ * (watch-reopen-collision): a phase outlives its incident file, so a deleted
25
+ * file must not free its id for the next incident to collide with.
26
+ */
27
+ export function maintenanceIncidentIds(implText) {
28
+ const prefix = maintenanceHeadingName("");
29
+ return new Set(parseImplString(implText)
30
+ .phases.filter((p) => p.kind === "build" && p.name.startsWith(prefix))
31
+ .map((p) => p.name.slice(prefix.length).trim())
32
+ .filter((id) => id !== ""));
33
+ }
21
34
  /** The owner's folder: active wins over archived, as everywhere else. */
22
35
  export function ownerDir(planRoot, owner) {
23
36
  for (const dir of [
@@ -64,7 +77,9 @@ function maintenancePhase(n, incidentId, otelGate, rowId) {
64
77
  /** Append the incident's Maintenance phase to `owner`'s impl. */
65
78
  export function reopenOwner(planRoot, owner, incidentId, promise,
66
79
  /** The owner's live folder when it is assigned to a worktree (day-monitor A29); else found here. */
67
- liveDir) {
80
+ liveDir,
81
+ /** Whether the incident was just opened or extended; an existing heading means different things. */
82
+ kind = "extended") {
68
83
  const dir = liveDir ?? ownerDir(planRoot, owner);
69
84
  if (!dir)
70
85
  return { reopened: false, reason: "no-owner" };
@@ -78,8 +93,12 @@ liveDir) {
78
93
  const text = readFileSync(implPath, "utf-8");
79
94
  const parsed = parseImplString(text);
80
95
  const name = maintenanceHeadingName(incidentId);
81
- if (parsed.phases.some((p) => p.kind === "build" && p.name === name)) {
82
- return { reopened: false, reason: "already" };
96
+ // The same question `watch`'s unowned retry asks: the reopen's dedup and
97
+ // the retry must agree about whether the owner carries this incident.
98
+ if (maintenanceIncidentIds(text).has(incidentId)) {
99
+ return kind === "opened"
100
+ ? { reopened: false, reason: "collision", heading: name }
101
+ : { reopened: false, reason: "already" };
83
102
  }
84
103
  const next = Math.max(0, ...parsed.phases.filter((p) => p.kind === "build").map((p) => p.number)) + 1;
85
104
  const withRow = appendLateRow(text, next, {
@@ -8,15 +8,40 @@ import type { IncidentSource } from "./vocabulary.js";
8
8
  * documents and commits nothing — the person commits them. Throws
9
9
  * `JaegerUnreachable` rather than reporting a quiet window it never read.
10
10
  */
11
+ /**
12
+ * One thing a run did to an incident. `unowned` is an open incident from an
13
+ * earlier run whose owner carries no Maintenance phase for it — a reopen that
14
+ * failed then, retried now (watch-reopen-collision A6) — and has no new traces.
15
+ */
16
+ export interface WatchChange {
17
+ id: string;
18
+ kind: IncidentChange["kind"] | "unowned";
19
+ traces: string[];
20
+ promise: string;
21
+ owner: string;
22
+ reopen: ReopenResult;
23
+ }
11
24
  export interface WatchResult {
12
25
  source: string;
13
- changes: (IncidentChange & {
14
- promise: string;
15
- owner: string;
16
- reopen: ReopenResult;
17
- })[];
26
+ changes: WatchChange[];
18
27
  }
19
28
  export declare function watchPromises(planRoot: string, opts: {
20
29
  source: IncidentSource;
21
30
  now?: Date;
22
31
  }): Promise<WatchResult>;
32
+ export interface WatchReport {
33
+ out: string[];
34
+ err: string[];
35
+ /** 1 when an incident did not reach its owner; the person reading the exit code is told. */
36
+ exitCode: 0 | 1;
37
+ }
38
+ /**
39
+ * What `promises watch` says about a run, and how it exits. One rule for every
40
+ * reopen that did not happen (watch-reopen-collision): an incident — opened
41
+ * or extended — that did not reach its owner (a collision, an owner that is
42
+ * not a plan folder, a worktree record that could not be read) prints an
43
+ * error and fails the run, because a violation no plan owns, reported as
44
+ * success, is the one outcome the monitor exists to prevent. `already` — the
45
+ * owner carries the phase — is the normal second pass, and stays quiet.
46
+ */
47
+ export declare function watchReport(result: WatchResult): WatchReport;
@@ -1,22 +1,32 @@
1
- import { existsSync } from "node:fs";
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
2
3
  import { livePlanCopy } from "../worktree/plan-worktrees.js";
3
4
  import { recordViolations } from "./incidents.js";
4
5
  import { readPromises } from "./registry.js";
5
- import { reopenOwner } from "./reopen.js";
6
+ import { maintenanceIncidentIds, ownerDir, reopenOwner } from "./reopen.js";
6
7
  import { readPromiseMarks } from "./telemetry.js";
7
8
  /**
8
- * Reopen the owner where it is being worked: an active plan assigned to a
9
- * worktree gains its Maintenance phase in that worktree's copy, which is the
10
- * one `list_plans` and the admin read — not in the trunk's stale copy, where
11
- * nobody would see it and the landing merge would conflict (day-monitor A29).
9
+ * Where the owner is being worked: an active plan assigned to a worktree is
10
+ * reopened in that worktree's copy, which is the one `list_plans` and the
11
+ * admin read — not in the trunk's stale copy, where nobody would see it and
12
+ * the landing merge would conflict (day-monitor A29). Resolved once per
13
+ * promise, so the ids the allocator avoids come from the copy the reopen
14
+ * writes to.
12
15
  */
13
- async function reopenLive(planRoot, owner, incidentId, promise) {
16
+ async function ownerCopy(planRoot, owner) {
14
17
  const live = await livePlanCopy(planRoot, owner);
15
- if (!live.ok) {
16
- return { reopened: false, reason: "copy-problem", detail: `${live.file}: ${live.problem}` };
17
- }
18
- const dir = live.copy.source === "worktree" && existsSync(live.copy.dir) ? live.copy.dir : undefined;
19
- return reopenOwner(planRoot, owner, incidentId, promise, dir);
18
+ if (!live.ok)
19
+ return { ok: false, detail: `${live.file}: ${live.problem}` };
20
+ const liveDir = live.copy.source === "worktree" && existsSync(live.copy.dir) ? live.copy.dir : undefined;
21
+ return { ok: true, liveDir };
22
+ }
23
+ /** The incident ids the owner's Maintenance phases already name; none without an owner or an impl. */
24
+ function idsTakenByOwner(planRoot, owner, copy) {
25
+ if (!copy.ok)
26
+ return new Set();
27
+ const dir = copy.liveDir ?? ownerDir(planRoot, owner);
28
+ const impl = dir ? join(dir, "impl.md") : null;
29
+ return impl && existsSync(impl) ? maintenanceIncidentIds(readFileSync(impl, "utf-8")) : new Set();
20
30
  }
21
31
  export async function watchPromises(planRoot, opts) {
22
32
  const now = opts.now ?? new Date();
@@ -35,13 +45,80 @@ export async function watchPromises(planRoot, opts) {
35
45
  const changes = [];
36
46
  for (const promise of behaviour) {
37
47
  const violations = marks.byPromise.get(promise.name)?.violations ?? [];
38
- if (violations.length === 0)
39
- continue;
40
- const change = recordViolations(read.registry, promise, violations, opts.source, now);
41
- if (!change)
48
+ const open = read.registry.incidents.filter((i) => i.promise === promise.name && i.status === "open");
49
+ if (violations.length === 0 && open.length === 0)
42
50
  continue;
43
- const reopen = await reopenLive(planRoot, promise.owner, change.id, promise.name);
44
- changes.push({ ...change, promise: promise.name, owner: promise.owner, reopen });
51
+ const copy = await ownerCopy(planRoot, promise.owner);
52
+ const reopenFor = (id, kind) => copy.ok
53
+ ? reopenOwner(planRoot, promise.owner, id, promise.name, copy.liveDir, kind)
54
+ : { reopened: false, reason: "copy-problem", detail: copy.detail };
55
+ const avoid = idsTakenByOwner(planRoot, promise.owner, copy);
56
+ const change = violations.length > 0
57
+ ? recordViolations(read.registry, promise, violations, opts.source, now, avoid)
58
+ : null;
59
+ if (change) {
60
+ const reopen = reopenFor(change.id, change.kind);
61
+ changes.push({ ...change, promise: promise.name, owner: promise.owner, reopen });
62
+ }
63
+ // An open incident from an earlier run whose owner carries no phase for
64
+ // it was left unowned by a reopen that failed then. Retry it every run:
65
+ // a quiet window must still repair it, or say it cannot (A6).
66
+ const owned = idsTakenByOwner(planRoot, promise.owner, copy);
67
+ for (const incident of open) {
68
+ if (incident.id === change?.id || owned.has(incident.id))
69
+ continue;
70
+ changes.push({
71
+ id: incident.id,
72
+ kind: "unowned",
73
+ traces: [],
74
+ promise: promise.name,
75
+ owner: promise.owner,
76
+ reopen: reopenFor(incident.id, "extended"),
77
+ });
78
+ }
45
79
  }
46
80
  return { changes, source };
47
81
  }
82
+ /**
83
+ * What `promises watch` says about a run, and how it exits. One rule for every
84
+ * reopen that did not happen (watch-reopen-collision): an incident — opened
85
+ * or extended — that did not reach its owner (a collision, an owner that is
86
+ * not a plan folder, a worktree record that could not be read) prints an
87
+ * error and fails the run, because a violation no plan owns, reported as
88
+ * success, is the one outcome the monitor exists to prevent. `already` — the
89
+ * owner carries the phase — is the normal second pass, and stays quiet.
90
+ */
91
+ export function watchReport(result) {
92
+ const out = [`Read from Jaeger at ${result.source}.`];
93
+ const err = [];
94
+ if (result.changes.length === 0) {
95
+ out.push("No new violations — nothing recorded.");
96
+ return { out, err, exitCode: 0 };
97
+ }
98
+ let missed = false;
99
+ for (const c of result.changes) {
100
+ const n = c.traces.length;
101
+ out.push(c.kind === "unowned"
102
+ ? `unowned ${c.id} (${c.promise}: open, and ${c.owner} has no Maintenance phase for it)`
103
+ : `${c.kind} ${c.id} (${c.promise}, ${n} new trace${n === 1 ? "" : "s"})`);
104
+ const r = c.reopen;
105
+ if (r.reopened) {
106
+ out.push(` reopened ${c.owner}: Build Phase ${r.phase}: Maintenance — ${c.id}`);
107
+ continue;
108
+ }
109
+ if (r.reason === "copy-problem") {
110
+ err.push(` ${c.owner} was not reopened — its worktree assignment could not be read: ${r.detail}`);
111
+ }
112
+ else if (r.reason === "no-owner") {
113
+ err.push(` owner "${c.owner}" is not a plan folder — nothing was reopened`);
114
+ }
115
+ else if (r.reason === "collision") {
116
+ err.push(` ${c.owner} was not reopened — its impl already has "${r.heading}", which this new incident did not write; nothing was appended`);
117
+ }
118
+ // `already` is the one non-reopen that is not a miss: the owner carries the phase.
119
+ if (r.reason !== "already")
120
+ missed = true;
121
+ }
122
+ out.push("\nWritten, not committed: review the incidents and commit them.");
123
+ return { out, err, exitCode: missed ? 1 : 0 };
124
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infinitedusky/indusk-mcp",
3
- "version": "1.57.0",
3
+ "version": "1.57.2",
4
4
  "description": "InDusk development system — skills, MCP tools, and CLI for structured AI-assisted development",
5
5
  "type": "module",
6
6
  "files": [
@@ -163,6 +163,7 @@
163
163
  "start": "node dist/server/index.js",
164
164
  "test": "vitest run",
165
165
  "e2e": "vitest run --config vitest.e2e.config.ts",
166
- "release": "bash scripts/release-guard.sh && npm whoami && pnpm publish --no-git-checks && node scripts/record-release.js"
166
+ "test:system": "pnpm run prepublishOnly && vitest run --config vitest.system.config.ts",
167
+ "release": "bash scripts/release-guard.sh && pnpm test:system && npm whoami && pnpm publish --no-git-checks && node scripts/record-release.js"
167
168
  }
168
169
  }