@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.
- package/admin/.next/BUILD_ID +1 -1
- package/admin/.next/build-manifest.json +3 -3
- package/admin/.next/fallback-build-manifest.json +3 -3
- package/admin/.next/server/app/_global-error.html +1 -1
- package/admin/.next/server/app/_global-error.rsc +1 -1
- package/admin/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/admin/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/admin/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/admin/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/admin/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/admin/.next/server/chunks/ssr/[root-of-the-server]__0h32kmi._.js.map +1 -1
- package/admin/.next/server/chunks/ssr/[root-of-the-server]__0wm9s16._.js.map +1 -1
- package/admin/.next/server/middleware-build-manifest.js +3 -3
- package/admin/.next/server/pages/500.html +1 -1
- package/admin/.next/trace +1 -1
- package/admin/.next/trace-build +1 -1
- package/dist/bin/commands/promises.js +8 -20
- package/dist/lib/eval/scorecard-extractor.d.ts +4 -3
- package/dist/lib/eval/scorecard-extractor.js +19 -16
- package/dist/lib/promises/incidents.d.ts +3 -1
- package/dist/lib/promises/incidents.js +15 -5
- package/dist/lib/promises/reopen.d.ts +21 -1
- package/dist/lib/promises/reopen.js +22 -3
- package/dist/lib/promises/watch.d.ts +30 -5
- package/dist/lib/promises/watch.js +95 -18
- package/package.json +3 -2
- /package/admin/.next/static/{cfBb4Ykd8a8KEE1Zj6ihm → J9OMtrT45NqCFCk5PfvFj}/_buildManifest.js +0 -0
- /package/admin/.next/static/{cfBb4Ykd8a8KEE1Zj6ihm → J9OMtrT45NqCFCk5PfvFj}/_clientMiddlewareManifest.js +0 -0
- /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/
|
|
11
|
-
"static/
|
|
12
|
-
"static/
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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\":\"
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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":
|
|
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"}]
|
package/admin/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-turbopack","duration":
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
console.info(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
|
|
68
|
+
// Prose that happens to balance — try the next `{`.
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
return null;
|
|
66
72
|
}
|
|
67
73
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
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
|
|
73
|
-
*
|
|
78
|
+
* Returns the substring including both braces, or null if the brace at
|
|
79
|
+
* `start` never closes.
|
|
74
80
|
*/
|
|
75
|
-
function
|
|
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
|
|
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
|
-
|
|
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 (
|
|
31
|
+
if (free(base))
|
|
24
32
|
return base;
|
|
25
33
|
for (let n = 2;; n++) {
|
|
26
|
-
if (
|
|
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
|
|
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
|
-
|
|
82
|
-
|
|
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:
|
|
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
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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
|
|
16
|
+
async function ownerCopy(planRoot, owner) {
|
|
14
17
|
const live = await livePlanCopy(planRoot, owner);
|
|
15
|
-
if (!live.ok)
|
|
16
|
-
return {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
39
|
-
|
|
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
|
|
44
|
-
|
|
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.
|
|
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
|
-
"
|
|
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
|
}
|
/package/admin/.next/static/{cfBb4Ykd8a8KEE1Zj6ihm → J9OMtrT45NqCFCk5PfvFj}/_buildManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|