gsd-pi 2.41.0-dev.97349b1 → 2.41.0-dev.b832948
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/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +118 -100
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/captures.test.ts +1 -12
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +20 -20
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +105 -195
- /package/dist/web/standalone/.next/static/{ZrI3HOoXD7Fh84fAHZVxb → 43Aw72Fdw8k1aAHQOYOXr}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{ZrI3HOoXD7Fh84fAHZVxb → 43Aw72Fdw8k1aAHQOYOXr}/_ssgManifest.js +0 -0
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
3:I[90484,[],"MetadataBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
5
|
5:I[86869,[],"IconMark"]
|
|
6
|
-
0:{"buildId":"
|
|
6
|
+
0:{"buildId":"43Aw72Fdw8k1aAHQOYOXr","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"GSD"}],["$","meta","1",{"name":"description","content":"The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project."}],["$","meta","2",{"name":"application-name","content":"GSD"}],["$","link","3",{"rel":"icon","href":"/icon-light-32x32.png","media":"(prefers-color-scheme: light)"}],["$","link","4",{"rel":"icon","href":"/icon-dark-32x32.png","media":"(prefers-color-scheme: dark)"}],["$","link","5",{"rel":"icon","href":"/icon.svg","type":"image/svg+xml"}],["$","$L5","6",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"loading":null,"isPartial":false}
|
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
5:I[61549,["4986","static/chunks/4986-c2fc8845ce785303.js","7177","static/chunks/app/layout-a16c7a7ecdf0c2cf.js"],"Toaster"]
|
|
6
6
|
:HL["/_next/static/css/de70bee13400563f.css","style"]
|
|
7
7
|
:HL["/_next/static/css/123c0bb039697968.css","style"]
|
|
8
|
-
0:{"buildId":"
|
|
8
|
+
0:{"buildId":"43Aw72Fdw8k1aAHQOYOXr","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/de70bee13400563f.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/123c0bb039697968.css","precedence":"next"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_188709 __variable_9a8899 font-sans antialiased","children":["$","$L2",null,{"attribute":"class","defaultTheme":"dark","children":[["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}],["$","$L5",null,{"position":"bottom-right"}]]}]}]}]]}],"loading":null,"isPartial":false}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
:HL["/_next/static/media/93f479601ee12b01-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
3
3
|
:HL["/_next/static/css/de70bee13400563f.css","style"]
|
|
4
4
|
:HL["/_next/static/css/123c0bb039697968.css","style"]
|
|
5
|
-
0:{"buildId":"
|
|
5
|
+
0:{"buildId":"43Aw72Fdw8k1aAHQOYOXr","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
"/_not-found/page": "app/_not-found/page.js",
|
|
3
2
|
"/_global-error/page": "app/_global-error/page.js",
|
|
3
|
+
"/_not-found/page": "app/_not-found/page.js",
|
|
4
4
|
"/api/bridge-terminal/resize/route": "app/api/bridge-terminal/resize/route.js",
|
|
5
5
|
"/api/boot/route": "app/api/boot/route.js",
|
|
6
|
-
"/api/bridge-terminal/stream/route": "app/api/bridge-terminal/stream/route.js",
|
|
7
|
-
"/api/cleanup/route": "app/api/cleanup/route.js",
|
|
8
6
|
"/api/browse-directories/route": "app/api/browse-directories/route.js",
|
|
7
|
+
"/api/bridge-terminal/input/route": "app/api/bridge-terminal/input/route.js",
|
|
8
|
+
"/api/dev-mode/route": "app/api/dev-mode/route.js",
|
|
9
|
+
"/api/cleanup/route": "app/api/cleanup/route.js",
|
|
9
10
|
"/api/captures/route": "app/api/captures/route.js",
|
|
10
11
|
"/api/export-data/route": "app/api/export-data/route.js",
|
|
11
|
-
"/api/dev-mode/route": "app/api/dev-mode/route.js",
|
|
12
12
|
"/api/git/route": "app/api/git/route.js",
|
|
13
13
|
"/api/doctor/route": "app/api/doctor/route.js",
|
|
14
14
|
"/api/forensics/route": "app/api/forensics/route.js",
|
|
@@ -19,26 +19,26 @@
|
|
|
19
19
|
"/api/live-state/route": "app/api/live-state/route.js",
|
|
20
20
|
"/api/preferences/route": "app/api/preferences/route.js",
|
|
21
21
|
"/api/onboarding/route": "app/api/onboarding/route.js",
|
|
22
|
-
"/api/recovery/route": "app/api/recovery/route.js",
|
|
23
|
-
"/api/bridge-terminal/input/route": "app/api/bridge-terminal/input/route.js",
|
|
24
22
|
"/api/projects/route": "app/api/projects/route.js",
|
|
23
|
+
"/api/files/route": "app/api/files/route.js",
|
|
25
24
|
"/api/session/browser/route": "app/api/session/browser/route.js",
|
|
26
25
|
"/api/session/command/route": "app/api/session/command/route.js",
|
|
27
26
|
"/api/session/events/route": "app/api/session/events/route.js",
|
|
28
27
|
"/api/settings-data/route": "app/api/settings-data/route.js",
|
|
29
|
-
"/api/session/manage/route": "app/api/session/manage/route.js",
|
|
30
28
|
"/api/shutdown/route": "app/api/shutdown/route.js",
|
|
31
29
|
"/api/skill-health/route": "app/api/skill-health/route.js",
|
|
30
|
+
"/api/session/manage/route": "app/api/session/manage/route.js",
|
|
32
31
|
"/api/steer/route": "app/api/steer/route.js",
|
|
33
|
-
"/api/terminal/resize/route": "app/api/terminal/resize/route.js",
|
|
34
32
|
"/api/terminal/input/route": "app/api/terminal/input/route.js",
|
|
33
|
+
"/api/terminal/resize/route": "app/api/terminal/resize/route.js",
|
|
35
34
|
"/api/terminal/sessions/route": "app/api/terminal/sessions/route.js",
|
|
36
35
|
"/api/terminal/stream/route": "app/api/terminal/stream/route.js",
|
|
37
|
-
"/api/undo/route": "app/api/undo/route.js",
|
|
38
36
|
"/api/terminal/upload/route": "app/api/terminal/upload/route.js",
|
|
37
|
+
"/api/undo/route": "app/api/undo/route.js",
|
|
39
38
|
"/api/update/route": "app/api/update/route.js",
|
|
40
|
-
"/api/visualizer/route": "app/api/visualizer/route.js",
|
|
41
39
|
"/api/remote-questions/route": "app/api/remote-questions/route.js",
|
|
42
|
-
"/api/
|
|
40
|
+
"/api/visualizer/route": "app/api/visualizer/route.js",
|
|
41
|
+
"/api/recovery/route": "app/api/recovery/route.js",
|
|
42
|
+
"/api/bridge-terminal/stream/route": "app/api/bridge-terminal/stream/route.js",
|
|
43
43
|
"/page": "app/page.js"
|
|
44
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--43Aw72Fdw8k1aAHQOYOXr--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/4cf2300e9c8272f7-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/de70bee13400563f.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/123c0bb039697968.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-fa307370fcf9fb2c.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><script src="/_next/static/chunks/4986-c2fc8845ce785303.js" async=""></script><script src="/_next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>GSD</title><meta name="description" content="The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project."/><meta name="application-name" content="GSD"/><link rel="icon" href="/icon-light-32x32.png" media="(prefers-color-scheme: light)"/><link rel="icon" href="/icon-dark-32x32.png" media="(prefers-color-scheme: dark)"/><link rel="icon" href="/icon.svg" type="image/svg+xml"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_188709 __variable_9a8899 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,true,true)</script><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false"></section><script src="/_next/static/chunks/webpack-fa307370fcf9fb2c.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[21942,[\"4986\",\"static/chunks/4986-c2fc8845ce785303.js\",\"7177\",\"static/chunks/app/layout-a16c7a7ecdf0c2cf.js\"],\"ThemeProvider\"]\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[61549,[\"4986\",\"static/chunks/4986-c2fc8845ce785303.js\",\"7177\",\"static/chunks/app/layout-a16c7a7ecdf0c2cf.js\"],\"Toaster\"]\n6:I[90484,[],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[90484,[],\"ViewportBoundary\"]\nb:I[90484,[],\"MetadataBoundary\"]\nd:I[27123,[],\"\"]\n:HL[\"/_next/static/media/4cf2300e9c8272f7-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/de70bee13400563f.css\",\"style\"]\n:HL[\"/_next/static/css/123c0bb039697968.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"43Aw72Fdw8k1aAHQOYOXr\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/de70bee13400563f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/123c0bb039697968.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_188709 __variable_9a8899 font-sans antialiased\",\"children\":[\"$\",\"$L2\",null,{\"attribute\":\"class\",\"defaultTheme\":\"dark\",\"children\":[[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L5\",null,{\"position\":\"bottom-right\"}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[86869,[],\"IconMark\"]\n8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"GSD\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"The evolution of Get Shit Done — now a real coding agent. One command. Walk away. Come back to a built project.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"application-name\",\"content\":\"GSD\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/icon-light-32x32.png\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/icon-dark-32x32.png\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/icon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"$Le\",\"6\",{}]]\n"])</script></body></html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-fa307370fcf9fb2c.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[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--43Aw72Fdw8k1aAHQOYOXr--><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/webpack-fa307370fcf9fb2c.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-337d1ca25ad99a89.js" async=""></script><script src="/_next/static/chunks/main-app-fdab67f7802d7832.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/polyfills-42372ed130431b0a.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;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-fa307370fcf9fb2c.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[57121,[],\"\"]\n3:I[74581,[],\"\"]\n4:I[90484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[90484,[],\"ViewportBoundary\"]\n9:I[90484,[],\"MetadataBoundary\"]\nb:I[27123,[],\"\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"43Aw72Fdw8k1aAHQOYOXr\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"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\":[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: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"node":{},"edge":{},"encryptionKey":"
|
|
1
|
+
{"node":{},"edge":{},"encryptionKey":"qpFI5GSqmvfaIfepN/zFKRjrzM/zqzsnO6ftf8xTRHI="}
|
package/package.json
CHANGED
|
@@ -595,6 +595,7 @@ test("autoLoop calls deriveState → resolveDispatch → runUnit in sequence", a
|
|
|
595
595
|
ctx.sessionManager = { getSessionFile: () => "/tmp/session.json" };
|
|
596
596
|
const pi = makeMockPi();
|
|
597
597
|
|
|
598
|
+
let loopCount = 0;
|
|
598
599
|
const s = makeLoopSession();
|
|
599
600
|
|
|
600
601
|
const deps = makeMockDeps({
|
|
@@ -620,8 +621,11 @@ test("autoLoop calls deriveState → resolveDispatch → runUnit in sequence", a
|
|
|
620
621
|
},
|
|
621
622
|
postUnitPostVerification: async () => {
|
|
622
623
|
deps.callLog.push("postUnitPostVerification");
|
|
623
|
-
|
|
624
|
-
|
|
624
|
+
loopCount++;
|
|
625
|
+
// After first iteration, deactivate to exit the loop
|
|
626
|
+
if (loopCount >= 1) {
|
|
627
|
+
s.active = false;
|
|
628
|
+
}
|
|
625
629
|
return "continue" as const;
|
|
626
630
|
},
|
|
627
631
|
});
|
|
@@ -679,6 +683,7 @@ test("crash lock records session file from AFTER newSession, not before (#1710)"
|
|
|
679
683
|
};
|
|
680
684
|
const pi = makeMockPi();
|
|
681
685
|
|
|
686
|
+
let loopCount = 0;
|
|
682
687
|
const s = makeLoopSession({
|
|
683
688
|
cmdCtx: {
|
|
684
689
|
newSession: () => {
|
|
@@ -726,8 +731,10 @@ test("crash lock records session file from AFTER newSession, not before (#1710)"
|
|
|
726
731
|
},
|
|
727
732
|
postUnitPostVerification: async () => {
|
|
728
733
|
deps.callLog.push("postUnitPostVerification");
|
|
729
|
-
|
|
730
|
-
|
|
734
|
+
loopCount++;
|
|
735
|
+
if (loopCount >= 1) {
|
|
736
|
+
s.active = false;
|
|
737
|
+
}
|
|
731
738
|
return "continue" as const;
|
|
732
739
|
},
|
|
733
740
|
});
|
|
@@ -784,23 +791,6 @@ test("autoLoop handles verification retry by continuing loop", async (t) => {
|
|
|
784
791
|
let deriveCallCount = 0;
|
|
785
792
|
const s = makeLoopSession();
|
|
786
793
|
|
|
787
|
-
// Pre-queued verification actions: each entry provides a side-effect + return value
|
|
788
|
-
type VerifyAction = { sideEffect?: () => void; response: "retry" | "continue" };
|
|
789
|
-
const verificationActions: VerifyAction[] = [
|
|
790
|
-
{
|
|
791
|
-
sideEffect: () => {
|
|
792
|
-
// Simulate retry — set pendingVerificationRetry on session
|
|
793
|
-
s.pendingVerificationRetry = {
|
|
794
|
-
unitId: "M001/S01/T01",
|
|
795
|
-
failureContext: "test failed: expected X got Y",
|
|
796
|
-
attempt: 1,
|
|
797
|
-
};
|
|
798
|
-
},
|
|
799
|
-
response: "retry",
|
|
800
|
-
},
|
|
801
|
-
{ response: "continue" },
|
|
802
|
-
];
|
|
803
|
-
|
|
804
794
|
const deps = makeMockDeps({
|
|
805
795
|
deriveState: async () => {
|
|
806
796
|
deriveCallCount++;
|
|
@@ -815,11 +805,19 @@ test("autoLoop handles verification retry by continuing loop", async (t) => {
|
|
|
815
805
|
} as any;
|
|
816
806
|
},
|
|
817
807
|
runPostUnitVerification: async () => {
|
|
818
|
-
const action = verificationActions[verifyCallCount] ?? { response: "continue" as const };
|
|
819
808
|
verifyCallCount++;
|
|
820
809
|
deps.callLog.push("runPostUnitVerification");
|
|
821
|
-
|
|
822
|
-
|
|
810
|
+
if (verifyCallCount === 1) {
|
|
811
|
+
// First call: simulate retry — set pendingVerificationRetry on session
|
|
812
|
+
s.pendingVerificationRetry = {
|
|
813
|
+
unitId: "M001/S01/T01",
|
|
814
|
+
failureContext: "test failed: expected X got Y",
|
|
815
|
+
attempt: 1,
|
|
816
|
+
};
|
|
817
|
+
return "retry" as const;
|
|
818
|
+
}
|
|
819
|
+
// Second call: pass
|
|
820
|
+
return "continue" as const;
|
|
823
821
|
},
|
|
824
822
|
postUnitPostVerification: async () => {
|
|
825
823
|
deps.callLog.push("postUnitPostVerification");
|
|
@@ -896,17 +894,19 @@ test("autoLoop handles dispatch skip action by continuing", async (t) => {
|
|
|
896
894
|
const s = makeLoopSession();
|
|
897
895
|
|
|
898
896
|
let dispatchCallCount = 0;
|
|
899
|
-
// Pre-queued dispatch responses: first call returns "skip", second returns "stop"
|
|
900
|
-
const dispatchResponses = [
|
|
901
|
-
{ action: "skip" as const },
|
|
902
|
-
{ action: "stop" as const, reason: "done", level: "info" as const },
|
|
903
|
-
];
|
|
904
897
|
const deps = makeMockDeps({
|
|
905
898
|
resolveDispatch: async () => {
|
|
906
|
-
const response = dispatchResponses[dispatchCallCount] ?? dispatchResponses[dispatchResponses.length - 1];
|
|
907
899
|
dispatchCallCount++;
|
|
908
900
|
deps.callLog.push("resolveDispatch");
|
|
909
|
-
|
|
901
|
+
if (dispatchCallCount === 1) {
|
|
902
|
+
return { action: "skip" as const };
|
|
903
|
+
}
|
|
904
|
+
// Second time: stop to exit the loop
|
|
905
|
+
return {
|
|
906
|
+
action: "stop" as const,
|
|
907
|
+
reason: "done",
|
|
908
|
+
level: "info" as const,
|
|
909
|
+
};
|
|
910
910
|
},
|
|
911
911
|
});
|
|
912
912
|
|
|
@@ -936,26 +936,22 @@ test("autoLoop drains sidecar queue after postUnitPostVerification enqueues item
|
|
|
936
936
|
const s = makeLoopSession();
|
|
937
937
|
|
|
938
938
|
let postVerCallCount = 0;
|
|
939
|
-
const postVerActions: Array<() => void> = [
|
|
940
|
-
() => {
|
|
941
|
-
// First call (main unit): enqueue a sidecar item
|
|
942
|
-
s.sidecarQueue.push({
|
|
943
|
-
kind: "hook" as const,
|
|
944
|
-
unitType: "hook/review",
|
|
945
|
-
unitId: "M001/S01/T01/review",
|
|
946
|
-
prompt: "review the code",
|
|
947
|
-
});
|
|
948
|
-
},
|
|
949
|
-
() => {
|
|
950
|
-
// Second call (sidecar unit completed): deactivate
|
|
951
|
-
s.active = false;
|
|
952
|
-
},
|
|
953
|
-
];
|
|
954
939
|
const deps = makeMockDeps({
|
|
955
940
|
postUnitPostVerification: async () => {
|
|
956
|
-
postVerActions[postVerCallCount]?.();
|
|
957
941
|
postVerCallCount++;
|
|
958
942
|
deps.callLog.push("postUnitPostVerification");
|
|
943
|
+
if (postVerCallCount === 1) {
|
|
944
|
+
// First call (main unit): enqueue a sidecar item
|
|
945
|
+
s.sidecarQueue.push({
|
|
946
|
+
kind: "hook" as const,
|
|
947
|
+
unitType: "hook/review",
|
|
948
|
+
unitId: "M001/S01/T01/review",
|
|
949
|
+
prompt: "review the code",
|
|
950
|
+
});
|
|
951
|
+
return "continue" as const;
|
|
952
|
+
}
|
|
953
|
+
// Second call (sidecar unit completed): done
|
|
954
|
+
s.active = false;
|
|
959
955
|
return "continue" as const;
|
|
960
956
|
},
|
|
961
957
|
});
|
|
@@ -1123,13 +1119,13 @@ test("startAuto calls selfHealRuntimeRecords before autoLoop (#1727)", () => {
|
|
|
1123
1119
|
assert.ok(healIdx > -1, "startAuto must call selfHealRuntimeRecords");
|
|
1124
1120
|
assert.ok(healIdx < loopIdx, "selfHealRuntimeRecords must be called before autoLoop");
|
|
1125
1121
|
|
|
1126
|
-
// Verify the second autoLoop call site also has selfHeal before it
|
|
1122
|
+
// Verify the second autoLoop call site also has selfHeal before it
|
|
1127
1123
|
const secondLoopIdx = fnBlock.indexOf("autoLoop(", loopIdx + 1);
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1124
|
+
if (secondLoopIdx > -1) {
|
|
1125
|
+
const secondHealIdx = fnBlock.indexOf("selfHealRuntimeRecords", healIdx + 1);
|
|
1126
|
+
assert.ok(secondHealIdx > -1, "second autoLoop call must also have selfHealRuntimeRecords");
|
|
1127
|
+
assert.ok(secondHealIdx < secondLoopIdx, "second selfHealRuntimeRecords must precede second autoLoop");
|
|
1128
|
+
}
|
|
1133
1129
|
});
|
|
1134
1130
|
|
|
1135
1131
|
test("agent_end handler calls resolveAgentEnd (not handleAgentEnd)", () => {
|
|
@@ -1291,29 +1287,25 @@ test("stuck detection: window resets recovery when deriveState returns a differe
|
|
|
1291
1287
|
const s = makeLoopSession();
|
|
1292
1288
|
|
|
1293
1289
|
let deriveCallCount = 0;
|
|
1294
|
-
let postVerCallCount = 0;
|
|
1295
1290
|
let stopCalled = false;
|
|
1296
1291
|
|
|
1297
|
-
// First 3 derives return T01, 4th returns T02; dispatch follows the derived task
|
|
1298
|
-
const derivedTaskIds = ["T01", "T01", "T01", "T02"];
|
|
1299
|
-
|
|
1300
1292
|
const deps = makeMockDeps({
|
|
1301
1293
|
deriveState: async () => {
|
|
1302
|
-
const taskId = derivedTaskIds[Math.min(deriveCallCount, derivedTaskIds.length - 1)];
|
|
1303
1294
|
deriveCallCount++;
|
|
1304
1295
|
deps.callLog.push("deriveState");
|
|
1305
1296
|
return {
|
|
1306
1297
|
phase: "executing",
|
|
1307
1298
|
activeMilestone: { id: "M001", title: "Test", status: "active" },
|
|
1308
1299
|
activeSlice: { id: "S01", title: "Slice 1" },
|
|
1309
|
-
activeTask: { id:
|
|
1300
|
+
activeTask: { id: deriveCallCount <= 3 ? "T01" : "T02" },
|
|
1310
1301
|
registry: [{ id: "M001", status: "active" }],
|
|
1311
1302
|
blockers: [],
|
|
1312
1303
|
} as any;
|
|
1313
1304
|
},
|
|
1314
1305
|
resolveDispatch: async () => {
|
|
1315
|
-
const taskId = derivedTaskIds[Math.min(deriveCallCount - 1, derivedTaskIds.length - 1)];
|
|
1316
1306
|
deps.callLog.push("resolveDispatch");
|
|
1307
|
+
// Return dispatch matching the task from deriveState
|
|
1308
|
+
const taskId = deriveCallCount <= 3 ? "T01" : "T02";
|
|
1317
1309
|
return {
|
|
1318
1310
|
action: "dispatch" as const,
|
|
1319
1311
|
unitType: "execute-task",
|
|
@@ -1327,11 +1319,11 @@ test("stuck detection: window resets recovery when deriveState returns a differe
|
|
|
1327
1319
|
s.active = false;
|
|
1328
1320
|
},
|
|
1329
1321
|
postUnitPostVerification: async () => {
|
|
1330
|
-
postVerCallCount++;
|
|
1331
1322
|
deps.callLog.push("postUnitPostVerification");
|
|
1332
|
-
//
|
|
1333
|
-
|
|
1334
|
-
|
|
1323
|
+
// After 4th iteration (unit changed on iter 4), exit
|
|
1324
|
+
if (deriveCallCount >= 4) {
|
|
1325
|
+
s.active = false;
|
|
1326
|
+
}
|
|
1335
1327
|
return "continue" as const;
|
|
1336
1328
|
},
|
|
1337
1329
|
});
|
|
@@ -1370,14 +1362,6 @@ test("stuck detection: does not push to window during verification retry", async
|
|
|
1370
1362
|
let verifyCallCount = 0;
|
|
1371
1363
|
let stopReason = "";
|
|
1372
1364
|
|
|
1373
|
-
// Pre-queued responses: 3 retries then a continue (exit)
|
|
1374
|
-
const verifyActions: Array<() => "retry" | "continue"> = [
|
|
1375
|
-
() => { s.pendingVerificationRetry = { unitId: "M001/S01/T01", failureContext: "test failed", attempt: 1 }; return "retry"; },
|
|
1376
|
-
() => { s.pendingVerificationRetry = { unitId: "M001/S01/T01", failureContext: "test failed", attempt: 2 }; return "retry"; },
|
|
1377
|
-
() => { s.pendingVerificationRetry = { unitId: "M001/S01/T01", failureContext: "test failed", attempt: 3 }; return "retry"; },
|
|
1378
|
-
() => { s.active = false; return "continue"; },
|
|
1379
|
-
];
|
|
1380
|
-
|
|
1381
1365
|
const deps = makeMockDeps({
|
|
1382
1366
|
deriveState: async () =>
|
|
1383
1367
|
({
|
|
@@ -1395,10 +1379,20 @@ test("stuck detection: does not push to window during verification retry", async
|
|
|
1395
1379
|
prompt: "do the thing",
|
|
1396
1380
|
}),
|
|
1397
1381
|
runPostUnitVerification: async () => {
|
|
1398
|
-
const action = verifyActions[verifyCallCount] ?? (() => { s.active = false; return "continue" as const; });
|
|
1399
1382
|
verifyCallCount++;
|
|
1400
1383
|
deps.callLog.push("runPostUnitVerification");
|
|
1401
|
-
|
|
1384
|
+
if (verifyCallCount <= 3) {
|
|
1385
|
+
// Set pendingVerificationRetry — should prevent stuck counter increment
|
|
1386
|
+
s.pendingVerificationRetry = {
|
|
1387
|
+
unitId: "M001/S01/T01",
|
|
1388
|
+
failureContext: "test failed",
|
|
1389
|
+
attempt: verifyCallCount,
|
|
1390
|
+
};
|
|
1391
|
+
return "retry" as const;
|
|
1392
|
+
}
|
|
1393
|
+
// After 3 retries, exit gracefully
|
|
1394
|
+
s.active = false;
|
|
1395
|
+
return "continue" as const;
|
|
1402
1396
|
},
|
|
1403
1397
|
stopAuto: async (_ctx?: any, _pi?: any, reason?: string) => {
|
|
1404
1398
|
deps.callLog.push("stopAuto");
|
|
@@ -1550,7 +1544,7 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
|
|
|
1550
1544
|
const dispatchedUnitTypes: string[] = [];
|
|
1551
1545
|
|
|
1552
1546
|
// Phase sequence: each deriveState call returns a different phase.
|
|
1553
|
-
//
|
|
1547
|
+
// On the 6th call (start of iteration 6), we deactivate to exit.
|
|
1554
1548
|
const phases = [
|
|
1555
1549
|
// Call 1: researching → dispatches research-slice
|
|
1556
1550
|
{
|
|
@@ -1582,12 +1576,6 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
|
|
|
1582
1576
|
activeSlice: { id: "S01", title: "Complete Slice" },
|
|
1583
1577
|
activeTask: null,
|
|
1584
1578
|
},
|
|
1585
|
-
// Call 6: terminal — deactivate to exit the loop
|
|
1586
|
-
{
|
|
1587
|
-
phase: "complete",
|
|
1588
|
-
activeSlice: null,
|
|
1589
|
-
activeTask: null,
|
|
1590
|
-
},
|
|
1591
1579
|
];
|
|
1592
1580
|
|
|
1593
1581
|
const dispatches = [
|
|
@@ -1600,26 +1588,46 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
|
|
|
1600
1588
|
|
|
1601
1589
|
const deps = makeMockDeps({
|
|
1602
1590
|
deriveState: async () => {
|
|
1603
|
-
const p = phases[Math.min(deriveCallCount, phases.length - 1)];
|
|
1604
1591
|
deriveCallCount++;
|
|
1605
1592
|
deps.callLog.push("deriveState");
|
|
1606
1593
|
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1594
|
+
if (deriveCallCount > phases.length) {
|
|
1595
|
+
// 6th+ call: deactivate to exit the loop
|
|
1596
|
+
s.active = false;
|
|
1597
|
+
return {
|
|
1598
|
+
phase: "complete",
|
|
1599
|
+
activeMilestone: { id: "M001", title: "Test", status: "complete" },
|
|
1600
|
+
activeSlice: null,
|
|
1601
|
+
activeTask: null,
|
|
1602
|
+
registry: [{ id: "M001", status: "complete" }],
|
|
1603
|
+
blockers: [],
|
|
1604
|
+
} as any;
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
const p = phases[deriveCallCount - 1];
|
|
1610
1608
|
return {
|
|
1611
1609
|
phase: p.phase,
|
|
1612
|
-
activeMilestone: { id: "M001", title: "Test", status:
|
|
1613
|
-
activeSlice: p.activeSlice
|
|
1614
|
-
activeTask: p.activeTask
|
|
1615
|
-
registry: [{ id: "M001", status:
|
|
1610
|
+
activeMilestone: { id: "M001", title: "Test", status: "active" },
|
|
1611
|
+
activeSlice: p.activeSlice,
|
|
1612
|
+
activeTask: p.activeTask,
|
|
1613
|
+
registry: [{ id: "M001", status: "active" }],
|
|
1616
1614
|
blockers: [],
|
|
1617
1615
|
} as any;
|
|
1618
1616
|
},
|
|
1619
1617
|
resolveDispatch: async () => {
|
|
1620
|
-
const d = dispatches[Math.min(dispatchCallCount, dispatches.length - 1)];
|
|
1621
1618
|
dispatchCallCount++;
|
|
1622
1619
|
deps.callLog.push("resolveDispatch");
|
|
1620
|
+
|
|
1621
|
+
if (dispatchCallCount > dispatches.length) {
|
|
1622
|
+
// Safety: shouldn't reach here, but stop if it does
|
|
1623
|
+
return {
|
|
1624
|
+
action: "stop" as const,
|
|
1625
|
+
reason: "done",
|
|
1626
|
+
level: "info" as const,
|
|
1627
|
+
};
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
const d = dispatches[dispatchCallCount - 1];
|
|
1623
1631
|
dispatchedUnitTypes.push(d.unitType);
|
|
1624
1632
|
return {
|
|
1625
1633
|
action: "dispatch" as const,
|
|
@@ -1684,11 +1692,18 @@ test("autoLoop lifecycle: advances through research → plan → execute → ver
|
|
|
1684
1692
|
`callLog should have at least 5 resolveDispatch entries (got ${dispatchEntries.length})`,
|
|
1685
1693
|
);
|
|
1686
1694
|
|
|
1687
|
-
// Verify interleaving:
|
|
1688
|
-
|
|
1689
|
-
const
|
|
1690
|
-
|
|
1691
|
-
|
|
1695
|
+
// Verify interleaving: each resolveDispatch should follow a deriveState
|
|
1696
|
+
let dispatchSeen = 0;
|
|
1697
|
+
for (const entry of deps.callLog) {
|
|
1698
|
+
if (entry === "resolveDispatch") {
|
|
1699
|
+
dispatchSeen++;
|
|
1700
|
+
}
|
|
1701
|
+
if (entry === "deriveState" && dispatchSeen > 0) {
|
|
1702
|
+
// A deriveState after a resolveDispatch confirms the loop advanced
|
|
1703
|
+
break;
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
assert.ok(dispatchSeen > 0, "resolveDispatch should appear in callLog");
|
|
1692
1707
|
|
|
1693
1708
|
// Assert the exact sequence of dispatched unit types
|
|
1694
1709
|
assert.deepEqual(
|
|
@@ -1761,8 +1776,6 @@ test("autoLoop re-iterates when postUnitPreVerification returns retry (#1571)",
|
|
|
1761
1776
|
const s = makeLoopSession();
|
|
1762
1777
|
|
|
1763
1778
|
let preVerifyCallCount = 0;
|
|
1764
|
-
// Pre-queued responses: first call returns "retry", second returns "continue"
|
|
1765
|
-
const preVerifyResponses = ["retry", "continue"] as const;
|
|
1766
1779
|
|
|
1767
1780
|
const deps = makeMockDeps({
|
|
1768
1781
|
deriveState: async () => {
|
|
@@ -1778,7 +1791,11 @@ test("autoLoop re-iterates when postUnitPreVerification returns retry (#1571)",
|
|
|
1778
1791
|
},
|
|
1779
1792
|
postUnitPreVerification: async () => {
|
|
1780
1793
|
deps.callLog.push("postUnitPreVerification");
|
|
1781
|
-
|
|
1794
|
+
preVerifyCallCount++;
|
|
1795
|
+
if (preVerifyCallCount === 1) {
|
|
1796
|
+
return "retry" as const;
|
|
1797
|
+
}
|
|
1798
|
+
return "continue" as const;
|
|
1782
1799
|
},
|
|
1783
1800
|
postUnitPostVerification: async () => {
|
|
1784
1801
|
deps.callLog.push("postUnitPostVerification");
|
|
@@ -1891,8 +1908,9 @@ test("autoLoop rejects execute-task with 0 tool calls as hallucinated (#1833)",
|
|
|
1891
1908
|
postUnitPostVerification: async () => {
|
|
1892
1909
|
deps.callLog.push("postUnitPostVerification");
|
|
1893
1910
|
iterationCount++;
|
|
1894
|
-
|
|
1895
|
-
|
|
1911
|
+
if (iterationCount >= 2) {
|
|
1912
|
+
s.active = false;
|
|
1913
|
+
}
|
|
1896
1914
|
return "continue" as const;
|
|
1897
1915
|
},
|
|
1898
1916
|
});
|
|
@@ -101,8 +101,8 @@ test('secrets gate: pending keys exist — gate triggers collection, manifest up
|
|
|
101
101
|
const status = await getManifestStatus(tmp, 'M001');
|
|
102
102
|
assert.notStrictEqual(status, null, 'manifest should exist');
|
|
103
103
|
assert.ok(status!.pending.length > 0, 'should have pending keys');
|
|
104
|
-
assert.deepStrictEqual(status!.pending, ['GSD_GATE_TEST_PEND_A', 'GSD_GATE_TEST_PEND_B']
|
|
105
|
-
assert.deepStrictEqual(status!.existing, ['GSD_GATE_TEST_EXISTING']
|
|
104
|
+
assert.deepStrictEqual(status!.pending, ['GSD_GATE_TEST_PEND_A', 'GSD_GATE_TEST_PEND_B']);
|
|
105
|
+
assert.deepStrictEqual(status!.existing, ['GSD_GATE_TEST_EXISTING']);
|
|
106
106
|
|
|
107
107
|
// (b) Call collectSecretsFromManifest with no-UI context
|
|
108
108
|
// With hasUI: false, collectOneSecret returns null → pending keys become "skipped"
|