quadwork 2.2.0 → 2.2.1
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/out/404.html +1 -1
- package/out/__next.__PAGE__.txt +3 -3
- package/out/__next._full.txt +14 -14
- package/out/__next._head.txt +4 -4
- package/out/__next._index.txt +8 -8
- package/out/__next._tree.txt +2 -2
- package/out/_next/static/chunks/{0dbfrdfwj565f.css → 0g0w0q.z1ujl0.css} +1 -1
- package/out/_next/static/chunks/{0y_59cdk3r4z6.js → 1405wfv.5lt26.js} +1 -1
- package/out/_not-found/__next._full.txt +13 -13
- package/out/_not-found/__next._head.txt +4 -4
- package/out/_not-found/__next._index.txt +8 -8
- package/out/_not-found/__next._not-found.__PAGE__.txt +2 -2
- package/out/_not-found/__next._not-found.txt +3 -3
- package/out/_not-found/__next._tree.txt +2 -2
- package/out/_not-found.html +1 -1
- package/out/_not-found.txt +13 -13
- package/out/app-shell/__next._full.txt +13 -13
- package/out/app-shell/__next._head.txt +4 -4
- package/out/app-shell/__next._index.txt +8 -8
- package/out/app-shell/__next._tree.txt +2 -2
- package/out/app-shell/__next.app-shell.__PAGE__.txt +2 -2
- package/out/app-shell/__next.app-shell.txt +3 -3
- package/out/app-shell.html +1 -1
- package/out/app-shell.txt +13 -13
- package/out/index.html +1 -1
- package/out/index.txt +14 -14
- package/out/project/_/__next._full.txt +14 -14
- package/out/project/_/__next._head.txt +4 -4
- package/out/project/_/__next._index.txt +8 -8
- package/out/project/_/__next._tree.txt +2 -2
- package/out/project/_/__next.project.$d$id.__PAGE__.txt +3 -3
- package/out/project/_/__next.project.$d$id.txt +3 -3
- package/out/project/_/__next.project.txt +3 -3
- package/out/project/_/queue/__next._full.txt +14 -14
- package/out/project/_/queue/__next._head.txt +4 -4
- package/out/project/_/queue/__next._index.txt +8 -8
- package/out/project/_/queue/__next._tree.txt +2 -2
- package/out/project/_/queue/__next.project.$d$id.queue.__PAGE__.txt +3 -3
- package/out/project/_/queue/__next.project.$d$id.queue.txt +3 -3
- package/out/project/_/queue/__next.project.$d$id.txt +3 -3
- package/out/project/_/queue/__next.project.txt +3 -3
- package/out/project/_/queue.html +1 -1
- package/out/project/_/queue.txt +14 -14
- package/out/project/_.html +1 -1
- package/out/project/_.txt +14 -14
- package/out/settings/__next._full.txt +14 -14
- package/out/settings/__next._head.txt +4 -4
- package/out/settings/__next._index.txt +8 -8
- package/out/settings/__next._tree.txt +2 -2
- package/out/settings/__next.settings.__PAGE__.txt +3 -3
- package/out/settings/__next.settings.txt +3 -3
- package/out/settings.html +1 -1
- package/out/settings.txt +14 -14
- package/out/setup/__next._full.txt +14 -14
- package/out/setup/__next._head.txt +4 -4
- package/out/setup/__next._index.txt +8 -8
- package/out/setup/__next._tree.txt +2 -2
- package/out/setup/__next.setup.__PAGE__.txt +3 -3
- package/out/setup/__next.setup.txt +3 -3
- package/out/setup.html +1 -1
- package/out/setup.txt +14 -14
- package/package.json +1 -1
- package/server/index.js +22 -6
- package/server/routes.js +52 -10
- package/templates/seeds/dev.AGENTS.md +14 -0
- package/templates/seeds/head.AGENTS.md +14 -0
- package/templates/seeds/re1.AGENTS.md +14 -0
- package/templates/seeds/re2.AGENTS.md +14 -0
- /package/out/_next/static/{h8gr2UEtEQkyXBVa2J0z9 → eQFYDbR6C-ZREUVgx0QFH}/_buildManifest.js +0 -0
- /package/out/_next/static/{h8gr2UEtEQkyXBVa2J0z9 → eQFYDbR6C-ZREUVgx0QFH}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{h8gr2UEtEQkyXBVa2J0z9 → eQFYDbR6C-ZREUVgx0QFH}/_ssgManifest.js +0 -0
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[52368,["/_next/static/chunks/
|
|
3
|
-
3:I[43688,["/_next/static/chunks/
|
|
4
|
-
4:I[26704,["/_next/static/chunks/
|
|
5
|
-
5:I[22140,["/_next/static/chunks/
|
|
6
|
-
6:I[39756,["/_next/static/chunks/
|
|
7
|
-
7:I[37457,["/_next/static/chunks/
|
|
8
|
-
8:I[94810,["/_next/static/chunks/
|
|
9
|
-
9:I[97367,["/_next/static/chunks/
|
|
2
|
+
2:I[52368,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"LocaleProvider"]
|
|
3
|
+
3:I[43688,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
4
|
+
4:I[26704,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
5
|
+
5:I[22140,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
6
|
+
6:I[39756,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
7
|
+
7:I[37457,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
8
|
+
8:I[94810,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/0py7102i226n5.js"],"default"]
|
|
9
|
+
9:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
|
|
10
10
|
a:"$Sreact.suspense"
|
|
11
|
-
d:I[97367,["/_next/static/chunks/
|
|
12
|
-
f:I[97367,["/_next/static/chunks/
|
|
13
|
-
11:I[68027,["/_next/static/chunks/
|
|
14
|
-
:HL["/_next/static/chunks/
|
|
11
|
+
d:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
|
|
12
|
+
f:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
|
|
13
|
+
11:I[68027,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
|
|
14
|
+
:HL["/_next/static/chunks/0g0w0q.z1ujl0.css","style"]
|
|
15
15
|
:HL["/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
16
|
-
0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/
|
|
16
|
+
0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0g0w0q.z1ujl0.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/1405wfv.5lt26.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":["$","$L2",null,{"children":[["$","$L3",null,{}],["$","$L4",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L5",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L8",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0py7102i226n5.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0g0w0q.z1ujl0.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"eQFYDbR6C-ZREUVgx0QFH"}
|
|
17
17
|
12:[]
|
|
18
18
|
c:"$W12"
|
|
19
19
|
e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
20
|
-
13:I[27201,["/_next/static/chunks/
|
|
20
|
+
13:I[27201,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
|
|
21
21
|
b:null
|
|
22
22
|
10:[["$","title","0",{"children":"QuadWork"}],["$","meta","1",{"name":"description","content":"Unified dashboard for multi-agent coding teams"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.05o2q2p4kvnq_.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L13","3",{}]]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[97367,["/_next/static/chunks/
|
|
3
|
-
3:I[97367,["/_next/static/chunks/
|
|
2
|
+
2:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
|
|
3
|
+
3:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
|
-
5:I[27201,["/_next/static/chunks/
|
|
6
|
-
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"QuadWork"}],["$","meta","1",{"name":"description","content":"Unified dashboard for multi-agent coding teams"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.05o2q2p4kvnq_.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
5
|
+
5:I[27201,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
|
|
6
|
+
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"QuadWork"}],["$","meta","1",{"name":"description","content":"Unified dashboard for multi-agent coding teams"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.05o2q2p4kvnq_.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L5","3",{}]]}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"eQFYDbR6C-ZREUVgx0QFH"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[52368,["/_next/static/chunks/
|
|
3
|
-
3:I[43688,["/_next/static/chunks/
|
|
4
|
-
4:I[26704,["/_next/static/chunks/
|
|
5
|
-
5:I[22140,["/_next/static/chunks/
|
|
6
|
-
6:I[39756,["/_next/static/chunks/
|
|
7
|
-
7:I[37457,["/_next/static/chunks/
|
|
8
|
-
:HL["/_next/static/chunks/
|
|
9
|
-
0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/
|
|
2
|
+
2:I[52368,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"LocaleProvider"]
|
|
3
|
+
3:I[43688,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
4
|
+
4:I[26704,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
5
|
+
5:I[22140,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
6
|
+
6:I[39756,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
7
|
+
7:I[37457,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
8
|
+
:HL["/_next/static/chunks/0g0w0q.z1ujl0.css","style"]
|
|
9
|
+
0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0g0w0q.z1ujl0.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/1405wfv.5lt26.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":["$","$L2",null,{"children":[["$","$L3",null,{}],["$","$L4",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L5",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","children":["$","$L6",null,{"parallelRouterKey":"children","template":["$","$L7",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."}]}]]}]}]],[]]}]}]]}]]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"eQFYDbR6C-ZREUVgx0QFH"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
:HL["/_next/static/chunks/
|
|
1
|
+
:HL["/_next/static/chunks/0g0w0q.z1ujl0.css","style"]
|
|
2
2
|
:HL["/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
3
|
-
0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"setup","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"
|
|
3
|
+
0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"setup","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"eQFYDbR6C-ZREUVgx0QFH"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[94810,["/_next/static/chunks/
|
|
3
|
-
3:I[97367,["/_next/static/chunks/
|
|
2
|
+
2:I[94810,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/0py7102i226n5.js"],"default"]
|
|
3
|
+
3:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
|
-
0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0py7102i226n5.js","async":true}]],["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
5
|
+
0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0py7102i226n5.js","async":true}]],["$","$L3",null,{"children":["$","$4",null,{"name":"Next.MetadataOutlet","children":"$@5"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"eQFYDbR6C-ZREUVgx0QFH"}
|
|
6
6
|
5:null
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[39756,["/_next/static/chunks/
|
|
3
|
-
3:I[37457,["/_next/static/chunks/
|
|
2
|
+
2:I[39756,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
3
|
+
3:I[37457,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
4
4
|
4:[]
|
|
5
|
-
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"
|
|
5
|
+
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"eQFYDbR6C-ZREUVgx0QFH"}
|
package/out/setup.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="geist_mono_8d43a2aa-module__8Li5zG__variable h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/0dbfrdfwj565f.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0ze4gu236oq96.js"/><script src="/_next/static/chunks/0.bbxho1vnxin.js" async=""></script><script src="/_next/static/chunks/07lhk_q6pmm3r.js" async=""></script><script src="/_next/static/chunks/0oxv9vrvc17to.js" async=""></script><script src="/_next/static/chunks/0pqt~8bl3ukh4.js" async=""></script><script src="/_next/static/chunks/turbopack-0y2u-q0l2m67w.js" async=""></script><script src="/_next/static/chunks/0y_59cdk3r4z6.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><script src="/_next/static/chunks/0py7102i226n5.js" async=""></script><meta name="next-size-adjust" content=""/><title>QuadWork</title><meta name="description" content="Unified dashboard for multi-agent coding teams"/><link rel="icon" href="/favicon.ico?favicon.05o2q2p4kvnq_.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="h-full flex flex-col"><div hidden=""><!--$--><!--/$--></div><header class="sticky top-0 z-40 flex h-12 items-center justify-between border-b border-white/10 bg-neutral-950/90 px-4 backdrop-blur" aria-hidden="true"></header><div class="flex flex-1 min-h-0"><button type="button" class="fixed top-14 left-2 z-30 lg:hidden w-10 h-10 flex items-center justify-center bg-bg-surface border border-border text-text-muted hover:text-accent"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M3 5h14M3 10h14M3 15h14"></path></svg></button><aside class="fixed inset-y-0 left-0 z-50 w-52 bg-bg-surface border-r border-border flex flex-col py-3 px-2 items-stretch overflow-y-auto transition-transform duration-200 ease-in-out lg:hidden -translate-x-full"><button type="button" class="self-end shrink-0 w-10 h-10 flex items-center justify-center text-text-muted hover:text-accent mb-1"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M5 5l10 10M15 5L5 15"></path></svg></button><a class="flex items-center gap-2 rounded-sm transition-colors px-2 py-2 text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Home" href="/"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10L10 3l7 7"></path><path d="M5 8.5V16h3.5v-4h3v4H15V8.5"></path></svg><span class="text-xs">Home</span></a><div class="h-px bg-border my-2 "></div><div class="flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 "><a class="flex items-center gap-2 rounded-full transition-colors px-2 py-2 border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a] rounded-sm" title="Add project" href="/setup"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 3v10M3 8h10"></path></svg><span class="text-xs text-text-muted">New Project</span></a></div><div class="h-px bg-border my-2 "></div><a class="flex items-center gap-2 rounded-sm transition-colors px-2 py-2 text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Settings" href="/settings"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="2.5"></circle><path d="M7.5 1.5h3l.4 2.1a5.5 5.5 0 011.3.7l2-.8 1.5 2.6-1.6 1.3a5.5 5.5 0 010 1.5l1.6 1.3-1.5 2.6-2-.8a5.5 5.5 0 01-1.3.7l-.4 2.1h-3l-.4-2.1a5.5 5.5 0 01-1.3-.7l-2 .8-1.5-2.6 1.6-1.3a5.5 5.5 0 010-1.5L2.3 6.1l1.5-2.6 2 .8a5.5 5.5 0 011.3-.7z"></path></svg><span class="text-xs">Settings</span></a></aside><aside class="hidden lg:flex shrink-0 h-full border-r border-border bg-bg-surface flex-col py-3 transition-[width] duration-200 ease-in-out overflow-hidden w-16 items-center"><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Home" href="/"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10L10 3l7 7"></path><path d="M5 8.5V16h3.5v-4h3v4H15V8.5"></path></svg></a><div class="h-px bg-border my-2 w-6 self-center"></div><div class="flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 items-center"><a class="flex items-center gap-2 rounded-full transition-colors w-10 h-10 justify-center border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Add project" href="/setup"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 3v10M3 8h10"></path></svg></a></div><div class="h-px bg-border my-2 w-6 self-center"></div><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Settings" href="/settings"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="2.5"></circle><path d="M7.5 1.5h3l.4 2.1a5.5 5.5 0 011.3.7l2-.8 1.5 2.6-1.6 1.3a5.5 5.5 0 010 1.5l1.6 1.3-1.5 2.6-2-.8a5.5 5.5 0 01-1.3.7l-.4 2.1h-3l-.4-2.1a5.5 5.5 0 01-1.3-.7l-2 .8-1.5-2.6 1.6-1.3a5.5 5.5 0 010-1.5L2.3 6.1l1.5-2.6 2 .8a5.5 5.5 0 011.3-.7z"></path></svg></a><div class="h-1"></div><button class="flex shrink-0 items-center justify-center w-10 h-10 rounded-sm border border-border text-text-muted hover:text-accent hover:border-accent/50 transition-colors self-center" title="Expand sidebar"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3l5 5-5 5"></path></svg></button></aside><main class="flex-1 min-w-0 overflow-auto"><div class="h-full overflow-y-auto"></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0ze4gu236oq96.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[52368,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"LocaleProvider\"]\n3:I[43688,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[26704,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[22140,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n6:I[39756,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n7:I[37457,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n8:I[94810,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0py7102i226n5.js\"],\"default\"]\n9:I[97367,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[97367,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\n11:I[68027,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0dbfrdfwj565f.css\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"setup\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"setup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0dbfrdfwj565f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"geist_mono_8d43a2aa-module__8Li5zG__variable h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"h-full flex flex-col\",\"children\":[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{}],[\"$\",\"div\",null,{\"className\":\"flex flex-1 min-h-0\",\"children\":[[\"$\",\"$L5\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 min-w-0 overflow-auto\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L8\",null,{}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0py7102i226n5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0dbfrdfwj565f.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"h8gr2UEtEQkyXBVa2J0z9\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"13:I[27201,[\"/_next/static/chunks/0y_59cdk3r4z6.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"IconMark\"]\nb:null\n10:[[\"$\",\"title\",\"0\",{\"children\":\"QuadWork\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Unified dashboard for multi-agent coding teams\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.05o2q2p4kvnq_.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L13\",\"3\",{}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="geist_mono_8d43a2aa-module__8Li5zG__variable h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/chunks/0g0w0q.z1ujl0.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0ze4gu236oq96.js"/><script src="/_next/static/chunks/0.bbxho1vnxin.js" async=""></script><script src="/_next/static/chunks/07lhk_q6pmm3r.js" async=""></script><script src="/_next/static/chunks/0oxv9vrvc17to.js" async=""></script><script src="/_next/static/chunks/0pqt~8bl3ukh4.js" async=""></script><script src="/_next/static/chunks/turbopack-0y2u-q0l2m67w.js" async=""></script><script src="/_next/static/chunks/1405wfv.5lt26.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><script src="/_next/static/chunks/0py7102i226n5.js" async=""></script><meta name="next-size-adjust" content=""/><title>QuadWork</title><meta name="description" content="Unified dashboard for multi-agent coding teams"/><link rel="icon" href="/favicon.ico?favicon.05o2q2p4kvnq_.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="h-full flex flex-col"><div hidden=""><!--$--><!--/$--></div><header class="sticky top-0 z-40 flex h-12 items-center justify-between border-b border-white/10 bg-neutral-950/90 px-4 backdrop-blur" aria-hidden="true"></header><div class="flex flex-1 min-h-0"><button type="button" class="fixed top-14 left-2 z-30 lg:hidden w-10 h-10 flex items-center justify-center bg-bg-surface border border-border text-text-muted hover:text-accent"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M3 5h14M3 10h14M3 15h14"></path></svg></button><aside class="fixed inset-y-0 left-0 z-50 w-52 bg-bg-surface border-r border-border flex flex-col py-3 px-2 items-stretch overflow-y-auto transition-transform duration-200 ease-in-out lg:hidden -translate-x-full"><button type="button" class="self-end shrink-0 w-10 h-10 flex items-center justify-center text-text-muted hover:text-accent mb-1"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M5 5l10 10M15 5L5 15"></path></svg></button><a class="flex items-center gap-2 rounded-sm transition-colors px-2 py-2 text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Home" href="/"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10L10 3l7 7"></path><path d="M5 8.5V16h3.5v-4h3v4H15V8.5"></path></svg><span class="text-xs">Home</span></a><div class="h-px bg-border my-2 "></div><div class="flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 "><a class="flex items-center gap-2 rounded-full transition-colors px-2 py-2 border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a] rounded-sm" title="Add project" href="/setup"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 3v10M3 8h10"></path></svg><span class="text-xs text-text-muted">New Project</span></a></div><div class="h-px bg-border my-2 "></div><a class="flex items-center gap-2 rounded-sm transition-colors px-2 py-2 text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Settings" href="/settings"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="2.5"></circle><path d="M7.5 1.5h3l.4 2.1a5.5 5.5 0 011.3.7l2-.8 1.5 2.6-1.6 1.3a5.5 5.5 0 010 1.5l1.6 1.3-1.5 2.6-2-.8a5.5 5.5 0 01-1.3.7l-.4 2.1h-3l-.4-2.1a5.5 5.5 0 01-1.3-.7l-2 .8-1.5-2.6 1.6-1.3a5.5 5.5 0 010-1.5L2.3 6.1l1.5-2.6 2 .8a5.5 5.5 0 011.3-.7z"></path></svg><span class="text-xs">Settings</span></a></aside><aside class="hidden lg:flex shrink-0 h-full border-r border-border bg-bg-surface flex-col py-3 transition-[width] duration-200 ease-in-out overflow-hidden w-16 items-center"><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Home" href="/"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10L10 3l7 7"></path><path d="M5 8.5V16h3.5v-4h3v4H15V8.5"></path></svg></a><div class="h-px bg-border my-2 w-6 self-center"></div><div class="flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 w-full items-center [scrollbar-width:none] [&::-webkit-scrollbar]:hidden"><a class="flex items-center gap-2 rounded-full transition-colors w-10 h-10 justify-center border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Add project" href="/setup"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M8 3v10M3 8h10"></path></svg></a></div><div class="h-px bg-border my-2 w-6 self-center"></div><a class="flex items-center gap-2 rounded-sm transition-colors w-10 h-10 justify-center self-center text-text-muted hover:text-text hover:bg-[#1a1a1a]" title="Settings" href="/settings"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="2.5"></circle><path d="M7.5 1.5h3l.4 2.1a5.5 5.5 0 011.3.7l2-.8 1.5 2.6-1.6 1.3a5.5 5.5 0 010 1.5l1.6 1.3-1.5 2.6-2-.8a5.5 5.5 0 01-1.3.7l-.4 2.1h-3l-.4-2.1a5.5 5.5 0 01-1.3-.7l-2 .8-1.5-2.6 1.6-1.3a5.5 5.5 0 010-1.5L2.3 6.1l1.5-2.6 2 .8a5.5 5.5 0 011.3-.7z"></path></svg></a><div class="h-1"></div><button class="flex shrink-0 items-center justify-center w-10 h-10 rounded-sm border border-border text-text-muted hover:text-accent hover:border-accent/50 transition-colors self-center" title="Expand sidebar"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3l5 5-5 5"></path></svg></button></aside><main class="flex-1 min-w-0 overflow-auto"><div class="h-full overflow-y-auto"></div><!--$--><!--/$--></main></div><script src="/_next/static/chunks/0ze4gu236oq96.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[52368,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"LocaleProvider\"]\n3:I[43688,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[26704,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[22140,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n6:I[39756,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n7:I[37457,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n8:I[94810,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0py7102i226n5.js\"],\"default\"]\n9:I[97367,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[97367,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\n11:I[68027,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0g0w0q.z1ujl0.css\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"setup\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"setup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0g0w0q.z1ujl0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/1405wfv.5lt26.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"geist_mono_8d43a2aa-module__8Li5zG__variable h-full\",\"children\":[\"$\",\"body\",null,{\"className\":\"h-full flex flex-col\",\"children\":[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{}],[\"$\",\"div\",null,{\"className\":\"flex flex-1 min-h-0\",\"children\":[[\"$\",\"$L5\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 min-w-0 overflow-auto\",\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L8\",null,{}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0py7102i226n5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0g0w0q.z1ujl0.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"eQFYDbR6C-ZREUVgx0QFH\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"13:I[27201,[\"/_next/static/chunks/1405wfv.5lt26.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"IconMark\"]\nb:null\n10:[[\"$\",\"title\",\"0\",{\"children\":\"QuadWork\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Unified dashboard for multi-agent coding teams\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.05o2q2p4kvnq_.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L13\",\"3\",{}]]\n"])</script></body></html>
|
package/out/setup.txt
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[52368,["/_next/static/chunks/
|
|
3
|
-
3:I[43688,["/_next/static/chunks/
|
|
4
|
-
4:I[26704,["/_next/static/chunks/
|
|
5
|
-
5:I[22140,["/_next/static/chunks/
|
|
6
|
-
6:I[39756,["/_next/static/chunks/
|
|
7
|
-
7:I[37457,["/_next/static/chunks/
|
|
8
|
-
8:I[94810,["/_next/static/chunks/
|
|
9
|
-
9:I[97367,["/_next/static/chunks/
|
|
2
|
+
2:I[52368,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"LocaleProvider"]
|
|
3
|
+
3:I[43688,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
4
|
+
4:I[26704,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
5
|
+
5:I[22140,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
6
|
+
6:I[39756,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
7
|
+
7:I[37457,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
8
|
+
8:I[94810,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/0py7102i226n5.js"],"default"]
|
|
9
|
+
9:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"OutletBoundary"]
|
|
10
10
|
a:"$Sreact.suspense"
|
|
11
|
-
d:I[97367,["/_next/static/chunks/
|
|
12
|
-
f:I[97367,["/_next/static/chunks/
|
|
13
|
-
11:I[68027,["/_next/static/chunks/
|
|
14
|
-
:HL["/_next/static/chunks/
|
|
11
|
+
d:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
|
|
12
|
+
f:I[97367,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
|
|
13
|
+
11:I[68027,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
|
|
14
|
+
:HL["/_next/static/chunks/0g0w0q.z1ujl0.css","style"]
|
|
15
15
|
:HL["/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
16
|
-
0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/
|
|
16
|
+
0:{"P":null,"c":["","setup"],"q":"","i":false,"f":[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0g0w0q.z1ujl0.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/1405wfv.5lt26.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0d3shmwh5_nmn.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"geist_mono_8d43a2aa-module__8Li5zG__variable h-full","children":["$","body",null,{"className":"h-full flex flex-col","children":["$","$L2",null,{"children":[["$","$L3",null,{}],["$","$L4",null,{}],["$","div",null,{"className":"flex flex-1 min-h-0","children":[["$","$L5",null,{}],["$","main",null,{"className":"flex-1 min-w-0 overflow-auto","children":["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L6",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L8",null,{}],[["$","script","script-0",{"src":"/_next/static/chunks/0py7102i226n5.js","async":true,"nonce":"$undefined"}]],["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$11",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0g0w0q.z1ujl0.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"eQFYDbR6C-ZREUVgx0QFH"}
|
|
17
17
|
12:[]
|
|
18
18
|
c:"$W12"
|
|
19
19
|
e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
20
|
-
13:I[27201,["/_next/static/chunks/
|
|
20
|
+
13:I[27201,["/_next/static/chunks/1405wfv.5lt26.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"IconMark"]
|
|
21
21
|
b:null
|
|
22
22
|
10:[["$","title","0",{"children":"QuadWork"}],["$","meta","1",{"name":"description","content":"Unified dashboard for multi-agent coding teams"}],["$","link","2",{"rel":"icon","href":"/favicon.ico?favicon.05o2q2p4kvnq_.ico","sizes":"256x256","type":"image/x-icon"}],["$","$L13","3",{}]]
|
package/package.json
CHANGED
package/server/index.js
CHANGED
|
@@ -1128,8 +1128,14 @@ async function sendTriggerMessage(projectId) {
|
|
|
1128
1128
|
const bp = await bpRes.json();
|
|
1129
1129
|
// #810: gate auto-stop on completeConfirmed (two distinct successful
|
|
1130
1130
|
// fetch cycles), NOT a single transient/stale `complete`.
|
|
1131
|
-
|
|
1132
|
-
|
|
1131
|
+
// #864: also auto-stop on an explicit operator clear (`liveActiveBatchCleared`).
|
|
1132
|
+
// The preserved snapshot may keep `items` non-empty / `complete` mixed, so
|
|
1133
|
+
// `completeConfirmed` alone won't fire when items don't all resolve as
|
|
1134
|
+
// merged/closed (e.g. a duplicate unmerged PR). The cleared flag is the
|
|
1135
|
+
// operator's intent and overrides those signals for lifecycle purposes.
|
|
1136
|
+
const clearedByOperator = !!(bp && bp.liveActiveBatchCleared);
|
|
1137
|
+
if (bp && (bp.completeConfirmed || clearedByOperator)) {
|
|
1138
|
+
console.log(`[auto-trigger] ${projectId}: batch ${clearedByOperator ? "cleared by operator" : "complete (confirmed)"}, auto-stopped`);
|
|
1133
1139
|
stopTrigger(projectId);
|
|
1134
1140
|
// Also stop caffeinate if no other triggers remain running
|
|
1135
1141
|
// (#441 companion fix). caffeinateProcess is global (not
|
|
@@ -1724,13 +1730,21 @@ async function autoStopPollingTick() {
|
|
|
1724
1730
|
// #810: gate auto-stop on completeConfirmed (two distinct successful fetch
|
|
1725
1731
|
// cycles), not a single transient/stale `complete`. Track prev on the
|
|
1726
1732
|
// confirmed value so the bridge-stop transition guard fires on it.
|
|
1733
|
+
// #864: an explicit operator clear (`liveActiveBatchCleared`) ALSO triggers
|
|
1734
|
+
// the stop path, so trigger + bridges shut down when Head sets the Active
|
|
1735
|
+
// Batch section to empty even if the preserved snapshot's items don't all
|
|
1736
|
+
// resolve as merged/closed (e.g. a duplicate unmerged PR keeps the items
|
|
1737
|
+
// in `in_review`). The cleared flag is the operator's intent.
|
|
1727
1738
|
const confirmed = !!bp.completeConfirmed;
|
|
1739
|
+
const clearedByOperator = !!bp.liveActiveBatchCleared;
|
|
1740
|
+
const shouldStop = confirmed || clearedByOperator;
|
|
1728
1741
|
const prev = _bridgeBatchPrev.get(project.id);
|
|
1729
|
-
_bridgeBatchPrev.set(project.id, { complete:
|
|
1742
|
+
_bridgeBatchPrev.set(project.id, { complete: shouldStop, hasItems });
|
|
1730
1743
|
|
|
1731
|
-
if (bp &&
|
|
1744
|
+
if (bp && shouldStop) {
|
|
1732
1745
|
if (hasTriggerAuto) {
|
|
1733
|
-
|
|
1746
|
+
const reason = clearedByOperator ? "cleared by operator" : "complete (confirmed)";
|
|
1747
|
+
console.log(`[auto-trigger] ${project.id}: batch ${reason}, auto-stopped (poller)`);
|
|
1734
1748
|
stopTrigger(project.id);
|
|
1735
1749
|
if (caffeinateProcess.process && triggers.size === 0) {
|
|
1736
1750
|
try { caffeinateProcess.process.kill("SIGTERM"); } catch {}
|
|
@@ -1746,7 +1760,9 @@ async function autoStopPollingTick() {
|
|
|
1746
1760
|
}
|
|
1747
1761
|
|
|
1748
1762
|
// #518: detect batch-start transition → auto-start bridges
|
|
1749
|
-
|
|
1763
|
+
// #864: do NOT auto-start on a cleared queue even though hasItems may be
|
|
1764
|
+
// true from the preserved snapshot — the operator's clear is a stop signal.
|
|
1765
|
+
if (hasBridgeAuto && hasItems && !bp.complete && !clearedByOperator) {
|
|
1750
1766
|
const isNewBatch = !prev || prev.complete || !prev.hasItems;
|
|
1751
1767
|
if (isNewBatch) {
|
|
1752
1768
|
await autoStartBridges(project.id, project, qwPort);
|
package/server/routes.js
CHANGED
|
@@ -2318,14 +2318,37 @@ function buildNoPrRow(issue) {
|
|
|
2318
2318
|
// would also surface `[#807]` for n=80), so we re-apply the strict `^\s*\[#N\]`
|
|
2319
2319
|
// regex the snapshot matcher uses. Returns the freshest matching PR number (or
|
|
2320
2320
|
// null), treating a search failure as "no linked PR found".
|
|
2321
|
-
// Pure: pick the
|
|
2322
|
-
//
|
|
2323
|
-
//
|
|
2324
|
-
//
|
|
2325
|
-
|
|
2321
|
+
// Pure: pick the right PR whose title matches the STRICT `^\s*\[#N\]` convention
|
|
2322
|
+
// from a set of REST search items. Guards `[#807]` from matching n=80 even
|
|
2323
|
+
// though Search's loose `in:title 80` would surface it. Returns the PR number
|
|
2324
|
+
// or null. Exported for unit tests.
|
|
2325
|
+
//
|
|
2326
|
+
// #864: when more than one strict match exists for a CLOSED issue (e.g. a
|
|
2327
|
+
// closed-unmerged duplicate opened after the real merged PR for the same
|
|
2328
|
+
// issue), prefer a MERGED match over an unmerged one — otherwise the
|
|
2329
|
+
// highest-PR-number tie-break picks the duplicate and downstream progress
|
|
2330
|
+
// flips a CLOSED issue back to in_review, keeping the batch falsely "active"
|
|
2331
|
+
// after Head clears the queue.
|
|
2332
|
+
//
|
|
2333
|
+
// #864/RE1: the merged-preference is GATED on `opts.issueState === "CLOSED"`.
|
|
2334
|
+
// For an OPEN/reopened issue, applying it would let an OLDER merged PR beat a
|
|
2335
|
+
// NEWER active duplicate/reopen PR with the same `[#N]` prefix — the picker
|
|
2336
|
+
// would return the stale merged PR number and progressForItemRest would fall
|
|
2337
|
+
// through to in_review-with-the-wrong-PR (since the `merged && CLOSED` row
|
|
2338
|
+
// requires the issue to be closed). The default (no opts → open-by-omission)
|
|
2339
|
+
// is the legacy freshest-wins behavior, preserving back-compat for direct
|
|
2340
|
+
// callers and tests that don't yet supply issue state.
|
|
2341
|
+
function pickLinkedPrFromSearch(items, n, opts = {}) {
|
|
2326
2342
|
const titleRe = new RegExp(`^\\s*\\[#${n}\\]`);
|
|
2327
2343
|
const matches = (Array.isArray(items) ? items : []).filter((it) => titleRe.test((it && it.title) || ""));
|
|
2328
2344
|
if (matches.length === 0) return null;
|
|
2345
|
+
const preferMerged = opts.issueState === "CLOSED";
|
|
2346
|
+
if (preferMerged) {
|
|
2347
|
+
const merged = matches.filter((it) => it && it.pull_request && it.pull_request.merged_at);
|
|
2348
|
+
if (merged.length > 0) {
|
|
2349
|
+
return merged.slice().sort((a, b) => (b.number || 0) - (a.number || 0))[0].number;
|
|
2350
|
+
}
|
|
2351
|
+
}
|
|
2329
2352
|
return matches.slice().sort((a, b) => (b.number || 0) - (a.number || 0))[0].number;
|
|
2330
2353
|
}
|
|
2331
2354
|
|
|
@@ -2347,9 +2370,9 @@ async function _searchLinkedPrItems(repo, n) {
|
|
|
2347
2370
|
// with a merged PR would render closed). So failure THROWS, and the caller
|
|
2348
2371
|
// (progressForItemRest, awaiting without a catch) drops the item to the
|
|
2349
2372
|
// non-authoritative "fetch failed" row, retried on the next cache miss.
|
|
2350
|
-
async function findLinkedPrByTitle(repo, n, search = _searchLinkedPrItems) {
|
|
2373
|
+
async function findLinkedPrByTitle(repo, n, search = _searchLinkedPrItems, opts = {}) {
|
|
2351
2374
|
const items = await search(repo, n);
|
|
2352
|
-
return pickLinkedPrFromSearch(items, n);
|
|
2375
|
+
return pickLinkedPrFromSearch(items, n, opts);
|
|
2353
2376
|
}
|
|
2354
2377
|
|
|
2355
2378
|
// Authoritative by-number resolution for an active-batch issue the board
|
|
@@ -2371,7 +2394,10 @@ async function progressForItemRest(repo, issueNumber) {
|
|
|
2371
2394
|
// Throws (→ route's "fetch failed" row) if Search itself fails, so a
|
|
2372
2395
|
// could-not-determine is NEVER mistaken for proof of no linked PR. A null
|
|
2373
2396
|
// here means Search SUCCEEDED with zero strict [#N] matches — authoritative.
|
|
2374
|
-
|
|
2397
|
+
// #864/RE1: pass issue.state so the picker only prefers a merged duplicate
|
|
2398
|
+
// for CLOSED issues; OPEN/reopened issues keep legacy freshest-wins, so a
|
|
2399
|
+
// newer active duplicate PR isn't masked by an older merged one.
|
|
2400
|
+
const prNumber = await findLinkedPrByTitle(repo, issueNumber, _searchLinkedPrItems, { issueState: issue.state });
|
|
2375
2401
|
// No linked PR (authoritative). #350: honor the issue's own state — a CLOSED
|
|
2376
2402
|
// issue with no linked PR is fully done (superseded/not-planned/runbook) →
|
|
2377
2403
|
// 100% ✓; only a truly OPEN issue with no PR is queued.
|
|
@@ -2464,8 +2490,17 @@ function summarizeItems(items) {
|
|
|
2464
2490
|
// Active Batch section. Returns null when there's no progress payload (an
|
|
2465
2491
|
// undefined input — current callers always pass a value), defensively
|
|
2466
2492
|
// treated as "not active" at the route.
|
|
2493
|
+
//
|
|
2494
|
+
// #864: lifecycle consumers (this route, trigger auto-stop, reseed safe-boundary
|
|
2495
|
+
// checks via isActiveFromProgress) must NOT consider an explicitly cleared
|
|
2496
|
+
// `## Active Batch` section as active. resolveDisplayedBatch still serves the
|
|
2497
|
+
// preserved snapshot so /api/batch-progress can render the prior batch for
|
|
2498
|
+
// history, but the lifecycle signal must follow the operator's intent. The
|
|
2499
|
+
// `liveActiveBatchCleared` flag set by getOrComputeBatchProgress short-circuits
|
|
2500
|
+
// the items-based check below.
|
|
2467
2501
|
function isBatchActiveFromProgress(progress) {
|
|
2468
2502
|
if (!progress) return null;
|
|
2503
|
+
if (progress.liveActiveBatchCleared) return false;
|
|
2469
2504
|
const items = Array.isArray(progress.items) ? progress.items : [];
|
|
2470
2505
|
return items.length > 0 && !progress.complete;
|
|
2471
2506
|
}
|
|
@@ -2592,13 +2627,20 @@ async function getOrComputeBatchProgress(projectId) {
|
|
|
2592
2627
|
// snapshot-aware helper so merged items stay visible after Head
|
|
2593
2628
|
// moves them from Active Batch to Done, until a new batch starts.
|
|
2594
2629
|
const { batchNumber, issueNumbers } = resolveDisplayedBatch(queueText, projectId, { queueReadOk });
|
|
2630
|
+
// #864: lifecycle-signal flag. The displayed batch may be the preserved
|
|
2631
|
+
// snapshot (so /api/batch-progress keeps showing it), but lifecycle consumers
|
|
2632
|
+
// (/api/batch-active, trigger auto-stop, reseed safe-boundary) must follow
|
|
2633
|
+
// the operator's explicit clear. Compute from the LIVE parse, only when the
|
|
2634
|
+
// queue file actually read OK — the #316 bypass (queueReadOk=false) must NOT
|
|
2635
|
+
// be mistaken for an explicit clear, since the operator never touched it.
|
|
2636
|
+
const liveActiveBatchCleared = queueReadOk && parseActiveBatch(queueText).issueNumbers.length === 0;
|
|
2595
2637
|
// #828 P2: batch identity = number + issue set. evalBatchCompleteConfirmed
|
|
2596
2638
|
// resets its streak when this changes, so a new already-complete batch can't
|
|
2597
2639
|
// inherit the prior batch's first cycle and confirm in one tick.
|
|
2598
2640
|
const batchKey = `${batchNumber}::${[...issueNumbers].sort((a, b) => a - b).join(",")}`;
|
|
2599
2641
|
if (issueNumbers.length === 0) {
|
|
2600
2642
|
evalBatchCompleteConfirmed(projectId, batchKey, false, null); // reset any complete streak
|
|
2601
|
-
const data = { batch_number: batchNumber, items: [], summary: "", complete: false, completeConfirmed: false };
|
|
2643
|
+
const data = { batch_number: batchNumber, items: [], summary: "", complete: false, completeConfirmed: false, liveActiveBatchCleared };
|
|
2602
2644
|
_batchProgressCache.set(projectId, { ts: Date.now(), data });
|
|
2603
2645
|
return data;
|
|
2604
2646
|
}
|
|
@@ -2631,7 +2673,7 @@ async function getOrComputeBatchProgress(projectId) {
|
|
|
2631
2673
|
// before any auto-stop consumer may act on it (never auto-stop on a single
|
|
2632
2674
|
// transient/stale complete). Keyed on the snapshot's ts as the cycle marker.
|
|
2633
2675
|
const completeConfirmed = evalBatchCompleteConfirmed(projectId, batchKey, complete, snapshot ? snapshot.ts : null);
|
|
2634
|
-
const data = { batch_number: batchNumber, items, summary, complete, completeConfirmed };
|
|
2676
|
+
const data = { batch_number: batchNumber, items, summary, complete, completeConfirmed, liveActiveBatchCleared };
|
|
2635
2677
|
_batchProgressCache.set(projectId, { ts: Date.now(), data });
|
|
2636
2678
|
return data;
|
|
2637
2679
|
}
|
|
@@ -28,6 +28,20 @@ If you need to reference sensitive data, use a placeholder like `<WALLET_ADDRESS
|
|
|
28
28
|
|
|
29
29
|
This rule applies to ALL output that touches GitHub or git — issues, PR bodies, review comments, commit messages, and file contents.
|
|
30
30
|
|
|
31
|
+
### Rule 4: Orchestrator Port Protection
|
|
32
|
+
The QuadWork orchestrator (port **8400**, Express backend) and the Next.js development server (its own port — `next dev`'s listener, NOT an agent mention) are live self-host infrastructure during review. Killing them takes down the chat MCP, batch progress, GITHUB.md sync, the scheduled trigger, and every other agent in the project.
|
|
33
|
+
|
|
34
|
+
**NEVER kill, restart, or manage processes on these ports.** Forbidden commands include — but are not limited to:
|
|
35
|
+
- `kill <pid>` against any process bound to port 8400 or the Next.js development server port
|
|
36
|
+
- `pkill -f "next"`, `pkill -f "quadwork"`, `pkill -f "node.*8400"`, or any similar broad pattern match that could hit them
|
|
37
|
+
- `fuser -k 8400/tcp` or `fuser -k <next-dev-port>/tcp`
|
|
38
|
+
- `lsof -ti:8400 | xargs kill`, or any `lsof … kill` / `lsof … xargs` chain targeting these ports
|
|
39
|
+
- `npm run start`, `npm run dev`, `quadwork start`, or any restart of the live orchestrator / Next.js development server
|
|
40
|
+
|
|
41
|
+
For runtime or visual checks, use a throwaway port such as `PORT=8499` (or any free port other than 8400 and the Next.js development server port). Where possible, prefer `npm run build` output, unit/integration tests, and code review over spinning up a runtime.
|
|
42
|
+
|
|
43
|
+
If something on port 8400 looks wrong, report it to the operator via `chat_send` — do not try to fix it by restarting.
|
|
44
|
+
|
|
31
45
|
---
|
|
32
46
|
|
|
33
47
|
You are Dev, the primary implementation agent.
|
|
@@ -28,6 +28,20 @@ If you need to reference sensitive data, use a placeholder like `<WALLET_ADDRESS
|
|
|
28
28
|
|
|
29
29
|
This rule applies to ALL output that touches GitHub or git — issues, PR bodies, review comments, commit messages, and file contents.
|
|
30
30
|
|
|
31
|
+
### Rule 4: Orchestrator Port Protection
|
|
32
|
+
The QuadWork orchestrator (port **8400**, Express backend) and the Next.js development server (its own port — `next dev`'s listener, NOT an agent mention) are live self-host infrastructure during review. Killing them takes down the chat MCP, batch progress, GITHUB.md sync, the scheduled trigger, and every other agent in the project.
|
|
33
|
+
|
|
34
|
+
**NEVER kill, restart, or manage processes on these ports.** Forbidden commands include — but are not limited to:
|
|
35
|
+
- `kill <pid>` against any process bound to port 8400 or the Next.js development server port
|
|
36
|
+
- `pkill -f "next"`, `pkill -f "quadwork"`, `pkill -f "node.*8400"`, or any similar broad pattern match that could hit them
|
|
37
|
+
- `fuser -k 8400/tcp` or `fuser -k <next-dev-port>/tcp`
|
|
38
|
+
- `lsof -ti:8400 | xargs kill`, or any `lsof … kill` / `lsof … xargs` chain targeting these ports
|
|
39
|
+
- `npm run start`, `npm run dev`, `quadwork start`, or any restart of the live orchestrator / Next.js development server
|
|
40
|
+
|
|
41
|
+
For runtime or visual checks, use a throwaway port such as `PORT=8499` (or any free port other than 8400 and the Next.js development server port). Where possible, prefer `npm run build` output, unit/integration tests, and code review over spinning up a runtime.
|
|
42
|
+
|
|
43
|
+
If something on port 8400 looks wrong, report it to the operator via `chat_send` — do not try to fix it by restarting.
|
|
44
|
+
|
|
31
45
|
---
|
|
32
46
|
|
|
33
47
|
You are Head, the project owner and coordinator agent.
|
|
@@ -28,6 +28,20 @@ If you need to reference sensitive data, use a placeholder like `<WALLET_ADDRESS
|
|
|
28
28
|
|
|
29
29
|
This rule applies to ALL output that touches GitHub or git — issues, PR bodies, review comments, commit messages, and file contents.
|
|
30
30
|
|
|
31
|
+
### Rule 4: Orchestrator Port Protection
|
|
32
|
+
The QuadWork orchestrator (port **8400**, Express backend) and the Next.js development server (its own port — `next dev`'s listener, NOT an agent mention) are live self-host infrastructure during review. Killing them takes down the chat MCP, batch progress, GITHUB.md sync, the scheduled trigger, and every other agent in the project.
|
|
33
|
+
|
|
34
|
+
**NEVER kill, restart, or manage processes on these ports.** Forbidden commands include — but are not limited to:
|
|
35
|
+
- `kill <pid>` against any process bound to port 8400 or the Next.js development server port
|
|
36
|
+
- `pkill -f "next"`, `pkill -f "quadwork"`, `pkill -f "node.*8400"`, or any similar broad pattern match that could hit them
|
|
37
|
+
- `fuser -k 8400/tcp` or `fuser -k <next-dev-port>/tcp`
|
|
38
|
+
- `lsof -ti:8400 | xargs kill`, or any `lsof … kill` / `lsof … xargs` chain targeting these ports
|
|
39
|
+
- `npm run start`, `npm run dev`, `quadwork start`, or any restart of the live orchestrator / Next.js development server
|
|
40
|
+
|
|
41
|
+
For runtime or visual checks, use a throwaway port such as `PORT=8499` (or any free port other than 8400 and the Next.js development server port). Where possible, prefer `npm run build` output, unit/integration tests, and code review over spinning up a runtime.
|
|
42
|
+
|
|
43
|
+
If something on port 8400 looks wrong, report it to the operator via `chat_send` — do not try to fix it by restarting.
|
|
44
|
+
|
|
31
45
|
---
|
|
32
46
|
|
|
33
47
|
You are **RE1**, the first reviewer agent. Your chat identity is `re1`.
|