quadwork 1.14.2 → 1.14.4
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/bin/quadwork.js +14 -9
- 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/0d317d-t~iopy.js +1 -0
- package/out/_next/static/chunks/{103nd9.e5nlgc.css → 17mchyaqt6.wr.css} +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 +34 -0
- package/server/routes.js +20 -6
- package/templates/config.toml +14 -0
- package/templates/seeds/head.AGENTS.md +4 -1
- package/out/_next/static/chunks/0nuk4qfi43kgg.js +0 -1
- /package/out/_next/static/{d3JchnGiacGu3BFpxd0R- → msdU6fsBBeon5y_TzudjN}/_buildManifest.js +0 -0
- /package/out/_next/static/{d3JchnGiacGu3BFpxd0R- → msdU6fsBBeon5y_TzudjN}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{d3JchnGiacGu3BFpxd0R- → msdU6fsBBeon5y_TzudjN}/_ssgManifest.js +0 -0
|
@@ -67,9 +67,12 @@ When the operator asks you in chat to start a task or batch:
|
|
|
67
67
|
**Started:** <YYYY-MM-DD HH:MM>
|
|
68
68
|
**Status:** pending kickoff
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
- #598 Fix double AC restart
|
|
71
|
+
- #600 Display version in sidebar
|
|
71
72
|
```
|
|
72
73
|
|
|
74
|
+
Each item MUST start with `- #<number>` (dash, space, hash, issue number). Do NOT prefix with words like "Issue" — `- Issue #598 ...` will NOT be recognized by the batch progress panel. The `#` must be the first token after the list marker.
|
|
75
|
+
|
|
73
76
|
When you move a batch to Done, **preserve its `Batch: N` line** so the next batch's number computation stays correct.
|
|
74
77
|
3. Reply in chat to confirm what you wrote to the queue file (issue numbers + which section).
|
|
75
78
|
4. **Tell the operator the queue is ready and how to kick it off.** Send a chat message like:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,98183,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={assign:function(){return i},searchParamsToUrlQuery:function(){return s},urlQueryToSearchParams:function(){return l}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});function s(e){let t={};for(let[r,n]of e.entries()){let e=t[r];void 0===e?t[r]=n:Array.isArray(e)?e.push(n):t[r]=[e,n]}return t}function a(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function l(e){let t=new URLSearchParams;for(let[r,n]of Object.entries(e))if(Array.isArray(n))for(let e of n)t.append(r,a(e));else t.set(r,a(n));return t}function i(e,...t){for(let r of t){for(let t of r.keys())e.delete(t);for(let[t,n]of r.entries())e.append(t,n)}return e}},18967,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={DecodeError:function(){return g},MiddlewareNotFoundError:function(){return y},MissingStaticPage:function(){return v},NormalizeError:function(){return b},PageNotFoundError:function(){return j},SP:function(){return x},ST:function(){return m},WEB_VITALS:function(){return s},execOnce:function(){return a},getDisplayName:function(){return d},getLocationOrigin:function(){return c},getURL:function(){return u},isAbsoluteUrl:function(){return i},isResSent:function(){return f},loadGetInitialProps:function(){return p},normalizeRepeatedSlashes:function(){return h},stringifyError:function(){return w}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let s=["CLS","FCP","FID","INP","LCP","TTFB"];function a(e){let t,r=!1;return(...n)=>(r||(r=!0,t=e(...n)),t)}let l=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>l.test(e);function c(){let{protocol:e,hostname:t,port:r}=window.location;return`${e}//${t}${r?":"+r:""}`}function u(){let{href:e}=window.location,t=c();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function f(e){return e.finished||e.headersSent}function h(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function p(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await p(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&f(r))return n;if(!n)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${n}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return n}let x="u">typeof performance,m=x&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class g extends Error{}class b extends Error{}class j extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class v extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class y extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function w(e){return JSON.stringify({message:e.message,stack:e.stack})}},33525,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"warnOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},18566,(e,t,r)=>{t.exports=e.r(76562)},52368,e=>{"use strict";var t=e.i(43476),r=e.i(71645);let n="qw-locale";function o(e){return"ko"===e?"ko":"en"}let s=(0,r.createContext)(null);e.s(["LocaleProvider",0,function({children:e}){let[a,l]=(0,r.useState)(!1),[i,c]=(0,r.useState)("en");(0,r.useEffect)(()=>{c(function(){try{let e=window.localStorage.getItem(n);if(e)return o(e)}catch{}return window.navigator.language.toLowerCase().startsWith("ko")?"ko":"en"}()),l(!0)},[]),(0,r.useEffect)(()=>{document.documentElement.lang=i;try{window.localStorage.setItem(n,i)}catch{}try{document.cookie=`qw-locale=${i}; path=/; max-age=31536000; samesite=lax`}catch{}},[i]);let u=(0,r.useMemo)(()=>({hydrated:a,locale:i,setLocale:e=>c(o(e))}),[a,i]);return(0,t.jsx)(s.Provider,{value:u,children:e})},"useLocale",0,function(){let e=(0,r.useContext)(s);if(!e)throw Error("useLocale must be used within LocaleProvider");return e}],52368)},67449,e=>{"use strict";let t=[{value:"soft-chime",label:"Soft Chime"},{value:"warm-bell",label:"Warm Bell"},{value:"click",label:"Click"},{value:"alert-tone",label:"Alert Tone"},{value:"pluck",label:"Pluck"}],r="quadwork_notification_sound",n="quadwork_notification_sound_choice",o="quadwork_notification_sound_background_only";function s(e){try{return window.localStorage.getItem(e)}catch{return null}}function a(e,t){try{window.localStorage.setItem(e,t)}catch{}}function l(){return"off"!==s(r)}function i(){let e=s(n);return e&&t.some(t=>t.value===e)?e:"soft-chime"}function c(){let e=s(o);return null===e||"off"!==e}e.s(["NOTIFICATION_SOUND_OPTIONS",0,t,"getNotificationBackgroundOnly",0,c,"getNotificationChoice",0,i,"getNotificationEnabled",0,l,"playNotificationSound",0,function(){if(!l()||c()&&document.hasFocus())return;let e=i();try{let t=new Audio(`/sounds/${e}.mp3`);t.volume=.6,t.play().catch(()=>{})}catch{}},"setNotificationBackgroundOnly",0,function(e){a(o,e?"on":"off")},"setNotificationChoice",0,function(e){a(n,e)},"setNotificationEnabled",0,function(e){a(r,e?"on":"off")}])},95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return l},formatWithValidation:function(){return c},urlObjectKeys:function(){return i}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let s=e.r(90809)._(e.r(98183)),a=/https?|ftp|gopher|file/;function l(e){let{auth:t,hostname:r}=e,n=e.protocol||"",o=e.pathname||"",l=e.hash||"",i=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),i&&"object"==typeof i&&(i=String(s.urlQueryToSearchParams(i)));let u=e.search||i&&`?${i}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||a.test(n))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),l&&"#"!==l[0]&&(l="#"+l),u&&"?"!==u[0]&&(u="?"+u),o=o.replace(/[?#]/g,encodeURIComponent),u=u.replace("#","%23"),`${n}${c}${o}${u}${l}`}let i=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return l(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return o}});let n=e.r(71645);function o(e,t){let r=(0,n.useRef)(null),o=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(r.current=s(e,n)),t&&(o.current=s(t,n))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let n=e.r(18967),o=e.r(52817);function s(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,o.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return g},useLinkStatus:function(){return j}};for(var o in n)Object.defineProperty(r,o,{enumerable:!0,get:n[o]});let s=e.r(90809),a=e.r(43476),l=s._(e.r(71645)),i=e.r(95057),c=e.r(8372),u=e.r(18581),d=e.r(18967),f=e.r(5550);e.r(33525);let h=e.r(88540),p=e.r(91949),x=e.r(73668),m=e.r(9396);function g(t){var r,n;let o,s,g,[j,v]=(0,l.useOptimistic)(p.IDLE_LINK_STATUS),y=(0,l.useRef)(null),{href:w,as:k,children:N,prefetch:C=null,passHref:S,replace:_,shallow:E,scroll:L,onClick:P,onMouseEnter:O,onTouchStart:I,legacyBehavior:M=!1,onNavigate:T,transitionTypes:$,ref:R,unstable_dynamicOnHover:A,...B}=t;o=N,M&&("string"==typeof o||"number"==typeof o)&&(o=(0,a.jsx)("a",{children:o}));let U=l.default.useContext(c.AppRouterContext),W=!1!==C,F=!1!==C?null===(n=C)||"auto"===n?m.FetchStrategy.PPR:m.FetchStrategy.Full:m.FetchStrategy.PPR,q="string"==typeof(r=k||w)?r:(0,i.formatUrl)(r);if(M){if(o?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=l.default.Children.only(o)}let z=M?s&&"object"==typeof s&&s.ref:R,D=l.default.useCallback(e=>(null!==U&&(y.current=(0,p.mountLinkInstance)(e,q,U,F,W,v)),()=>{y.current&&((0,p.unmountLinkForCurrentNavigation)(y.current),y.current=null),(0,p.unmountPrefetchableInstance)(e)}),[W,q,U,F,v]),K={ref:(0,u.useMergedRef)(D,z),onClick(t){M||"function"!=typeof P||P(t),M&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!U||t.defaultPrevented||function(t,r,n,o,s,a,i){if("u">typeof window){let c,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,x.isLocalURL)(r)){o&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),a){let e=!1;if(a({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:d}=e.r(99781);l.default.startTransition(()=>{d(r,o?"replace":"push",!1===s?h.ScrollBehavior.NoScroll:h.ScrollBehavior.Default,n.current,i)})}}(t,q,y,_,L,T,$)},onMouseEnter(e){M||"function"!=typeof O||O(e),M&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),U&&W&&(0,p.onNavigationIntent)(e.currentTarget,!0===A)},onTouchStart:function(e){M||"function"!=typeof I||I(e),M&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),U&&W&&(0,p.onNavigationIntent)(e.currentTarget,!0===A)}};return(0,d.isAbsoluteUrl)(q)?K.href=q:M&&!S&&("a"!==s.type||"href"in s.props)||(K.href=(0,f.addBasePath)(q)),g=M?l.default.cloneElement(s,K):(0,a.jsx)("a",{...B,...K,children:o}),(0,a.jsx)(b.Provider,{value:j,children:g})}e.r(84508);let b=(0,l.createContext)(p.IDLE_LINK_STATUS),j=()=>(0,l.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},22140,e=>{"use strict";var t=e.i(43476),r=e.i(22016),n=e.i(18566),o=e.i(71645);function s(){return(0,t.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("path",{d:"M3 10L10 3l7 7"}),(0,t.jsx)("path",{d:"M5 8.5V16h3.5v-4h3v4H15V8.5"})]})}function a(){return(0,t.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 18 18",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,t.jsx)("circle",{cx:"9",cy:"9",r:"2.5"}),(0,t.jsx)("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"})]})}function l(){return(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",children:(0,t.jsx)("path",{d:"M8 3v10M3 8h10"})})}function i(){return(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,t.jsx)("path",{d:"M10 3L5 8l5 5"})})}function c(){return(0,t.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,t.jsx)("path",{d:"M6 3l5 5-5 5"})})}function u({collapsed:e}){return(0,t.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",className:`transition-transform duration-150 ${e?"-rotate-90":""}`,children:(0,t.jsx)("path",{d:"M3 4.5l3 3 3-3"})})}function d({size:e=10}){return(0,t.jsxs)("svg",{width:e,height:e,viewBox:"0 0 16 16",fill:"currentColor",stroke:"none",children:[(0,t.jsx)("path",{d:"M10.5 1.5L14.5 5.5L10 7.5L8.5 12.5L3.5 7.5L8.5 6L10.5 1.5Z"}),(0,t.jsx)("path",{d:"M3.5 7.5L1 15L8.5 12.5"})]})}function f({project:e,isActive:n,expanded:s,pinned:a,onContextMenu:l}){let[i,c]=(0,o.useState)(null),u=(0,o.useRef)(null);return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(r.default,{ref:u,href:`/project/${e.id}`,className:`flex items-center gap-2 ${s?"w-full px-2":""} rounded-sm transition-colors ${!s?"":n?"bg-[#1a1a1a]":"hover:bg-[#1a1a1a]"}`,onMouseEnter:()=>{if(s)return;let e=u.current?.getBoundingClientRect();e&&c({top:e.top+e.height/2})},onMouseLeave:()=>c(null),onContextMenu:t=>l(t,e.id),children:[(0,t.jsxs)("div",{className:"relative shrink-0",children:[(0,t.jsx)("div",{className:`w-10 h-10 flex items-center justify-center rounded-full text-[11px] font-semibold uppercase tracking-tight transition-colors ${n?"border-2 border-accent text-accent":"border border-border text-text-muted hover:text-text"}`,children:e.name.slice(0,2)||"?"}),a&&!s&&(0,t.jsx)("div",{className:"absolute -top-1 -right-1 text-accent",children:(0,t.jsx)(d,{size:8})})]}),s&&(0,t.jsxs)("span",{className:`text-xs truncate flex items-center gap-1 ${n?"text-accent":"text-text-muted"}`,children:[e.name,a&&(0,t.jsx)(d,{size:10})]})]}),!s&&i&&(0,t.jsxs)("div",{className:"fixed px-2 py-1 bg-bg-surface border border-border text-text text-xs whitespace-nowrap pointer-events-none z-50",style:{left:72,top:i.top,transform:"translateY(-50%)"},children:[a&&"📌 ",e.name]})]})}let h="qw-sidebar-expanded",p="qw-sidebar-collapsed-groups";e.s(["default",0,function(){let e=(0,n.usePathname)(),[d,x]=(0,o.useState)([]),[m,g]=(0,o.useState)([]),[b,j]=(0,o.useState)([]),[v,y]=(0,o.useState)(new Set),[w,k]=(0,o.useState)("online"),[N,C]=(0,o.useState)(!1),[S,_]=(0,o.useState)(null),E=(0,o.useRef)(null);(0,o.useEffect)(()=>{try{if(window.innerWidth>=768){let e=localStorage.getItem(h);"true"===e&&C(!0)}let e=localStorage.getItem(p);e&&y(new Set(JSON.parse(e)))}catch{}},[]),(0,o.useEffect)(()=>{let e=window.matchMedia("(max-width: 767px)"),t=e=>{e.matches&&C(!1)};return e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),(0,o.useEffect)(()=>{fetch("/api/config").then(e=>{if(!e.ok)throw Error(`Config fetch failed: ${e.status}`);return e.json()}).then(e=>{E.current=e,x((e.projects||[]).filter(e=>!e.archived)),g(e.pinned_projects||[]),j(e.sidebar_groups||[])}).catch(()=>{})},[]),(0,o.useEffect)(()=>{let e,t=!1,r=async()=>{try{let e=await fetch("/api/health",{signal:AbortSignal.timeout(3e3)});if(t)return;e.ok?k(e=>"offline"===e?"recovering":"online"):k("offline")}catch{if(t)return;k("offline")}t||(e=setTimeout(r,5e3))};return r(),()=>{t=!0,clearTimeout(e)}},[]),(0,o.useEffect)(()=>{if("recovering"===w){let e=setTimeout(()=>k("online"),1500);return()=>clearTimeout(e)}},[w]);let L="/"===e,P="/settings"===e,O=e.startsWith("/project/")?e.split("/")[2]:null,I=(0,o.useCallback)(e=>{g(e),fetch("/api/config").then(e=>e.json()).then(t=>{let r={...t,pinned_projects:e};return E.current=r,fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)})}).catch(()=>{})},[]),M=(0,o.useCallback)(e=>{j(e),fetch("/api/config").then(e=>e.json()).then(t=>{let r={...t,sidebar_groups:e};return E.current=r,fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)})}).catch(()=>{})},[]),T=(e,t)=>{let r=b.map(t=>({...t,projects:t.projects.filter(t=>t!==e)}));if("__ungrouped__"===t)M(r.filter(e=>e.projects.length>0));else{let n=r.find(e=>e.name===t);n?n.projects.push(e):r.push({name:t,projects:[e]}),M(r.filter(e=>e.projects.length>0))}_(null)},$=(e,t)=>{e.preventDefault(),_({x:e.clientX,y:e.clientY,projectId:t})};(0,o.useEffect)(()=>{if(!S)return;let e=()=>_(null);return window.addEventListener("click",e),()=>window.removeEventListener("click",e)},[S]);let R=new Set(m),A=m.map(e=>d.find(t=>t.id===e)).filter(e=>!!e),B=new Set(b.flatMap(e=>e.projects)),U=d.filter(e=>!R.has(e.id)),W=U.filter(e=>!B.has(e.id));return(0,t.jsxs)("aside",{className:`shrink-0 h-full border-r border-border bg-bg-surface flex flex-col py-3 transition-[width] duration-200 ease-in-out overflow-hidden ${N?"w-52 items-stretch px-2":"w-16 items-center"}`,children:[(0,t.jsxs)(r.default,{href:"/",className:`flex items-center gap-2 rounded-sm transition-colors ${N?"px-2 py-2":"w-10 h-10 justify-center self-center"} ${L?"text-accent":"text-text-muted hover:text-text hover:bg-[#1a1a1a]"}`,title:"Home",children:[(0,t.jsx)(s,{}),N&&(0,t.jsx)("span",{className:"text-xs",children:"Home"})]}),(0,t.jsx)("div",{className:`h-px bg-border my-2 ${N?"":"w-6 self-center"}`}),(0,t.jsxs)("div",{className:`flex-1 flex flex-col gap-2 overflow-y-auto min-h-0 ${N?"":"items-center"}`,children:[A.length>0&&(0,t.jsxs)(t.Fragment,{children:[N&&(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-widest text-text-muted px-2",children:"Pinned"}),A.map(e=>(0,t.jsx)(f,{project:e,isActive:O===e.id,expanded:N,pinned:!0,onContextMenu:$},e.id)),(0,t.jsx)("div",{className:`h-px bg-border ${N?"":"w-6"}`})]}),b.map(e=>{let r=e.projects.map(e=>U.find(t=>t.id===e)).filter(e=>!!e);if(0===r.length)return null;let n=v.has(e.name);return(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)("button",{onClick:()=>{var t;return t=e.name,void y(e=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t);try{localStorage.setItem(p,JSON.stringify([...r]))}catch{}return r})},className:`flex items-center gap-1 text-text-muted hover:text-text transition-colors ${N?"px-2 py-0.5":"justify-center w-full"}`,title:`${n?"Expand":"Collapse"} ${e.name}`,children:N?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(u,{collapsed:n}),(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-widest truncate",children:e.name})]}):(0,t.jsx)("div",{className:`w-6 h-px ${n?"bg-text-muted":"bg-border"}`})}),!n&&r.map(e=>(0,t.jsx)(f,{project:e,isActive:O===e.id,expanded:N,pinned:!1,onContextMenu:$},e.id))]},e.name)}),W.length>0&&b.length>0&&(0,t.jsxs)(t.Fragment,{children:[N&&(0,t.jsx)("span",{className:"text-[10px] uppercase tracking-widest text-text-muted px-2",children:"Ungrouped"}),b.length>0&&!N&&(0,t.jsx)("div",{className:"w-6 h-px bg-border"})]}),W.map(e=>(0,t.jsx)(f,{project:e,isActive:O===e.id,expanded:N,pinned:!1,onContextMenu:$},e.id)),(0,t.jsxs)(r.default,{href:"/setup",className:`flex items-center gap-2 rounded-full transition-colors ${N?"px-2 py-2 border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a] rounded-sm":"w-10 h-10 justify-center border border-dashed border-border text-text-muted hover:text-text hover:bg-[#1a1a1a]"}`,title:"Add project",children:[(0,t.jsx)(l,{}),N&&(0,t.jsx)("span",{className:"text-xs text-text-muted",children:"New Project"})]})]}),S&&(0,t.jsxs)("div",{className:"fixed bg-bg-surface border border-border py-1 z-50 text-xs",style:{left:S.x,top:S.y},onClick:e=>e.stopPropagation(),children:[R.has(S.projectId)?(0,t.jsx)("button",{className:"w-full px-3 py-1.5 text-left text-text hover:bg-[#1a1a1a] transition-colors",onClick:()=>{var e;return e=S.projectId,void(I(m.filter(t=>t!==e)),_(null))},children:"Unpin"}):(0,t.jsx)("button",{className:"w-full px-3 py-1.5 text-left text-text hover:bg-[#1a1a1a] transition-colors",onClick:()=>{var e;return e=S.projectId,void(!m.includes(e)&&(I([e,...m]),_(null)))},children:"Pin to top"}),(0,t.jsx)("div",{className:"h-px bg-border my-1"}),S.showGroupMenu?(0,t.jsxs)("div",{className:"flex flex-col",children:[b.map(e=>(0,t.jsx)("button",{className:"w-full px-3 py-1.5 text-left text-text hover:bg-[#1a1a1a] transition-colors",onClick:()=>T(S.projectId,e.name),children:e.name},e.name)),(0,t.jsx)("button",{className:"w-full px-3 py-1.5 text-left text-text hover:bg-[#1a1a1a] transition-colors",onClick:()=>{let e=prompt("New group name:");if(!e?.trim())return;let t=e.trim();b.some(e=>e.name.toLowerCase()===t.toLowerCase())?alert(`Group "${t}" already exists.`):T(S.projectId,t)},children:"+ New group"}),B.has(S.projectId)&&(0,t.jsx)("button",{className:"w-full px-3 py-1.5 text-left text-text-muted hover:bg-[#1a1a1a] transition-colors",onClick:()=>T(S.projectId,"__ungrouped__"),children:"Remove from group"})]}):(0,t.jsx)("button",{className:"w-full px-3 py-1.5 text-left text-text hover:bg-[#1a1a1a] transition-colors",onClick:()=>_({...S,showGroupMenu:!0}),children:"Move to group..."})]}),(0,t.jsx)("div",{className:`h-px bg-border my-2 ${N?"":"w-6 self-center"}`}),"online"!==w&&(0,t.jsxs)("div",{className:`mb-2 relative group ${N?"px-2":"self-center"}`,children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("div",{className:`w-3 h-3 shrink-0 rounded-full ${"offline"===w?"bg-red-500 animate-pulse":"bg-green-500"}`}),N&&(0,t.jsx)("span",{className:"text-xs text-text-muted",children:"offline"===w?"Backend offline":"Reconnected"})]}),!N&&(0,t.jsx)("div",{className:"fixed left-16 ml-2 px-2 py-1 bg-bg-surface border border-border text-xs whitespace-nowrap z-50 hidden group-hover:block",style:{transform:"translateY(-50%)",top:"auto"},children:"offline"===w?"Backend offline — run quadwork start":"Backend reconnected"})]}),(0,t.jsx)("button",{onClick:()=>{C(e=>{let t=!e;try{localStorage.setItem(h,String(t))}catch{}return t})},className:`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 ${N?"self-end":"self-center"}`,title:N?"Collapse sidebar":"Expand sidebar",children:N?(0,t.jsx)(i,{}):(0,t.jsx)(c,{})}),(0,t.jsx)("div",{className:"h-1"}),(0,t.jsxs)(r.default,{href:"/settings",className:`flex items-center gap-2 rounded-sm transition-colors ${N?"px-2 py-2":"w-10 h-10 justify-center self-center"} ${P?"text-accent":"text-text-muted hover:text-text hover:bg-[#1a1a1a]"}`,title:"Settings",children:[(0,t.jsx)(a,{}),N&&(0,t.jsx)("span",{className:"text-xs",children:"Settings"})]})]})}])},26704,e=>{"use strict";var t=e.i(43476),r=e.i(22016),n=e.i(71645);function o({open:e,onClose:r}){return((0,n.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&r()};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[e,r]),e)?(0,t.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm",onClick:r,role:"dialog","aria-modal":"true","aria-labelledby":"about-title",children:(0,t.jsxs)("div",{className:"relative mx-4 max-w-lg w-full rounded-lg border border-white/10 bg-neutral-950 p-6 shadow-2xl",onClick:e=>e.stopPropagation(),children:[(0,t.jsx)("button",{type:"button",onClick:r,"aria-label":"Close",className:"absolute right-3 top-3 rounded p-1 text-neutral-400 hover:bg-white/5 hover:text-white",children:(0,t.jsx)("svg",{width:"18",height:"18",viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",strokeWidth:"1.8",children:(0,t.jsx)("path",{d:"M4 4l12 12M16 4L4 16",strokeLinecap:"round"})})}),(0,t.jsx)("h2",{id:"about-title",className:"text-lg font-semibold text-white",children:"What is QuadWork?"}),(0,t.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-neutral-300",children:"QuadWork is a local dashboard that runs a team of 4 AI agents — Head, Dev, and two Reviewers — that code, review, and ship while you sleep."}),(0,t.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-neutral-300",children:"Every task follows a strict GitHub workflow: Issue → Branch → Pull Request → 2 Reviews → Merge. Branch protection ensures no agent can skip the process."}),(0,t.jsx)("h3",{className:"mt-5 text-sm font-semibold text-white",children:"Why QuadWork?"}),(0,t.jsxs)("ul",{className:"mt-2 space-y-1.5 text-sm text-neutral-300",children:[(0,t.jsxs)("li",{children:["🤖 ",(0,t.jsx)("b",{children:"Run 24/7"})," — agents work overnight while you rest"]}),(0,t.jsxs)("li",{children:["🛡️ ",(0,t.jsx)("b",{children:"Always reviewed"})," — every PR needs 2 independent approvals"]}),(0,t.jsxs)("li",{children:["🔒 ",(0,t.jsx)("b",{children:"Local-first"})," — runs entirely on your machine, no data leaves"]}),(0,t.jsxs)("li",{children:["🧰 ",(0,t.jsx)("b",{children:"Bring your own CLI"})," — works with Claude Code, Codex, or both"]}),(0,t.jsxs)("li",{children:["📦 ",(0,t.jsx)("b",{children:"One install"})," — ",(0,t.jsx)("code",{className:"rounded bg-white/5 px-1 py-0.5 text-[12px]",children:"npx quadwork init"})," and you're set"]})]}),(0,t.jsx)("div",{className:"mt-5",children:(0,t.jsx)("a",{href:"https://github.com/realproject7/quadwork",target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-sm text-blue-400 hover:text-blue-300",children:"Read the full docs on GitHub →"})})]})}):null}let s=["sleep.","eat.","enjoy life.","touch grass.","spend time with people.","watch a movie.","take a vacation.","go for a run."],a="quadwork_tagline_animation";function l(e){return!Number.isFinite(e)||e<=0?"0h":e<1?`${(60*e).toFixed(0)}m`:`${e.toFixed(1)}h`}e.s(["default",0,function(){let[e,i]=(0,n.useState)(!1);(0,n.useEffect)(()=>{i(!0)},[]);let[c,u]=(0,n.useState)(!1),[d,f]=(0,n.useState)(null),[h,p]=(0,n.useState)(!1);(0,n.useEffect)(()=>{let e=!1,t=()=>{fetch("/api/activity/stats").then(e=>e.ok?e.json():null).then(t=>{!e&&t&&f(t)}).catch(()=>{})};t();let r=setInterval(t,6e4);return()=>{e=!0,clearInterval(r)}},[]);let[x,m]=(0,n.useState)(!0);(0,n.useEffect)(()=>{try{let e=window.localStorage.getItem(a);"off"===e&&m(!1)}catch{}},[]);let g=function(e,t){let[r,o]=(0,n.useState)(0),[s,a]=(0,n.useState)(""),[l,i]=(0,n.useState)("typing");return(0,n.useEffect)(()=>{let n;if(!t)return;let c=e[r];return"typing"===l?n=s.length<c.length?setTimeout(()=>a(c.slice(0,s.length+1)),70):setTimeout(()=>i("holding"),0):"holding"===l?n=setTimeout(()=>i("deleting"),2e3):s.length>0?n=setTimeout(()=>a(c.slice(0,s.length-1)),35):(o(t=>(t+1)%e.length),i("typing")),()=>clearTimeout(n)},[s,l,r,e,t]),s}(s,x),b=x?g:s[0]||"",[j,v]=(0,n.useState)(!1);(0,n.useEffect)(()=>{if(!x)return void v(!0);let e=setTimeout(()=>v(!0),5e3);return()=>clearTimeout(e)},[x]);let y=(0,n.useRef)(!1);return((0,n.useEffect)(()=>{x&&(g.length>0?y.current=!0:y.current&&v(!0))},[x,g]),e)?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("header",{className:"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",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 min-w-0",children:[(0,t.jsxs)(r.default,{href:"/",className:"flex items-center gap-1.5 text-sm font-bold text-accent hover:text-blue-400 shrink-0",children:[(0,t.jsx)("img",{src:"/icon.svg",alt:"",width:18,height:18,className:"inline-block"}),"QuadWork"]}),(0,t.jsx)("span",{className:"hidden sm:inline text-neutral-600",children:"|"}),(0,t.jsxs)("span",{className:"hidden sm:inline text-[13px] text-neutral-400 truncate",children:["Your AI dev team while you"," ",(0,t.jsx)("span",{className:"text-neutral-200",children:b}),x&&(0,t.jsx)("span",{className:"ml-0.5 inline-block w-[1px] h-[12px] align-middle bg-neutral-400 animate-qw-blink"})]}),j&&(0,t.jsx)("button",{type:"button",onClick:()=>{m(e=>{let t=!e;try{window.localStorage.setItem(a,t?"on":"off")}catch{}return t})},"aria-label":x?"Pause tagline animation":"Resume tagline animation","aria-pressed":x,title:x?"Pause tagline animation":"Resume tagline animation",className:"hidden sm:inline-flex items-center justify-center w-3.5 h-3.5 ml-1 rounded-full border border-white/15 text-neutral-500 hover:text-white hover:border-white/40 transition-colors text-[8px]",children:x?"❚❚":"▶"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-3 shrink-0",children:[d&&(0,t.jsxs)("div",{className:"relative hidden md:flex items-center gap-2 text-[10px] text-neutral-500",onMouseEnter:()=>p(!0),onMouseLeave:()=>p(!1),onFocus:()=>p(!0),onBlur:()=>p(!1),tabIndex:0,children:[(0,t.jsx)("span",{className:"text-neutral-200",children:"Your AI team worked:"}),(0,t.jsxs)("span",{children:["Today ",(0,t.jsx)("span",{className:"text-neutral-200",children:l(d.today)})]}),(0,t.jsx)("span",{className:"text-neutral-700",children:"·"}),(0,t.jsxs)("span",{children:["Week ",(0,t.jsx)("span",{className:"text-neutral-200",children:l(d.week)})]}),(0,t.jsx)("span",{className:"text-neutral-700",children:"·"}),(0,t.jsxs)("span",{children:["Month ",(0,t.jsx)("span",{className:"text-neutral-200",children:l(d.month)})]}),h&&(0,t.jsxs)("div",{className:"absolute top-6 right-0 z-50 min-w-[220px] p-2 text-[10px] leading-snug text-neutral-200 bg-neutral-900 border border-white/15 rounded shadow-lg",children:[(0,t.jsx)("div",{className:"mb-1 text-neutral-400 uppercase tracking-wider text-[9px]",children:"Per project"}),0===Object.entries(d.by_project).length&&(0,t.jsx)("div",{className:"text-neutral-500",children:"No activity logged yet"}),Object.entries(d.by_project).map(([e,r])=>(0,t.jsxs)("div",{className:"flex items-baseline gap-2",children:[(0,t.jsx)("span",{className:"text-neutral-400 truncate flex-1",children:e}),(0,t.jsx)("span",{className:"tabular-nums text-neutral-200",children:l(r.month)}),(0,t.jsx)("span",{className:"text-neutral-600 text-[9px]",children:"/ mo"})]},e)),(0,t.jsxs)("div",{className:"mt-1 pt-1 border-t border-white/10 text-neutral-500",children:["Lifetime: ",(0,t.jsx)("span",{className:"text-neutral-200",children:l(d.total)})]}),(0,t.jsx)("div",{className:"mt-1 pt-1 border-t border-white/10 text-neutral-500 leading-snug",children:"ⓘ Stats are best-effort. Server restarts may undercount in-flight sessions."})]})]}),(0,t.jsx)("button",{type:"button",onClick:()=>u(!0),"aria-label":"About QuadWork",className:"rounded p-1 text-neutral-400 hover:bg-white/5 hover:text-white",children:(0,t.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[(0,t.jsx)("circle",{cx:"10",cy:"10",r:"8"}),(0,t.jsx)("path",{d:"M10 9v5",strokeLinecap:"round"}),(0,t.jsx)("circle",{cx:"10",cy:"6.5",r:"0.8",fill:"currentColor"})]})}),(0,t.jsx)("a",{href:"https://github.com/realproject7/quadwork",target:"_blank",rel:"noopener noreferrer",className:"text-[12px] text-neutral-400 hover:text-white",children:"QuadWork github"})]})]}),(0,t.jsx)(o,{open:c,onClose:()=>u(!1)})]}):(0,t.jsx)("header",{className:"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"})}],26704)},43688,e=>{"use strict";var t=e.i(71645),r=e.i(67449);e.s(["default",0,function(){let e=(0,t.useRef)({}),n=(0,t.useRef)("user"),o=(0,t.useRef)([]),s=(0,t.useRef)(!1),a=(0,t.useRef)(new Set),l=(0,t.useCallback)(t=>{null==e.current[t]&&(e.current[t]=0,a.current.add(t))},[]),i=(0,t.useCallback)(()=>{fetch("/api/config").then(e=>e.ok?e.json():null).then(t=>{if(!t)return;"string"==typeof t.operator_name&&t.operator_name&&(n.current=t.operator_name);let r=t.projects||[];for(let e of(o.current=r,r))l(e.id);let a=new Set(r.map(e=>e.id));for(let t of Object.keys(e.current))a.has(t)||delete e.current[t];s.current=!0}).catch(()=>{})},[l]);(0,t.useEffect)(()=>{i();let e=setInterval(i,3e4);return()=>clearInterval(e)},[i]);let c=(0,t.useCallback)(()=>{if(s.current)for(let t of o.current){let o=e.current[t.id];null!=o&&fetch(`/api/chat?path=/api/messages&channel=general&cursor=${o}&project=${encodeURIComponent(t.id)}`).then(e=>e.ok?e.json():null).then(o=>{if(!o)return;let s=Array.isArray(o)?o:o.messages||[];if(0===s.length)return void a.current.delete(t.id);let l=e.current[t.id]??0,i=Math.max(...s.map(e=>e.id));i>l&&(e.current[t.id]=i);let c=n.current;a.current.has(t.id)?a.current.delete(t.id):s.some(e=>e.id>l&&(void 0===e.type||"chat"===e.type)&&"user"!==e.sender&&e.sender!==c&&"system"!==e.sender)&&(0,r.playNotificationSound)()}).catch(()=>{})}},[]);return(0,t.useEffect)(()=>{let e=setInterval(c,3e3);return()=>clearInterval(e)},[c]),null}])}]);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|