quadwork 2.0.1 → 2.2.0
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/{0~-kpl6f_x5s6.js → 02kx5r305y-id.js} +1 -1
- package/out/_next/static/chunks/{0jllnzexn48._.js → 044n.~stdsjlo.js} +1 -1
- package/out/_next/static/chunks/0dbfrdfwj565f.css +2 -0
- package/out/_next/static/chunks/0fvw~.-bjbvj3.js +27 -0
- package/out/_next/static/chunks/0y_59cdk3r4z6.js +1 -0
- package/out/_next/static/chunks/12yxvamsloafv.js +1 -0
- 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 +2 -1
- package/server/index.js +111 -18
- package/server/routes.js +1717 -499
- package/server/run-tests.js +122 -0
- package/server/self-heal.js +100 -0
- package/templates/GITHUB.md +46 -0
- package/templates/seeds/butler.CLAUDE.md +2 -0
- package/templates/seeds/dev.AGENTS.md +12 -0
- package/templates/seeds/head.AGENTS.md +21 -6
- package/templates/seeds/re1.AGENTS.md +17 -3
- package/templates/seeds/re2.AGENTS.md +17 -3
- package/out/_next/static/chunks/0_79hkefw1mo2.js +0 -1
- package/out/_next/static/chunks/0q4bm04c1jl_3.js +0 -1
- package/out/_next/static/chunks/13xk0vgfbrcld.css +0 -2
- package/out/_next/static/chunks/163_ddkdca5q4.js +0 -25
- /package/out/_next/static/{MmPC1Rj12BOy4-HvMJjEX → h8gr2UEtEQkyXBVa2J0z9}/_buildManifest.js +0 -0
- /package/out/_next/static/{MmPC1Rj12BOy4-HvMJjEX → h8gr2UEtEQkyXBVa2J0z9}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{MmPC1Rj12BOy4-HvMJjEX → h8gr2UEtEQkyXBVa2J0z9}/_ssgManifest.js +0 -0
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/13xk0vgfbrcld.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/0q4bm04c1jl_3.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/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"LocaleProvider\"]\n3:I[43688,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[26704,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n5:I[22140,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n6:I[39756,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n7:I[37457,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n8:I[94810,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0py7102i226n5.js\"],\"default\"]\n9:I[97367,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[97367,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\nf:I[97367,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\n11:I[68027,[\"/_next/static/chunks/0q4bm04c1jl_3.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/13xk0vgfbrcld.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/13xk0vgfbrcld.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0q4bm04c1jl_3.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/13xk0vgfbrcld.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"MmPC1Rj12BOy4-HvMJjEX\"}\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/0q4bm04c1jl_3.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/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>
|
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/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"LocaleProvider"]
|
|
3
|
+
3:I[43688,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
4
|
+
4:I[26704,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
5
|
+
5:I[22140,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
6
|
+
6:I[39756,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
7
|
+
7:I[37457,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default"]
|
|
8
|
+
8:I[94810,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js","/_next/static/chunks/0py7102i226n5.js"],"default"]
|
|
9
|
+
9:I[97367,["/_next/static/chunks/0y_59cdk3r4z6.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/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"ViewportBoundary"]
|
|
12
|
+
f:I[97367,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"MetadataBoundary"]
|
|
13
|
+
11:I[68027,["/_next/static/chunks/0y_59cdk3r4z6.js","/_next/static/chunks/0d3shmwh5_nmn.js"],"default",1]
|
|
14
|
+
:HL["/_next/static/chunks/0dbfrdfwj565f.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/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"}
|
|
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/0y_59cdk3r4z6.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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quadwork",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Unified dashboard for multi-agent coding teams — 4 AI agents, one terminal",
|
|
5
5
|
"bin": {
|
|
6
6
|
"quadwork": "./bin/quadwork.js"
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"start": "node server/",
|
|
20
20
|
"lint": "eslint",
|
|
21
21
|
"server": "node server/",
|
|
22
|
+
"test": "node server/run-tests.js",
|
|
22
23
|
"prepack": "npm run build",
|
|
23
24
|
"release:patch": "npm version patch && git push origin main --follow-tags && VERSION=$(node -p 'require(\"./package.json\").version') && gh release create \"v$VERSION\" --generate-notes --latest && npm publish",
|
|
24
25
|
"release:minor": "npm version minor && git push origin main --follow-tags && VERSION=$(node -p 'require(\"./package.json\").version') && gh release create \"v$VERSION\" --generate-notes --latest && npm publish",
|
package/server/index.js
CHANGED
|
@@ -11,6 +11,7 @@ const routes = require("./routes");
|
|
|
11
11
|
const fileChat = require("./file-chat");
|
|
12
12
|
const { dispatchToAgentPTY, cleanupSession: cleanupPtyDispatcher } = require("./pty-dispatcher");
|
|
13
13
|
const { runAcMigration } = require("./migrate-ac");
|
|
14
|
+
const selfHeal = require("./self-heal");
|
|
14
15
|
|
|
15
16
|
const net = require("net");
|
|
16
17
|
const config = readConfig();
|
|
@@ -502,6 +503,39 @@ async function spawnAgentPty(project, agent, opts = {}) {
|
|
|
502
503
|
if (session.scrollback.length > SCROLLBACK_SIZE) {
|
|
503
504
|
session.scrollback = session.scrollback.slice(-SCROLLBACK_SIZE);
|
|
504
505
|
}
|
|
506
|
+
|
|
507
|
+
// #797: observe-only self-heal detector. Wrapped in its own try/catch so
|
|
508
|
+
// a detector bug can never break the PTY → xterm pipeline; the chunk is
|
|
509
|
+
// never consumed or altered (the WS viewer forwards it independently).
|
|
510
|
+
try {
|
|
511
|
+
selfHeal.observeChunk(key, data, {
|
|
512
|
+
now: Date.now(),
|
|
513
|
+
recovering: !!session._autoRecovering,
|
|
514
|
+
onRestart: () => {
|
|
515
|
+
session._autoRecovering = true;
|
|
516
|
+
console.log(`[self-heal] ${key}: thinking-block 400 detected — restarting session`);
|
|
517
|
+
// #825: NO clearSelfHeal here — the breaker window must persist
|
|
518
|
+
// across auto-restarts so repeated trips can pause auto-recovery.
|
|
519
|
+
restartAgentSession(key, { reason: "thinking-block-400" })
|
|
520
|
+
.then((result) => {
|
|
521
|
+
if (result && result.ok) {
|
|
522
|
+
emitSystemMessage(project, `${agent} auto-restarted (recovered from thinking-block API error)`);
|
|
523
|
+
}
|
|
524
|
+
})
|
|
525
|
+
.catch((err) => console.error(`[self-heal] ${key}: auto-restart failed:`, err.message))
|
|
526
|
+
.finally(() => {
|
|
527
|
+
const s = agentSessions.get(key);
|
|
528
|
+
if (s) s._autoRecovering = false;
|
|
529
|
+
});
|
|
530
|
+
},
|
|
531
|
+
onBreaker: (message) => {
|
|
532
|
+
console.log(`[self-heal] ${key}: ${message}`);
|
|
533
|
+
emitSystemMessage(project, message);
|
|
534
|
+
},
|
|
535
|
+
});
|
|
536
|
+
} catch (err) {
|
|
537
|
+
console.error(`[self-heal] ${key}: detector error (ignored):`, err.message);
|
|
538
|
+
}
|
|
505
539
|
});
|
|
506
540
|
|
|
507
541
|
term.onExit(({ exitCode }) => {
|
|
@@ -525,7 +559,16 @@ async function spawnAgentPty(project, agent, opts = {}) {
|
|
|
525
559
|
}
|
|
526
560
|
}
|
|
527
561
|
|
|
528
|
-
async function stopAgentSession(key) {
|
|
562
|
+
async function stopAgentSession(key, { clearSelfHeal = false } = {}) {
|
|
563
|
+
// #825 (#797 follow-up): a MANUAL stop/restart/reset must reset the per-agent
|
|
564
|
+
// self-heal circuit-breaker window, so a fresh operator-driven session isn't
|
|
565
|
+
// suppressed by a stale "paused" state from a prior trip. This is gated:
|
|
566
|
+
// the auto-restart path (restartAgentSession with reason "thinking-block-400")
|
|
567
|
+
// leaves clearSelfHeal=false, because clearing on every auto-restart would
|
|
568
|
+
// reset countInWindow each time and defeat the #797 breaker entirely. Cleared
|
|
569
|
+
// before the session lookup so a manual stop resets the window even when no
|
|
570
|
+
// live session remains (e.g. the agent already exited).
|
|
571
|
+
if (clearSelfHeal) selfHeal.clearState(key);
|
|
529
572
|
const session = agentSessions.get(key);
|
|
530
573
|
if (!session) {
|
|
531
574
|
agentSessions.set(key, { projectId: null, agentId: null, term: null, viewers: new Set(), viewerDims: new Map(), lastDims: null, state: "stopped", error: null });
|
|
@@ -596,7 +639,7 @@ app.post("/api/agents/:project/reset", async (req, res) => {
|
|
|
596
639
|
for (const agentId of allAgentIds) {
|
|
597
640
|
const s = agentSessions.get(`${projectId}/${agentId}`);
|
|
598
641
|
if (s) s._suppressLifecycleMsg = true;
|
|
599
|
-
await stopAgentSession(`${projectId}/${agentId}
|
|
642
|
+
await stopAgentSession(`${projectId}/${agentId}`, { clearSelfHeal: true }); // #825: manual reset resets the self-heal window
|
|
600
643
|
}
|
|
601
644
|
|
|
602
645
|
// Respawn all agents with fresh MCP tokens
|
|
@@ -635,7 +678,7 @@ app.post("/api/full-reset", async (_req, res) => {
|
|
|
635
678
|
console.log("[full-reset] stopping all agent sessions...");
|
|
636
679
|
const sessionKeys = [...agentSessions.keys()];
|
|
637
680
|
for (const key of sessionKeys) {
|
|
638
|
-
await stopAgentSession(key);
|
|
681
|
+
await stopAgentSession(key, { clearSelfHeal: true }); // #825: manual full-reset resets the self-heal window
|
|
639
682
|
}
|
|
640
683
|
|
|
641
684
|
console.log("[full-reset] stopping Butler...");
|
|
@@ -707,23 +750,35 @@ app.post("/api/agents/:project/:agent/start", async (req, res) => {
|
|
|
707
750
|
app.post("/api/agents/:project/:agent/stop", async (req, res) => {
|
|
708
751
|
const { project, agent } = req.params;
|
|
709
752
|
const key = `${project}/${agent}`;
|
|
710
|
-
await stopAgentSession(key);
|
|
753
|
+
await stopAgentSession(key, { clearSelfHeal: true }); // #825: manual stop resets the self-heal window
|
|
711
754
|
res.json({ ok: true, state: "stopped" });
|
|
712
755
|
});
|
|
713
756
|
|
|
714
757
|
// --- Lifecycle: restart ---
|
|
715
758
|
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
759
|
+
// #797: shared restart sequence, used by both the manual restart route and
|
|
760
|
+
// the self-heal detector. Exactly the prior route body — no new lifecycle
|
|
761
|
+
// logic. The `reason` is informational (logged by callers).
|
|
762
|
+
async function restartAgentSession(key, { reason, clearSelfHeal = false } = {}) {
|
|
763
|
+
const [project, agent] = key.split("/");
|
|
764
|
+
console.log(`[restart] ${key}: restarting session (reason: ${reason || "unspecified"})`);
|
|
719
765
|
|
|
720
766
|
// #241: must await deregister before respawn so the slot frees and
|
|
721
767
|
// the fresh register lands at slot 1 instead of head-2.
|
|
722
768
|
const existing = agentSessions.get(key);
|
|
723
769
|
if (existing) existing._suppressLifecycleMsg = true;
|
|
724
|
-
|
|
770
|
+
// #825: forward clearSelfHeal — a manual restart resets the breaker window;
|
|
771
|
+
// the self-heal auto-restart does NOT (preserves the #797 circuit breaker).
|
|
772
|
+
await stopAgentSession(key, { clearSelfHeal });
|
|
773
|
+
|
|
774
|
+
return spawnAgentPty(project, agent, { suppressLifecycleMsg: true });
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
app.post("/api/agents/:project/:agent/restart", async (req, res) => {
|
|
778
|
+
const { project, agent } = req.params;
|
|
779
|
+
const key = `${project}/${agent}`;
|
|
725
780
|
|
|
726
|
-
const result = await
|
|
781
|
+
const result = await restartAgentSession(key, { reason: "manual", clearSelfHeal: true }); // #825
|
|
727
782
|
if (result.ok) {
|
|
728
783
|
emitSystemMessage(project, `${agent} restarted`);
|
|
729
784
|
res.json({ ok: true, state: "running", pid: result.pid });
|
|
@@ -972,10 +1027,11 @@ app.get("/api/butler/status", (_req, res) => {
|
|
|
972
1027
|
const triggers = new Map();
|
|
973
1028
|
|
|
974
1029
|
const DEFAULT_MESSAGE = `@head @re1 @re2 @dev — Queue check.
|
|
975
|
-
|
|
1030
|
+
Discovery: read GITHUB.md (or GET /api/github-parsed) for issue/PR state instead of running gh. If GITHUB.md is absent or stale (>2 cycles / _stale), do ONE direct gh read to confirm. GITHUB.md may lag — confirm with a direct gh read before any merge/review decision.
|
|
1031
|
+
Head: Merge any PR with both current-revision approvals, assign next from queue.
|
|
976
1032
|
Dev: Work on assigned ticket or address review feedback.
|
|
977
|
-
RE1/RE2: Review open PRs. If Dev pushed fixes, re-review. Post verdict on PR AND notify here.
|
|
978
|
-
ALL: Communicate via this chat by tagging agents. Your terminal is NOT visible.`;
|
|
1033
|
+
RE1/RE2: Review ONLY PRs you were @mentioned on in this chat (not all open PRs). If Dev pushed fixes, re-review. Post verdict on PR AND notify here.
|
|
1034
|
+
ALL: If nothing is assigned or pending for you, no-op quietly. Communicate via this chat by tagging agents. Your terminal is NOT visible.`;
|
|
979
1035
|
|
|
980
1036
|
// #518: server-side bridge lifecycle helpers. Stop and start Telegram +
|
|
981
1037
|
// Discord bridges so they respond to batch transitions even when the
|
|
@@ -1070,8 +1126,10 @@ async function sendTriggerMessage(projectId) {
|
|
|
1070
1126
|
);
|
|
1071
1127
|
if (bpRes.ok) {
|
|
1072
1128
|
const bp = await bpRes.json();
|
|
1073
|
-
|
|
1074
|
-
|
|
1129
|
+
// #810: gate auto-stop on completeConfirmed (two distinct successful
|
|
1130
|
+
// fetch cycles), NOT a single transient/stale `complete`.
|
|
1131
|
+
if (bp && bp.completeConfirmed) {
|
|
1132
|
+
console.log(`[auto-trigger] ${projectId}: batch complete (confirmed), auto-stopped`);
|
|
1075
1133
|
stopTrigger(projectId);
|
|
1076
1134
|
// Also stop caffeinate if no other triggers remain running
|
|
1077
1135
|
// (#441 companion fix). caffeinateProcess is global (not
|
|
@@ -1183,6 +1241,13 @@ app.get("/api/triggers", (_req, res) => {
|
|
|
1183
1241
|
res.json(result);
|
|
1184
1242
|
});
|
|
1185
1243
|
|
|
1244
|
+
// #812: a parked (idle) project gets no trigger starts/pulses. Read
|
|
1245
|
+
// the live config so a config-write that sets idle takes effect at once.
|
|
1246
|
+
function isProjectIdleId(projectId) {
|
|
1247
|
+
try { return !!readConfig().projects?.find((p) => p.id === projectId)?.idle; }
|
|
1248
|
+
catch { return false; }
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1186
1251
|
function stopTrigger(project) {
|
|
1187
1252
|
const existing = triggers.get(project);
|
|
1188
1253
|
if (existing) {
|
|
@@ -1194,6 +1259,11 @@ function stopTrigger(project) {
|
|
|
1194
1259
|
|
|
1195
1260
|
app.post("/api/triggers/:project/start", (req, res) => {
|
|
1196
1261
|
const { project } = req.params;
|
|
1262
|
+
// #812: refuse to start a trigger for a parked (idle) project — no
|
|
1263
|
+
// timer created, no agents pulsed. Toggle the project off idle first.
|
|
1264
|
+
if (isProjectIdleId(project)) {
|
|
1265
|
+
return res.json({ ok: false, idle: true, enabled: false });
|
|
1266
|
+
}
|
|
1197
1267
|
// #418 / quadwork#306: sendImmediately was an always-true
|
|
1198
1268
|
// send-and-start flag from the original #210 button; operators
|
|
1199
1269
|
// asked for a pure scheduler (the button is now just "Start
|
|
@@ -1265,6 +1335,10 @@ app.post("/api/triggers/:project/stop", (req, res) => {
|
|
|
1265
1335
|
|
|
1266
1336
|
app.post("/api/triggers/:project/send-now", (req, res) => {
|
|
1267
1337
|
const { project } = req.params;
|
|
1338
|
+
// #812: parked (idle) project — do not pulse agents.
|
|
1339
|
+
if (isProjectIdleId(project)) {
|
|
1340
|
+
return res.json({ ok: false, idle: true, sent: false });
|
|
1341
|
+
}
|
|
1268
1342
|
sendTriggerMessage(project);
|
|
1269
1343
|
res.json({ ok: true, sent: true });
|
|
1270
1344
|
});
|
|
@@ -1593,7 +1667,11 @@ function syncTriggersFromConfig() {
|
|
|
1593
1667
|
|
|
1594
1668
|
if (cfg.projects) {
|
|
1595
1669
|
for (const project of cfg.projects) {
|
|
1596
|
-
|
|
1670
|
+
// #812: idle (parked) projects get no trigger. Excluding them from
|
|
1671
|
+
// activeIds also makes the cleanup loop below clear any timer they
|
|
1672
|
+
// had — so writing idle:true via PUT /api/config (which calls this)
|
|
1673
|
+
// stops a running trigger with no separate stop call.
|
|
1674
|
+
if (project.trigger_enabled && !project.idle) {
|
|
1597
1675
|
activeIds.add(project.id);
|
|
1598
1676
|
const ms = (project.trigger_interval || 30) * 60 * 1000;
|
|
1599
1677
|
const existing = triggers.get(project.id);
|
|
@@ -1631,6 +1709,7 @@ async function autoStopPollingTick() {
|
|
|
1631
1709
|
if (!cfg.projects) return;
|
|
1632
1710
|
|
|
1633
1711
|
for (const project of cfg.projects) {
|
|
1712
|
+
if (project.idle) continue; // #812: parked project — no batch-progress polling
|
|
1634
1713
|
const hasTriggerAuto = project.trigger_auto && triggers.has(project.id);
|
|
1635
1714
|
const hasBridgeAuto = project.telegram_auto || project.discord_auto;
|
|
1636
1715
|
if (!hasTriggerAuto && !hasBridgeAuto) continue;
|
|
@@ -1642,12 +1721,16 @@ async function autoStopPollingTick() {
|
|
|
1642
1721
|
if (!res.ok) continue;
|
|
1643
1722
|
const bp = await res.json();
|
|
1644
1723
|
const hasItems = bp.items && bp.items.length > 0;
|
|
1724
|
+
// #810: gate auto-stop on completeConfirmed (two distinct successful fetch
|
|
1725
|
+
// cycles), not a single transient/stale `complete`. Track prev on the
|
|
1726
|
+
// confirmed value so the bridge-stop transition guard fires on it.
|
|
1727
|
+
const confirmed = !!bp.completeConfirmed;
|
|
1645
1728
|
const prev = _bridgeBatchPrev.get(project.id);
|
|
1646
|
-
_bridgeBatchPrev.set(project.id, { complete:
|
|
1729
|
+
_bridgeBatchPrev.set(project.id, { complete: confirmed, hasItems });
|
|
1647
1730
|
|
|
1648
|
-
if (bp &&
|
|
1731
|
+
if (bp && confirmed) {
|
|
1649
1732
|
if (hasTriggerAuto) {
|
|
1650
|
-
console.log(`[auto-trigger] ${project.id}: batch complete, auto-stopped (poller)`);
|
|
1733
|
+
console.log(`[auto-trigger] ${project.id}: batch complete (confirmed), auto-stopped (poller)`);
|
|
1651
1734
|
stopTrigger(project.id);
|
|
1652
1735
|
if (caffeinateProcess.process && triggers.size === 0) {
|
|
1653
1736
|
try { caffeinateProcess.process.kill("SIGTERM"); } catch {}
|
|
@@ -1821,6 +1904,16 @@ server.listen(PORT, "127.0.0.1", async () => {
|
|
|
1821
1904
|
|
|
1822
1905
|
runStartupMigrations(startupCfg);
|
|
1823
1906
|
|
|
1907
|
+
// #856: Auto-reseed worktree AGENTS.md when the package version changes.
|
|
1908
|
+
// Per-project completion state lives in ~/.quadwork/reseed-state.json, so
|
|
1909
|
+
// projects deferred mid-batch stay pending and retry on the next startup.
|
|
1910
|
+
// Failures here MUST NOT block server boot.
|
|
1911
|
+
try {
|
|
1912
|
+
await routes.autoReseedOnStartup(startupCfg);
|
|
1913
|
+
} catch (err) {
|
|
1914
|
+
console.error(`[reseed] auto-reseed failed: ${err.message}`);
|
|
1915
|
+
}
|
|
1916
|
+
|
|
1824
1917
|
if (startupCfg.butler && startupCfg.butler.enabled && startupCfg.butler.auto_start) {
|
|
1825
1918
|
const result = spawnButlerPty();
|
|
1826
1919
|
if (result.ok) console.log(`[butler] auto-started (PID: ${result.pid})`);
|