@lucapimenta/copy-chief-dashboard 1.0.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/LICENSE +21 -0
- package/README.md +107 -0
- package/bin/cli.js +48 -0
- package/dashboard/.next/BUILD_ID +1 -0
- package/dashboard/.next/app-build-manifest.json +152 -0
- package/dashboard/.next/app-path-routes-manifest.json +18 -0
- package/dashboard/.next/build-manifest.json +33 -0
- package/dashboard/.next/diagnostics/build-diagnostics.json +6 -0
- package/dashboard/.next/diagnostics/framework.json +1 -0
- package/dashboard/.next/export-detail.json +5 -0
- package/dashboard/.next/export-marker.json +6 -0
- package/dashboard/.next/images-manifest.json +58 -0
- package/dashboard/.next/next-minimal-server.js.nft.json +1 -0
- package/dashboard/.next/next-server.js.nft.json +1 -0
- package/dashboard/.next/package.json +1 -0
- package/dashboard/.next/prerender-manifest.json +397 -0
- package/dashboard/.next/react-loadable-manifest.json +251 -0
- package/dashboard/.next/required-server-files.json +321 -0
- package/dashboard/.next/routes-manifest.json +150 -0
- package/dashboard/.next/server/app/_not-found/page.js +2 -0
- package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/_not-found.html +1 -0
- package/dashboard/.next/server/app/_not-found.meta +8 -0
- package/dashboard/.next/server/app/_not-found.rsc +19 -0
- package/dashboard/.next/server/app/agents/page.js +2 -0
- package/dashboard/.next/server/app/agents/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/agents/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/agents.html +1 -0
- package/dashboard/.next/server/app/agents.meta +7 -0
- package/dashboard/.next/server/app/agents.rsc +23 -0
- package/dashboard/.next/server/app/clickup/page.js +2 -0
- package/dashboard/.next/server/app/clickup/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/clickup/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/clickup.html +1 -0
- package/dashboard/.next/server/app/clickup.meta +7 -0
- package/dashboard/.next/server/app/clickup.rsc +23 -0
- package/dashboard/.next/server/app/context/page.js +2 -0
- package/dashboard/.next/server/app/context/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/context/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/context.html +1 -0
- package/dashboard/.next/server/app/context.meta +7 -0
- package/dashboard/.next/server/app/context.rsc +23 -0
- package/dashboard/.next/server/app/github/page.js +2 -0
- package/dashboard/.next/server/app/github/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/github/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/github.html +1 -0
- package/dashboard/.next/server/app/github.meta +7 -0
- package/dashboard/.next/server/app/github.rsc +23 -0
- package/dashboard/.next/server/app/helix/page.js +2 -0
- package/dashboard/.next/server/app/helix/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/helix/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/helix.html +1 -0
- package/dashboard/.next/server/app/helix.meta +7 -0
- package/dashboard/.next/server/app/helix.rsc +23 -0
- package/dashboard/.next/server/app/index.html +1 -0
- package/dashboard/.next/server/app/index.meta +9 -0
- package/dashboard/.next/server/app/index.rsc +20 -0
- package/dashboard/.next/server/app/insights/page.js +2 -0
- package/dashboard/.next/server/app/insights/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/insights/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/insights.html +1 -0
- package/dashboard/.next/server/app/insights.meta +7 -0
- package/dashboard/.next/server/app/insights.rsc +23 -0
- package/dashboard/.next/server/app/kanban/page.js +2 -0
- package/dashboard/.next/server/app/kanban/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/kanban/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/kanban.html +1 -0
- package/dashboard/.next/server/app/kanban.meta +7 -0
- package/dashboard/.next/server/app/kanban.rsc +23 -0
- package/dashboard/.next/server/app/monitor/page.js +2 -0
- package/dashboard/.next/server/app/monitor/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/monitor/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/monitor.html +1 -0
- package/dashboard/.next/server/app/monitor.meta +7 -0
- package/dashboard/.next/server/app/monitor.rsc +23 -0
- package/dashboard/.next/server/app/page.js +2 -0
- package/dashboard/.next/server/app/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/pipeline/page.js +2 -0
- package/dashboard/.next/server/app/pipeline/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/pipeline/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/pipeline.html +1 -0
- package/dashboard/.next/server/app/pipeline.meta +7 -0
- package/dashboard/.next/server/app/pipeline.rsc +23 -0
- package/dashboard/.next/server/app/roadmap/page.js +2 -0
- package/dashboard/.next/server/app/roadmap/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/roadmap/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/roadmap.html +1 -0
- package/dashboard/.next/server/app/roadmap.meta +7 -0
- package/dashboard/.next/server/app/roadmap.rsc +23 -0
- package/dashboard/.next/server/app/settings/page.js +2 -0
- package/dashboard/.next/server/app/settings/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/settings/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/settings.html +1 -0
- package/dashboard/.next/server/app/settings.meta +7 -0
- package/dashboard/.next/server/app/settings.rsc +23 -0
- package/dashboard/.next/server/app/squad/page.js +2 -0
- package/dashboard/.next/server/app/squad/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/squad/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/squad.html +1 -0
- package/dashboard/.next/server/app/squad.meta +7 -0
- package/dashboard/.next/server/app/squad.rsc +23 -0
- package/dashboard/.next/server/app/terminals/page.js +2 -0
- package/dashboard/.next/server/app/terminals/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/terminals/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/terminals.html +1 -0
- package/dashboard/.next/server/app/terminals.meta +7 -0
- package/dashboard/.next/server/app/terminals.rsc +23 -0
- package/dashboard/.next/server/app/warroom/page.js +2 -0
- package/dashboard/.next/server/app/warroom/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/warroom/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/warroom.html +1 -0
- package/dashboard/.next/server/app/warroom.meta +7 -0
- package/dashboard/.next/server/app/warroom.rsc +23 -0
- package/dashboard/.next/server/app-paths-manifest.json +18 -0
- package/dashboard/.next/server/chunks/1172.js +80 -0
- package/dashboard/.next/server/chunks/1227.js +4 -0
- package/dashboard/.next/server/chunks/1857.js +174 -0
- package/dashboard/.next/server/chunks/1894.js +1 -0
- package/dashboard/.next/server/chunks/1931.js +1 -0
- package/dashboard/.next/server/chunks/2044.js +1 -0
- package/dashboard/.next/server/chunks/228.js +1 -0
- package/dashboard/.next/server/chunks/2327.js +1 -0
- package/dashboard/.next/server/chunks/2348.js +1 -0
- package/dashboard/.next/server/chunks/2482.js +93 -0
- package/dashboard/.next/server/chunks/2624.js +1 -0
- package/dashboard/.next/server/chunks/2694.js +1 -0
- package/dashboard/.next/server/chunks/2839.js +1 -0
- package/dashboard/.next/server/chunks/2884.js +166 -0
- package/dashboard/.next/server/chunks/2942.js +43 -0
- package/dashboard/.next/server/chunks/3133.js +1 -0
- package/dashboard/.next/server/chunks/3442.js +1 -0
- package/dashboard/.next/server/chunks/3706.js +1 -0
- package/dashboard/.next/server/chunks/401.js +24 -0
- package/dashboard/.next/server/chunks/4135.js +36 -0
- package/dashboard/.next/server/chunks/4621.js +148 -0
- package/dashboard/.next/server/chunks/5154.js +5 -0
- package/dashboard/.next/server/chunks/5589.js +131 -0
- package/dashboard/.next/server/chunks/5611.js +6 -0
- package/dashboard/.next/server/chunks/5789.js +59 -0
- package/dashboard/.next/server/chunks/5949.js +1 -0
- package/dashboard/.next/server/chunks/5971.js +136 -0
- package/dashboard/.next/server/chunks/6044.js +1 -0
- package/dashboard/.next/server/chunks/6084.js +56 -0
- package/dashboard/.next/server/chunks/6148.js +201 -0
- package/dashboard/.next/server/chunks/6171.js +215 -0
- package/dashboard/.next/server/chunks/6442.js +62 -0
- package/dashboard/.next/server/chunks/6651.js +24 -0
- package/dashboard/.next/server/chunks/6673.js +262 -0
- package/dashboard/.next/server/chunks/6725.js +30 -0
- package/dashboard/.next/server/chunks/6743.js +1 -0
- package/dashboard/.next/server/chunks/7762.js +63 -0
- package/dashboard/.next/server/chunks/7945.js +1 -0
- package/dashboard/.next/server/chunks/8135.js +55 -0
- package/dashboard/.next/server/chunks/8192.js +1 -0
- package/dashboard/.next/server/chunks/8893.js +1 -0
- package/dashboard/.next/server/chunks/9286.js +29 -0
- package/dashboard/.next/server/chunks/9408.js +1 -0
- package/dashboard/.next/server/chunks/9596.js +1 -0
- package/dashboard/.next/server/chunks/9698.js +1 -0
- package/dashboard/.next/server/functions-config-manifest.json +4 -0
- package/dashboard/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/dashboard/.next/server/middleware-build-manifest.js +1 -0
- package/dashboard/.next/server/middleware-manifest.json +6 -0
- package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/dashboard/.next/server/next-font-manifest.js +1 -0
- package/dashboard/.next/server/next-font-manifest.json +1 -0
- package/dashboard/.next/server/pages/404.html +1 -0
- package/dashboard/.next/server/pages/500.html +1 -0
- package/dashboard/.next/server/pages/_app.js +1 -0
- package/dashboard/.next/server/pages/_app.js.nft.json +1 -0
- package/dashboard/.next/server/pages/_document.js +1 -0
- package/dashboard/.next/server/pages/_document.js.nft.json +1 -0
- package/dashboard/.next/server/pages/_error.js +19 -0
- package/dashboard/.next/server/pages/_error.js.nft.json +1 -0
- package/dashboard/.next/server/pages-manifest.json +6 -0
- package/dashboard/.next/server/server-reference-manifest.js +1 -0
- package/dashboard/.next/server/server-reference-manifest.json +1 -0
- package/dashboard/.next/server/webpack-runtime.js +1 -0
- package/dashboard/.next/static/JK-V08bhbMqDgo-zfSV9W/_buildManifest.js +1 -0
- package/dashboard/.next/static/JK-V08bhbMqDgo-zfSV9W/_ssgManifest.js +1 -0
- package/dashboard/.next/static/chunks/0dbeb660.c36e335de0d55418.js +53 -0
- package/dashboard/.next/static/chunks/1255-f98cc73ffd52f5bb.js +1 -0
- package/dashboard/.next/static/chunks/1345.7503fa6b29b871de.js +1 -0
- package/dashboard/.next/static/chunks/1380.77135630c8daf916.js +1 -0
- package/dashboard/.next/static/chunks/1490.c65d1aaee35b511a.js +1 -0
- package/dashboard/.next/static/chunks/1535.e648a03dbec3ff55.js +1 -0
- package/dashboard/.next/static/chunks/1750.43360397ece68aee.js +1 -0
- package/dashboard/.next/static/chunks/2320.015c7644b9ef5b70.js +93 -0
- package/dashboard/.next/static/chunks/2406.fb5bb75fd84ca1c5.js +1 -0
- package/dashboard/.next/static/chunks/2721.d8ec4517aa6c041e.js +63 -0
- package/dashboard/.next/static/chunks/2cdb6380.d3e32ab6aac21a0f.js +136 -0
- package/dashboard/.next/static/chunks/4093.2f7c452f6f30092f.js +1 -0
- package/dashboard/.next/static/chunks/4101.d9d1dfad9a7aa6e4.js +131 -0
- package/dashboard/.next/static/chunks/4153.5087e1e97addcb59.js +215 -0
- package/dashboard/.next/static/chunks/4243.d4ba4b8b4c2b5488.js +1 -0
- package/dashboard/.next/static/chunks/4290.da9364c5fcc0ecd1.js +80 -0
- package/dashboard/.next/static/chunks/4389.7312708ff9bb8d60.js +55 -0
- package/dashboard/.next/static/chunks/4459.bd1bcf0e75dafac8.js +1 -0
- package/dashboard/.next/static/chunks/461.02ddfe7abf885789.js +29 -0
- package/dashboard/.next/static/chunks/4776.f567801874e66499.js +1 -0
- package/dashboard/.next/static/chunks/4909-60c88923efbb24ad.js +1 -0
- package/dashboard/.next/static/chunks/4bd1b696-100b9d70ed4e49c1.js +1 -0
- package/dashboard/.next/static/chunks/526.47382bf23733427d.js +24 -0
- package/dashboard/.next/static/chunks/5281.51c549f558da3099.js +43 -0
- package/dashboard/.next/static/chunks/535.eb3a1482a7521647.js +1 -0
- package/dashboard/.next/static/chunks/5812.4f235560e1619a56.js +5 -0
- package/dashboard/.next/static/chunks/5836.34303e331382086a.js +1 -0
- package/dashboard/.next/static/chunks/5893.5744824d699de21b.js +1 -0
- package/dashboard/.next/static/chunks/5951.571c036629d38d80.js +1 -0
- package/dashboard/.next/static/chunks/6354.4bb95f70fe5dfbad.js +56 -0
- package/dashboard/.next/static/chunks/6706.f75cf4acecc1d556.js +166 -0
- package/dashboard/.next/static/chunks/6872.4915c5decbc84203.js +1 -0
- package/dashboard/.next/static/chunks/6892-033ce320fd438ed5.js +1 -0
- package/dashboard/.next/static/chunks/7083.da666db6cd05b140.js +174 -0
- package/dashboard/.next/static/chunks/7261.0e4f764520f61be4.js +262 -0
- package/dashboard/.next/static/chunks/7265.9e653a9dc3150886.js +59 -0
- package/dashboard/.next/static/chunks/7485.39ec2b59b81840e9.js +149 -0
- package/dashboard/.next/static/chunks/7557.07bfbf2344395f28.js +1 -0
- package/dashboard/.next/static/chunks/7815-3a3fed50c1f9f4a2.js +1 -0
- package/dashboard/.next/static/chunks/8175.9c76cdfbf4b95839.js +1 -0
- package/dashboard/.next/static/chunks/8433.7279330542021415.js +4 -0
- package/dashboard/.next/static/chunks/8456.8982722099740b7c.js +36 -0
- package/dashboard/.next/static/chunks/8458.4e9954c69b81ff6b.js +1 -0
- package/dashboard/.next/static/chunks/8629-d6d0d6655e6a1604.js +1 -0
- package/dashboard/.next/static/chunks/9014.9410ef55ed975a5b.js +1 -0
- package/dashboard/.next/static/chunks/90542734.c2386877103b1d80.js +1 -0
- package/dashboard/.next/static/chunks/9426.e5022dfcdc340cc9.js +1 -0
- package/dashboard/.next/static/chunks/9764.622ba6fdc3021279.js +24 -0
- package/dashboard/.next/static/chunks/9923.0a91d7c5812d587c.js +62 -0
- package/dashboard/.next/static/chunks/9937.22462c1efb33230c.js +148 -0
- package/dashboard/.next/static/chunks/app/_not-found/page-23c12faf3f32d11f.js +1 -0
- package/dashboard/.next/static/chunks/app/agents/page-897aad6c092db78f.js +1 -0
- package/dashboard/.next/static/chunks/app/clickup/page-4c7f1f73cee0cc1f.js +1 -0
- package/dashboard/.next/static/chunks/app/context/page-2fbe40350b7fbd6f.js +1 -0
- package/dashboard/.next/static/chunks/app/github/page-9d87a13179c596e7.js +1 -0
- package/dashboard/.next/static/chunks/app/helix/page-e152ee5b03cb16dd.js +1 -0
- package/dashboard/.next/static/chunks/app/insights/page-ba6765c3ba1baae9.js +1 -0
- package/dashboard/.next/static/chunks/app/kanban/page-63b90dbe0d4e8d7b.js +1 -0
- package/dashboard/.next/static/chunks/app/layout-bf2c2731f6484537.js +1 -0
- package/dashboard/.next/static/chunks/app/monitor/page-013728f1268859c9.js +1 -0
- package/dashboard/.next/static/chunks/app/page-ff65a92ee2f37737.js +1 -0
- package/dashboard/.next/static/chunks/app/pipeline/page-ff884b97e72ef0dc.js +1 -0
- package/dashboard/.next/static/chunks/app/roadmap/page-317896f93a48bd4d.js +1 -0
- package/dashboard/.next/static/chunks/app/settings/page-8d91e7f22a91e6c4.js +1 -0
- package/dashboard/.next/static/chunks/app/squad/page-3a4655e3c033a342.js +1 -0
- package/dashboard/.next/static/chunks/app/terminals/page-37d6ccad2c306dbc.js +1 -0
- package/dashboard/.next/static/chunks/app/warroom/page-40632273c9071c8e.js +1 -0
- package/dashboard/.next/static/chunks/d3ac728e.7efe4849e689f3b2.js +1 -0
- package/dashboard/.next/static/chunks/framework-a32a2a465584c0bc.js +1 -0
- package/dashboard/.next/static/chunks/main-app-43d91e7eb374bda1.js +1 -0
- package/dashboard/.next/static/chunks/main-b158c42304074eda.js +1 -0
- package/dashboard/.next/static/chunks/pages/_app-4b3fb5e477a0267f.js +1 -0
- package/dashboard/.next/static/chunks/pages/_error-c970d8b55ace1b48.js +1 -0
- package/dashboard/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dashboard/.next/static/chunks/webpack-28cfb0cda54bd302.js +1 -0
- package/dashboard/.next/static/css/edbd0cff8e611a55.css +1 -0
- package/dashboard/.next/trace +4 -0
- package/dashboard/.next/types/app/agents/page.ts +84 -0
- package/dashboard/.next/types/app/clickup/page.ts +84 -0
- package/dashboard/.next/types/app/context/page.ts +84 -0
- package/dashboard/.next/types/app/github/page.ts +84 -0
- package/dashboard/.next/types/app/helix/page.ts +84 -0
- package/dashboard/.next/types/app/insights/page.ts +84 -0
- package/dashboard/.next/types/app/kanban/page.ts +84 -0
- package/dashboard/.next/types/app/monitor/page.ts +84 -0
- package/dashboard/.next/types/app/page.ts +84 -0
- package/dashboard/.next/types/app/pipeline/page.ts +84 -0
- package/dashboard/.next/types/app/roadmap/page.ts +84 -0
- package/dashboard/.next/types/app/settings/page.ts +84 -0
- package/dashboard/.next/types/app/squad/page.ts +84 -0
- package/dashboard/.next/types/app/terminals/page.ts +84 -0
- package/dashboard/.next/types/app/warroom/page.ts +84 -0
- package/dashboard/.next/types/cache-life.d.ts +141 -0
- package/dashboard/.next/types/package.json +1 -0
- package/dashboard/.next/types/routes.d.ts +71 -0
- package/dashboard/.next/types/validator.ts +187 -0
- package/dashboard/next-env.d.ts +6 -0
- package/dashboard/next.config.ts +9 -0
- package/dashboard/out/404/index.html +1 -0
- package/dashboard/out/404.html +1 -0
- package/dashboard/out/_next/static/JK-V08bhbMqDgo-zfSV9W/_buildManifest.js +1 -0
- package/dashboard/out/_next/static/JK-V08bhbMqDgo-zfSV9W/_ssgManifest.js +1 -0
- package/dashboard/out/_next/static/chunks/0dbeb660.c36e335de0d55418.js +53 -0
- package/dashboard/out/_next/static/chunks/1255-f98cc73ffd52f5bb.js +1 -0
- package/dashboard/out/_next/static/chunks/1345.7503fa6b29b871de.js +1 -0
- package/dashboard/out/_next/static/chunks/1380.77135630c8daf916.js +1 -0
- package/dashboard/out/_next/static/chunks/1490.c65d1aaee35b511a.js +1 -0
- package/dashboard/out/_next/static/chunks/1535.e648a03dbec3ff55.js +1 -0
- package/dashboard/out/_next/static/chunks/1750.43360397ece68aee.js +1 -0
- package/dashboard/out/_next/static/chunks/2320.015c7644b9ef5b70.js +93 -0
- package/dashboard/out/_next/static/chunks/2406.fb5bb75fd84ca1c5.js +1 -0
- package/dashboard/out/_next/static/chunks/2721.d8ec4517aa6c041e.js +63 -0
- package/dashboard/out/_next/static/chunks/2cdb6380.d3e32ab6aac21a0f.js +136 -0
- package/dashboard/out/_next/static/chunks/4093.2f7c452f6f30092f.js +1 -0
- package/dashboard/out/_next/static/chunks/4101.d9d1dfad9a7aa6e4.js +131 -0
- package/dashboard/out/_next/static/chunks/4153.5087e1e97addcb59.js +215 -0
- package/dashboard/out/_next/static/chunks/4243.d4ba4b8b4c2b5488.js +1 -0
- package/dashboard/out/_next/static/chunks/4290.da9364c5fcc0ecd1.js +80 -0
- package/dashboard/out/_next/static/chunks/4389.7312708ff9bb8d60.js +55 -0
- package/dashboard/out/_next/static/chunks/4459.bd1bcf0e75dafac8.js +1 -0
- package/dashboard/out/_next/static/chunks/461.02ddfe7abf885789.js +29 -0
- package/dashboard/out/_next/static/chunks/4776.f567801874e66499.js +1 -0
- package/dashboard/out/_next/static/chunks/4909-60c88923efbb24ad.js +1 -0
- package/dashboard/out/_next/static/chunks/4bd1b696-100b9d70ed4e49c1.js +1 -0
- package/dashboard/out/_next/static/chunks/526.47382bf23733427d.js +24 -0
- package/dashboard/out/_next/static/chunks/5281.51c549f558da3099.js +43 -0
- package/dashboard/out/_next/static/chunks/535.eb3a1482a7521647.js +1 -0
- package/dashboard/out/_next/static/chunks/5812.4f235560e1619a56.js +5 -0
- package/dashboard/out/_next/static/chunks/5836.34303e331382086a.js +1 -0
- package/dashboard/out/_next/static/chunks/5893.5744824d699de21b.js +1 -0
- package/dashboard/out/_next/static/chunks/5951.571c036629d38d80.js +1 -0
- package/dashboard/out/_next/static/chunks/6354.4bb95f70fe5dfbad.js +56 -0
- package/dashboard/out/_next/static/chunks/6706.f75cf4acecc1d556.js +166 -0
- package/dashboard/out/_next/static/chunks/6872.4915c5decbc84203.js +1 -0
- package/dashboard/out/_next/static/chunks/6892-033ce320fd438ed5.js +1 -0
- package/dashboard/out/_next/static/chunks/7083.da666db6cd05b140.js +174 -0
- package/dashboard/out/_next/static/chunks/7261.0e4f764520f61be4.js +262 -0
- package/dashboard/out/_next/static/chunks/7265.9e653a9dc3150886.js +59 -0
- package/dashboard/out/_next/static/chunks/7485.39ec2b59b81840e9.js +149 -0
- package/dashboard/out/_next/static/chunks/7557.07bfbf2344395f28.js +1 -0
- package/dashboard/out/_next/static/chunks/7815-3a3fed50c1f9f4a2.js +1 -0
- package/dashboard/out/_next/static/chunks/8175.9c76cdfbf4b95839.js +1 -0
- package/dashboard/out/_next/static/chunks/8433.7279330542021415.js +4 -0
- package/dashboard/out/_next/static/chunks/8456.8982722099740b7c.js +36 -0
- package/dashboard/out/_next/static/chunks/8458.4e9954c69b81ff6b.js +1 -0
- package/dashboard/out/_next/static/chunks/8629-d6d0d6655e6a1604.js +1 -0
- package/dashboard/out/_next/static/chunks/9014.9410ef55ed975a5b.js +1 -0
- package/dashboard/out/_next/static/chunks/90542734.c2386877103b1d80.js +1 -0
- package/dashboard/out/_next/static/chunks/9426.e5022dfcdc340cc9.js +1 -0
- package/dashboard/out/_next/static/chunks/9764.622ba6fdc3021279.js +24 -0
- package/dashboard/out/_next/static/chunks/9923.0a91d7c5812d587c.js +62 -0
- package/dashboard/out/_next/static/chunks/9937.22462c1efb33230c.js +148 -0
- package/dashboard/out/_next/static/chunks/app/_not-found/page-23c12faf3f32d11f.js +1 -0
- package/dashboard/out/_next/static/chunks/app/agents/page-897aad6c092db78f.js +1 -0
- package/dashboard/out/_next/static/chunks/app/clickup/page-4c7f1f73cee0cc1f.js +1 -0
- package/dashboard/out/_next/static/chunks/app/context/page-2fbe40350b7fbd6f.js +1 -0
- package/dashboard/out/_next/static/chunks/app/github/page-9d87a13179c596e7.js +1 -0
- package/dashboard/out/_next/static/chunks/app/helix/page-e152ee5b03cb16dd.js +1 -0
- package/dashboard/out/_next/static/chunks/app/insights/page-ba6765c3ba1baae9.js +1 -0
- package/dashboard/out/_next/static/chunks/app/kanban/page-63b90dbe0d4e8d7b.js +1 -0
- package/dashboard/out/_next/static/chunks/app/layout-bf2c2731f6484537.js +1 -0
- package/dashboard/out/_next/static/chunks/app/monitor/page-013728f1268859c9.js +1 -0
- package/dashboard/out/_next/static/chunks/app/page-ff65a92ee2f37737.js +1 -0
- package/dashboard/out/_next/static/chunks/app/pipeline/page-ff884b97e72ef0dc.js +1 -0
- package/dashboard/out/_next/static/chunks/app/roadmap/page-317896f93a48bd4d.js +1 -0
- package/dashboard/out/_next/static/chunks/app/settings/page-8d91e7f22a91e6c4.js +1 -0
- package/dashboard/out/_next/static/chunks/app/squad/page-3a4655e3c033a342.js +1 -0
- package/dashboard/out/_next/static/chunks/app/terminals/page-37d6ccad2c306dbc.js +1 -0
- package/dashboard/out/_next/static/chunks/app/warroom/page-40632273c9071c8e.js +1 -0
- package/dashboard/out/_next/static/chunks/d3ac728e.7efe4849e689f3b2.js +1 -0
- package/dashboard/out/_next/static/chunks/framework-a32a2a465584c0bc.js +1 -0
- package/dashboard/out/_next/static/chunks/main-app-43d91e7eb374bda1.js +1 -0
- package/dashboard/out/_next/static/chunks/main-b158c42304074eda.js +1 -0
- package/dashboard/out/_next/static/chunks/pages/_app-4b3fb5e477a0267f.js +1 -0
- package/dashboard/out/_next/static/chunks/pages/_error-c970d8b55ace1b48.js +1 -0
- package/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dashboard/out/_next/static/chunks/webpack-28cfb0cda54bd302.js +1 -0
- package/dashboard/out/_next/static/css/edbd0cff8e611a55.css +1 -0
- package/dashboard/out/agents/index.html +1 -0
- package/dashboard/out/agents/index.txt +23 -0
- package/dashboard/out/clickup/index.html +1 -0
- package/dashboard/out/clickup/index.txt +23 -0
- package/dashboard/out/context/index.html +1 -0
- package/dashboard/out/context/index.txt +23 -0
- package/dashboard/out/github/index.html +1 -0
- package/dashboard/out/github/index.txt +23 -0
- package/dashboard/out/helix/index.html +1 -0
- package/dashboard/out/helix/index.txt +23 -0
- package/dashboard/out/index.html +1 -0
- package/dashboard/out/index.txt +20 -0
- package/dashboard/out/insights/index.html +1 -0
- package/dashboard/out/insights/index.txt +23 -0
- package/dashboard/out/kanban/index.html +1 -0
- package/dashboard/out/kanban/index.txt +23 -0
- package/dashboard/out/monitor/index.html +1 -0
- package/dashboard/out/monitor/index.txt +23 -0
- package/dashboard/out/pipeline/index.html +1 -0
- package/dashboard/out/pipeline/index.txt +23 -0
- package/dashboard/out/roadmap/index.html +1 -0
- package/dashboard/out/roadmap/index.txt +23 -0
- package/dashboard/out/settings/index.html +1 -0
- package/dashboard/out/settings/index.txt +23 -0
- package/dashboard/out/squad/index.html +1 -0
- package/dashboard/out/squad/index.txt +23 -0
- package/dashboard/out/terminals/index.html +1 -0
- package/dashboard/out/terminals/index.txt +23 -0
- package/dashboard/out/warroom/index.html +1 -0
- package/dashboard/out/warroom/index.txt +23 -0
- package/dashboard/package-lock.json +3042 -0
- package/dashboard/package.json +33 -0
- package/dashboard/postcss.config.mjs +6 -0
- package/dashboard/src/app/agents/page.tsx +175 -0
- package/dashboard/src/app/clickup/page.tsx +237 -0
- package/dashboard/src/app/context/page.tsx +42 -0
- package/dashboard/src/app/github/page.tsx +27 -0
- package/dashboard/src/app/globals.css +259 -0
- package/dashboard/src/app/helix/page.tsx +101 -0
- package/dashboard/src/app/insights/page.tsx +124 -0
- package/dashboard/src/app/kanban/page.tsx +68 -0
- package/dashboard/src/app/layout.tsx +36 -0
- package/dashboard/src/app/monitor/page.tsx +96 -0
- package/dashboard/src/app/page.tsx +5 -0
- package/dashboard/src/app/pipeline/page.tsx +329 -0
- package/dashboard/src/app/roadmap/page.tsx +94 -0
- package/dashboard/src/app/settings/page.tsx +111 -0
- package/dashboard/src/app/squad/page.tsx +101 -0
- package/dashboard/src/app/terminals/page.tsx +82 -0
- package/dashboard/src/app/warroom/page.tsx +108 -0
- package/dashboard/src/components/agents/AgentCard.tsx +68 -0
- package/dashboard/src/components/agents/AgentGrid.tsx +51 -0
- package/dashboard/src/components/clickup/PendingBadge.tsx +26 -0
- package/dashboard/src/components/clickup/SyncExecutor.tsx +103 -0
- package/dashboard/src/components/context/ContextPanel.tsx +75 -0
- package/dashboard/src/components/context/McpStatus.tsx +29 -0
- package/dashboard/src/components/context/RulesTree.tsx +48 -0
- package/dashboard/src/components/github/GitHubPanel.tsx +154 -0
- package/dashboard/src/components/helix/HELIXMermaid.tsx +90 -0
- package/dashboard/src/components/helix/HELIXPipelinePanel.tsx +247 -0
- package/dashboard/src/components/helix/PhaseDetail.tsx +92 -0
- package/dashboard/src/components/insights/JourneysSection.tsx +83 -0
- package/dashboard/src/components/insights/MetricsSummary.tsx +87 -0
- package/dashboard/src/components/insights/PatternsSection.tsx +64 -0
- package/dashboard/src/components/insights/Sparkline.tsx +113 -0
- package/dashboard/src/components/insights/StatsOverview.tsx +133 -0
- package/dashboard/src/components/kanban/DnDKanbanBoard.tsx +166 -0
- package/dashboard/src/components/kanban/DroppableColumn.tsx +42 -0
- package/dashboard/src/components/kanban/KanbanColumn.tsx +46 -0
- package/dashboard/src/components/kanban/OfferCard.tsx +223 -0
- package/dashboard/src/components/kanban/SortableOfferCard.tsx +33 -0
- package/dashboard/src/components/layout/KeyboardShortcuts.tsx +8 -0
- package/dashboard/src/components/layout/Providers.tsx +41 -0
- package/dashboard/src/components/layout/Sidebar.tsx +91 -0
- package/dashboard/src/components/layout/StatusBar.tsx +54 -0
- package/dashboard/src/components/mermaidcn/mermaid.tsx +125 -0
- package/dashboard/src/components/monitor/ActivityFeed.tsx +115 -0
- package/dashboard/src/components/monitor/CurrentToolIndicator.tsx +66 -0
- package/dashboard/src/components/monitor/SessionsList.tsx +248 -0
- package/dashboard/src/components/monitor/SynapseWidget.tsx +61 -0
- package/dashboard/src/components/pipeline/PipelineStagePills.tsx +68 -0
- package/dashboard/src/components/squad/ExpertCard.tsx +81 -0
- package/dashboard/src/components/squad/ExpertDetail.tsx +120 -0
- package/dashboard/src/components/squad/SquadGrid.tsx +40 -0
- package/dashboard/src/components/terminals/TerminalGrid.tsx +54 -0
- package/dashboard/src/components/terminals/TerminalPanel.tsx +69 -0
- package/dashboard/src/components/ui/badge.tsx +32 -0
- package/dashboard/src/components/ui/error-boundary.tsx +47 -0
- package/dashboard/src/components/ui/progress-bar.tsx +45 -0
- package/dashboard/src/components/ui/score-badge.tsx +20 -0
- package/dashboard/src/components/ui/status-indicator.tsx +25 -0
- package/dashboard/src/components/ui/toast.tsx +77 -0
- package/dashboard/src/components/warroom/TaskKanbanBoard.tsx +149 -0
- package/dashboard/src/components/warroom/WarRoomActivityFeed.tsx +187 -0
- package/dashboard/src/components/warroom/WarRoomAgentStrip.tsx +68 -0
- package/dashboard/src/hooks/use-agents.ts +25 -0
- package/dashboard/src/hooks/use-context.ts +16 -0
- package/dashboard/src/hooks/use-dispatch-queue.ts +38 -0
- package/dashboard/src/hooks/use-github.ts +27 -0
- package/dashboard/src/hooks/use-helix.ts +39 -0
- package/dashboard/src/hooks/use-keyboard-shortcuts.ts +43 -0
- package/dashboard/src/hooks/use-metrics.ts +35 -0
- package/dashboard/src/hooks/use-monitor-events.ts +122 -0
- package/dashboard/src/hooks/use-offers.ts +36 -0
- package/dashboard/src/hooks/use-warroom.ts +103 -0
- package/dashboard/src/hooks/useSSE.ts +122 -0
- package/dashboard/src/lib/mermaid-themes.ts +41 -0
- package/dashboard/src/lib/nicho-colors.ts +10 -0
- package/dashboard/src/lib/persona-colors.ts +16 -0
- package/dashboard/src/lib/utils.ts +48 -0
- package/dashboard/src/stores/agent-store.ts +27 -0
- package/dashboard/src/stores/clickup-store.ts +101 -0
- package/dashboard/src/stores/dispatch-store.ts +40 -0
- package/dashboard/src/stores/helix-store.ts +43 -0
- package/dashboard/src/stores/monitor-store.ts +106 -0
- package/dashboard/src/stores/offer-store.ts +119 -0
- package/dashboard/src/stores/settings-store.ts +29 -0
- package/dashboard/src/stores/terminal-store.ts +44 -0
- package/dashboard/src/stores/ui-store.ts +21 -0
- package/dashboard/src/stores/warroom-store.ts +39 -0
- package/dashboard/tsconfig.json +41 -0
- package/dashboard/tsconfig.tsbuildinfo +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { cn } from '@/lib/utils';
|
|
6
|
+
import { formatRelativeTime } from '@/lib/utils';
|
|
7
|
+
import { getNichoColor } from '@/lib/nicho-colors';
|
|
8
|
+
import { Badge } from '@/components/ui/badge';
|
|
9
|
+
import { ScoreBadge } from '@/components/ui/score-badge';
|
|
10
|
+
import { useOfferStore, type OfferStatus } from '@/stores/offer-store';
|
|
11
|
+
import { useDispatchStore } from '@/stores/dispatch-store';
|
|
12
|
+
|
|
13
|
+
const MECANISMO_ICONS: Record<string, { icon: string; label: string }> = {
|
|
14
|
+
UNDEFINED: { icon: '○', label: 'Undefined' },
|
|
15
|
+
DRAFT: { icon: '✎', label: 'Draft' },
|
|
16
|
+
PENDING_VALIDATION: { icon: '◔', label: 'Pending' },
|
|
17
|
+
VALIDATED: { icon: '✓', label: 'Validated' },
|
|
18
|
+
APPROVED: { icon: '✓✓', label: 'Approved' },
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const DELIVERABLE_LABELS: Record<string, string> = {
|
|
22
|
+
vsl: 'VSL',
|
|
23
|
+
lp: 'LP',
|
|
24
|
+
criativos: 'ADS',
|
|
25
|
+
emails: 'EM',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
interface OfferCardProps {
|
|
29
|
+
offer: OfferStatus;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const AGENT_COLORS: Record<string, string> = {
|
|
33
|
+
helix: '#FFD700', vox: '#10B981', atlas: '#3B82F6', blade: '#EF4444',
|
|
34
|
+
hawk: '#F59E0B', scout: '#06B6D4', forge: '#8B5CF6', echo: '#EC4899',
|
|
35
|
+
cipher: '#14B8A6', sentinel: '#E8ECF4', ops: '#78716C', strategist: '#D97706',
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const STATUS_DOT: Record<string, string> = {
|
|
39
|
+
pending: 'bg-yellow-500',
|
|
40
|
+
dispatched: 'bg-blue-500',
|
|
41
|
+
completed: 'bg-emerald-500',
|
|
42
|
+
failed: 'bg-red-500',
|
|
43
|
+
skipped: 'bg-gray-500',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export function OfferCard({ offer }: OfferCardProps) {
|
|
47
|
+
const { selectedOffer, selectOffer } = useOfferStore();
|
|
48
|
+
const [tasksExpanded, setTasksExpanded] = useState(false);
|
|
49
|
+
const dispatchEntries = useDispatchStore((s) => s.entries);
|
|
50
|
+
const offerSlug = `${offer.nicho}/${offer.name}`;
|
|
51
|
+
const offerTasks = dispatchEntries.filter((e) => e.offer === offerSlug);
|
|
52
|
+
const isSelected = selectedOffer === offerSlug;
|
|
53
|
+
const mec = MECANISMO_ICONS[offer.mecanismo_state] || MECANISMO_ICONS.UNDEFINED;
|
|
54
|
+
const nichoColor = getNichoColor(offer.nicho);
|
|
55
|
+
const isActive = !!offer.active_agent;
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<div
|
|
59
|
+
onClick={() => selectOffer(`${offer.nicho}/${offer.name}`)}
|
|
60
|
+
className={cn(
|
|
61
|
+
'p-3 rounded border cursor-pointer transition-all relative',
|
|
62
|
+
isSelected
|
|
63
|
+
? 'border-[var(--hud-accent)] bg-[var(--hud-accent)]/5 shadow-[0_0_8px_var(--hud-accent-dim)]'
|
|
64
|
+
: 'border-[var(--hud-border)] bg-[var(--hud-surface)] hover:border-[var(--hud-text-dim)]'
|
|
65
|
+
)}
|
|
66
|
+
>
|
|
67
|
+
{/* Active pulse indicator */}
|
|
68
|
+
{isActive && (
|
|
69
|
+
<span className="absolute top-2 right-2 flex h-2 w-2">
|
|
70
|
+
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75" />
|
|
71
|
+
<span className="relative inline-flex rounded-full h-2 w-2 bg-emerald-500" />
|
|
72
|
+
</span>
|
|
73
|
+
)}
|
|
74
|
+
|
|
75
|
+
<div className="flex items-start justify-between mb-2">
|
|
76
|
+
<h3 className="text-sm font-mono text-[var(--hud-text)] leading-tight">
|
|
77
|
+
{offer.name}
|
|
78
|
+
</h3>
|
|
79
|
+
<span className={cn('px-1.5 py-0.5 rounded text-[9px] font-mono font-bold border', nichoColor.bg, nichoColor.border, nichoColor.text)}>
|
|
80
|
+
{offer.nicho}
|
|
81
|
+
</span>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div className="flex items-center gap-2 mb-2">
|
|
85
|
+
<span className="text-[10px] font-mono text-[var(--hud-text-dim)]">MEC:</span>
|
|
86
|
+
<Badge
|
|
87
|
+
variant={
|
|
88
|
+
offer.mecanismo_state === 'APPROVED' ? 'passed' :
|
|
89
|
+
offer.mecanismo_state === 'VALIDATED' ? 'passed' :
|
|
90
|
+
offer.mecanismo_state === 'DRAFT' ? 'active' : 'pending'
|
|
91
|
+
}
|
|
92
|
+
>
|
|
93
|
+
{mec.icon} {mec.label}
|
|
94
|
+
</Badge>
|
|
95
|
+
</div>
|
|
96
|
+
|
|
97
|
+
{/* Deliverables breakdown */}
|
|
98
|
+
{offer.deliverables && offer.production_count > 0 && (
|
|
99
|
+
<div className="flex items-center gap-1.5 mb-2">
|
|
100
|
+
{Object.entries(offer.deliverables).map(([key, count]) => (
|
|
101
|
+
count > 0 && (
|
|
102
|
+
<span
|
|
103
|
+
key={key}
|
|
104
|
+
className="text-[9px] font-mono px-1.5 py-0.5 rounded bg-[var(--hud-bg)] border border-[var(--hud-border)] text-[var(--hud-text-dim)]"
|
|
105
|
+
>
|
|
106
|
+
{DELIVERABLE_LABELS[key] || key}:{count}
|
|
107
|
+
</span>
|
|
108
|
+
)
|
|
109
|
+
))}
|
|
110
|
+
</div>
|
|
111
|
+
)}
|
|
112
|
+
|
|
113
|
+
{/* Active agent */}
|
|
114
|
+
{isActive && (
|
|
115
|
+
<div className="flex items-center gap-1.5 mb-2">
|
|
116
|
+
<span className="text-[9px] font-mono text-emerald-400">
|
|
117
|
+
{offer.active_agent} working
|
|
118
|
+
</span>
|
|
119
|
+
{offer.last_activity && (
|
|
120
|
+
<span className="text-[9px] font-mono text-[var(--hud-text-dim)]">
|
|
121
|
+
{formatRelativeTime(offer.last_activity)}
|
|
122
|
+
</span>
|
|
123
|
+
)}
|
|
124
|
+
</div>
|
|
125
|
+
)}
|
|
126
|
+
|
|
127
|
+
<div className="flex items-center justify-between">
|
|
128
|
+
<span className="text-[10px] font-mono text-[var(--hud-text-dim)]">
|
|
129
|
+
{offer.production_count} produced
|
|
130
|
+
</span>
|
|
131
|
+
{offer.avg_quality > 0 && (
|
|
132
|
+
<ScoreBadge score={offer.avg_quality} label="Q:" />
|
|
133
|
+
)}
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
{/* RMBC mini-bars */}
|
|
137
|
+
{offer.rmbc && Object.keys(offer.rmbc).length > 0 && (
|
|
138
|
+
<div className="mt-2 pt-2 border-t border-[var(--hud-border)]">
|
|
139
|
+
<p className="text-[9px] font-mono text-[var(--hud-text-dim)] mb-1 uppercase tracking-wider">RMBC</p>
|
|
140
|
+
<div className="space-y-1">
|
|
141
|
+
{(['digerivel', 'unico', 'provavel', 'conectado'] as const).map((key) => {
|
|
142
|
+
const val = offer.rmbc?.[key];
|
|
143
|
+
if (val === undefined) return null;
|
|
144
|
+
return (
|
|
145
|
+
<div key={key} className="flex items-center gap-1.5">
|
|
146
|
+
<span className="text-[8px] font-mono text-[var(--hud-text-dim)] w-[14px]">
|
|
147
|
+
{key[0].toUpperCase()}
|
|
148
|
+
</span>
|
|
149
|
+
<div className="flex-1 h-1 bg-[var(--hud-bg)] rounded-full overflow-hidden">
|
|
150
|
+
<div
|
|
151
|
+
className={cn(
|
|
152
|
+
'h-full rounded-full',
|
|
153
|
+
val >= 8 ? 'bg-emerald-500' : val >= 7 ? 'bg-amber-500' : 'bg-red-500'
|
|
154
|
+
)}
|
|
155
|
+
style={{ width: `${(val / 10) * 100}%` }}
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
<span className="text-[8px] font-mono text-[var(--hud-text-dim)] w-3 text-right">{val}</span>
|
|
159
|
+
</div>
|
|
160
|
+
);
|
|
161
|
+
})}
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
)}
|
|
165
|
+
|
|
166
|
+
{/* Quality scores */}
|
|
167
|
+
{(offer.blind_critic_score || offer.est_score) && (
|
|
168
|
+
<div className="mt-1.5 flex gap-2">
|
|
169
|
+
{offer.blind_critic_score !== undefined && (
|
|
170
|
+
<span className={cn(
|
|
171
|
+
'text-[9px] font-mono',
|
|
172
|
+
offer.blind_critic_score >= 8 ? 'text-emerald-400' : offer.blind_critic_score >= 7 ? 'text-amber-400' : 'text-red-400'
|
|
173
|
+
)}>
|
|
174
|
+
BC:{offer.blind_critic_score}
|
|
175
|
+
</span>
|
|
176
|
+
)}
|
|
177
|
+
{offer.est_score !== undefined && (
|
|
178
|
+
<span className={cn(
|
|
179
|
+
'text-[9px] font-mono',
|
|
180
|
+
offer.est_score >= 8 ? 'text-emerald-400' : offer.est_score >= 7 ? 'text-amber-400' : 'text-red-400'
|
|
181
|
+
)}>
|
|
182
|
+
EST:{offer.est_score}
|
|
183
|
+
</span>
|
|
184
|
+
)}
|
|
185
|
+
</div>
|
|
186
|
+
)}
|
|
187
|
+
|
|
188
|
+
{/* Dispatch Tasks (expandable) */}
|
|
189
|
+
{offerTasks.length > 0 && (
|
|
190
|
+
<div className="mt-2 pt-2 border-t border-[var(--hud-border)]">
|
|
191
|
+
<button
|
|
192
|
+
onClick={(e) => { e.stopPropagation(); setTasksExpanded(!tasksExpanded); }}
|
|
193
|
+
className="flex items-center gap-1 text-[9px] font-mono text-[var(--hud-text-dim)] hover:text-[var(--hud-text)] w-full"
|
|
194
|
+
>
|
|
195
|
+
{tasksExpanded ? <ChevronDown size={10} /> : <ChevronRight size={10} />}
|
|
196
|
+
<span className="uppercase tracking-wider">{offerTasks.length} tasks</span>
|
|
197
|
+
</button>
|
|
198
|
+
{tasksExpanded && (
|
|
199
|
+
<div className="mt-1 space-y-1">
|
|
200
|
+
{offerTasks.slice(0, 8).map((task) => (
|
|
201
|
+
<div key={task.id} className="flex items-center gap-1.5 text-[9px] font-mono">
|
|
202
|
+
<span
|
|
203
|
+
className="w-3 h-3 rounded-full shrink-0 flex items-center justify-center text-[6px] font-bold text-black"
|
|
204
|
+
style={{ backgroundColor: AGENT_COLORS[task.agent_id.toLowerCase()] || '#6B7280' }}
|
|
205
|
+
>
|
|
206
|
+
{task.agent_id[0]?.toUpperCase()}
|
|
207
|
+
</span>
|
|
208
|
+
<span className="truncate flex-1 text-[var(--hud-text)]">
|
|
209
|
+
{task.task_summary || 'No description'}
|
|
210
|
+
</span>
|
|
211
|
+
<span className={cn('w-1.5 h-1.5 rounded-full shrink-0', STATUS_DOT[task.status] || 'bg-gray-500')} />
|
|
212
|
+
</div>
|
|
213
|
+
))}
|
|
214
|
+
{offerTasks.length > 8 && (
|
|
215
|
+
<p className="text-[8px] text-[var(--hud-text-dim)]">+{offerTasks.length - 8} more</p>
|
|
216
|
+
)}
|
|
217
|
+
</div>
|
|
218
|
+
)}
|
|
219
|
+
</div>
|
|
220
|
+
)}
|
|
221
|
+
</div>
|
|
222
|
+
);
|
|
223
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useSortable } from '@dnd-kit/sortable';
|
|
4
|
+
import { CSS } from '@dnd-kit/utilities';
|
|
5
|
+
import { OfferCard } from './OfferCard';
|
|
6
|
+
import type { OfferStatus } from '@/stores/offer-store';
|
|
7
|
+
|
|
8
|
+
interface SortableOfferCardProps {
|
|
9
|
+
offer: OfferStatus;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function SortableOfferCard({ offer }: SortableOfferCardProps) {
|
|
13
|
+
const {
|
|
14
|
+
attributes,
|
|
15
|
+
listeners,
|
|
16
|
+
setNodeRef,
|
|
17
|
+
transform,
|
|
18
|
+
transition,
|
|
19
|
+
isDragging,
|
|
20
|
+
} = useSortable({ id: `${offer.nicho}/${offer.name}` });
|
|
21
|
+
|
|
22
|
+
const style = {
|
|
23
|
+
transform: CSS.Transform.toString(transform),
|
|
24
|
+
transition,
|
|
25
|
+
opacity: isDragging ? 0.5 : 1,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<div ref={setNodeRef} style={style} {...attributes} {...listeners}>
|
|
30
|
+
<OfferCard offer={offer} />
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useOffers } from '@/hooks/use-offers';
|
|
4
|
+
import { useMonitorEvents } from '@/hooks/use-monitor-events';
|
|
5
|
+
import { useOfferStore } from '@/stores/offer-store';
|
|
6
|
+
import { useHelixStore } from '@/stores/helix-store';
|
|
7
|
+
import { useEffect } from 'react';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Global data providers — initialized once in the root layout.
|
|
11
|
+
* - Loads offers from /offers API (refreshes every 30s)
|
|
12
|
+
* - Connects WebSocket for live events (always-on)
|
|
13
|
+
* - Syncs selectedOffer phase to helixStore.currentPhase
|
|
14
|
+
*/
|
|
15
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
16
|
+
// Always fetch offers globally (populates offer-store)
|
|
17
|
+
useOffers();
|
|
18
|
+
|
|
19
|
+
// Always connect WebSocket globally (populates monitor-store)
|
|
20
|
+
useMonitorEvents();
|
|
21
|
+
|
|
22
|
+
// Sync selected offer's phase to helix store for StatusBar display
|
|
23
|
+
const selectedOffer = useOfferStore((s) => s.selectedOffer);
|
|
24
|
+
const offers = useOfferStore((s) => s.offers);
|
|
25
|
+
const setCurrentPhase = useHelixStore((s) => s.setCurrentPhase);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (selectedOffer && offers.length > 0) {
|
|
29
|
+
const match = offers.find(
|
|
30
|
+
(o) => `${o.nicho}/${o.name}` === selectedOffer
|
|
31
|
+
);
|
|
32
|
+
if (match) {
|
|
33
|
+
setCurrentPhase(match.phase.toUpperCase());
|
|
34
|
+
}
|
|
35
|
+
} else if (!selectedOffer) {
|
|
36
|
+
setCurrentPhase('IDLE');
|
|
37
|
+
}
|
|
38
|
+
}, [selectedOffer, offers, setCurrentPhase]);
|
|
39
|
+
|
|
40
|
+
return <>{children}</>;
|
|
41
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
import { usePathname } from 'next/navigation';
|
|
5
|
+
import {
|
|
6
|
+
Activity, Columns3, GitBranch, Users, TrendingUp, Play, Link2,
|
|
7
|
+
Bot, Terminal, FileCode, Settings, Github, Map, Shield,
|
|
8
|
+
PanelLeftClose, PanelLeft,
|
|
9
|
+
} from 'lucide-react';
|
|
10
|
+
import { useUIStore } from '@/stores/ui-store';
|
|
11
|
+
import { cn } from '@/lib/utils';
|
|
12
|
+
import { PendingBadge } from '@/components/clickup/PendingBadge';
|
|
13
|
+
|
|
14
|
+
const NAV_ITEMS = [
|
|
15
|
+
{ href: '/warroom', label: 'War Room', icon: Shield },
|
|
16
|
+
{ href: '/monitor', label: 'Monitor', icon: Activity },
|
|
17
|
+
{ href: '/kanban', label: 'Kanban', icon: Columns3 },
|
|
18
|
+
{ href: '/agents', label: 'Agents', icon: Bot },
|
|
19
|
+
{ href: '/terminals', label: 'Terminals', icon: Terminal },
|
|
20
|
+
{ href: '/helix', label: 'HELIX', icon: GitBranch },
|
|
21
|
+
{ href: '/pipeline', label: 'Pipeline', icon: Play },
|
|
22
|
+
{ href: '/context', label: 'Context', icon: FileCode },
|
|
23
|
+
{ href: '/squad', label: 'Squad', icon: Users },
|
|
24
|
+
{ href: '/insights', label: 'Insights', icon: TrendingUp },
|
|
25
|
+
{ href: '/github', label: 'GitHub', icon: Github },
|
|
26
|
+
{ href: '/roadmap', label: 'Roadmap', icon: Map },
|
|
27
|
+
{ href: '/clickup', label: 'ClickUp', icon: Link2 },
|
|
28
|
+
{ href: '/settings', label: 'Settings', icon: Settings },
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
export function Sidebar() {
|
|
32
|
+
const pathname = usePathname();
|
|
33
|
+
const { sidebarCollapsed, toggleSidebar } = useUIStore();
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<aside
|
|
37
|
+
className={cn(
|
|
38
|
+
'flex flex-col border-r border-[var(--hud-border)] bg-[var(--hud-bg)] transition-all duration-200',
|
|
39
|
+
sidebarCollapsed ? 'w-16' : 'w-52'
|
|
40
|
+
)}
|
|
41
|
+
>
|
|
42
|
+
<div className="flex items-center justify-between px-3 py-4 border-b border-[var(--hud-border)]">
|
|
43
|
+
{!sidebarCollapsed && (
|
|
44
|
+
<span className="text-xs font-mono text-[var(--hud-accent)] tracking-widest uppercase">
|
|
45
|
+
Copy Chief
|
|
46
|
+
</span>
|
|
47
|
+
)}
|
|
48
|
+
<button
|
|
49
|
+
onClick={toggleSidebar}
|
|
50
|
+
className="p-1.5 rounded hover:bg-[var(--hud-surface)] text-[var(--hud-text-dim)] hover:text-[var(--hud-text)]"
|
|
51
|
+
>
|
|
52
|
+
{sidebarCollapsed ? <PanelLeft size={16} /> : <PanelLeftClose size={16} />}
|
|
53
|
+
</button>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<nav className="flex-1 py-2 overflow-y-auto">
|
|
57
|
+
{NAV_ITEMS.map(({ href, label, icon: Icon }) => {
|
|
58
|
+
const active = pathname === href;
|
|
59
|
+
return (
|
|
60
|
+
<Link
|
|
61
|
+
key={href}
|
|
62
|
+
href={href}
|
|
63
|
+
className={cn(
|
|
64
|
+
'flex items-center gap-3 px-4 py-2 text-sm font-mono transition-colors',
|
|
65
|
+
active
|
|
66
|
+
? 'text-[var(--hud-accent)] bg-[var(--hud-accent)]/10 border-r-2 border-[var(--hud-accent)]'
|
|
67
|
+
: 'text-[var(--hud-text-dim)] hover:text-[var(--hud-text)] hover:bg-[var(--hud-surface)]'
|
|
68
|
+
)}
|
|
69
|
+
>
|
|
70
|
+
<Icon size={16} />
|
|
71
|
+
{!sidebarCollapsed && (
|
|
72
|
+
<span className="flex items-center gap-2">
|
|
73
|
+
{label}
|
|
74
|
+
{label === 'ClickUp' && <PendingBadge />}
|
|
75
|
+
</span>
|
|
76
|
+
)}
|
|
77
|
+
</Link>
|
|
78
|
+
);
|
|
79
|
+
})}
|
|
80
|
+
</nav>
|
|
81
|
+
|
|
82
|
+
<div className="px-3 py-3 border-t border-[var(--hud-border)]">
|
|
83
|
+
{!sidebarCollapsed && (
|
|
84
|
+
<p className="text-[10px] font-mono text-[var(--hud-text-dim)] opacity-50">
|
|
85
|
+
BLACK v10.5
|
|
86
|
+
</p>
|
|
87
|
+
)}
|
|
88
|
+
</div>
|
|
89
|
+
</aside>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Circle } from 'lucide-react';
|
|
4
|
+
import { useOfferStore } from '@/stores/offer-store';
|
|
5
|
+
import { useHelixStore } from '@/stores/helix-store';
|
|
6
|
+
import { useMonitorStore } from '@/stores/monitor-store';
|
|
7
|
+
import { CurrentToolIndicator } from '@/components/monitor/CurrentToolIndicator';
|
|
8
|
+
import { cn, formatRelativeTime } from '@/lib/utils';
|
|
9
|
+
|
|
10
|
+
export function StatusBar() {
|
|
11
|
+
const selectedOffer = useOfferStore((s) => s.selectedOffer);
|
|
12
|
+
const currentPhase = useHelixStore((s) => s.currentPhase);
|
|
13
|
+
const connected = useMonitorStore((s) => s.connected);
|
|
14
|
+
const events = useMonitorStore((s) => s.events);
|
|
15
|
+
const lastEvent = events[0];
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<header className="flex items-center justify-between px-4 py-2 border-b border-[var(--hud-border)] bg-[var(--hud-bg)]">
|
|
19
|
+
<div className="flex items-center gap-4">
|
|
20
|
+
<span className="text-xs font-mono text-[var(--hud-text-dim)]">
|
|
21
|
+
OFFER:{' '}
|
|
22
|
+
<span className="text-[var(--hud-text)]">
|
|
23
|
+
{selectedOffer || 'none'}
|
|
24
|
+
</span>
|
|
25
|
+
</span>
|
|
26
|
+
<span className="text-xs font-mono text-[var(--hud-text-dim)]">
|
|
27
|
+
PHASE:{' '}
|
|
28
|
+
<span className="text-[var(--hud-accent)]">{currentPhase}</span>
|
|
29
|
+
</span>
|
|
30
|
+
<CurrentToolIndicator />
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div className="flex items-center gap-4">
|
|
34
|
+
{lastEvent && (
|
|
35
|
+
<span className="text-[10px] font-mono text-[var(--hud-text-dim)]">
|
|
36
|
+
Last: {formatRelativeTime(lastEvent.timestamp)}
|
|
37
|
+
</span>
|
|
38
|
+
)}
|
|
39
|
+
<div className="flex items-center gap-1.5">
|
|
40
|
+
<Circle
|
|
41
|
+
size={8}
|
|
42
|
+
className={cn(
|
|
43
|
+
'fill-current',
|
|
44
|
+
connected ? 'text-emerald-400' : 'text-red-400'
|
|
45
|
+
)}
|
|
46
|
+
/>
|
|
47
|
+
<span className="text-[10px] font-mono text-[var(--hud-text-dim)]">
|
|
48
|
+
{connected ? 'LIVE' : 'OFFLINE'}
|
|
49
|
+
</span>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</header>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "@/lib/utils";
|
|
5
|
+
import { mermaidThemes, type MermaidCustomTheme } from "@/lib/mermaid-themes";
|
|
6
|
+
|
|
7
|
+
export type MermaidBuiltinTheme = "default" | "dark" | "forest" | "neutral" | "base";
|
|
8
|
+
export type MermaidTheme = MermaidBuiltinTheme | MermaidCustomTheme;
|
|
9
|
+
|
|
10
|
+
const BUILTIN_THEMES = new Set<string>(["default", "dark", "forest", "neutral", "base"]);
|
|
11
|
+
|
|
12
|
+
export interface MermaidConfig {
|
|
13
|
+
theme?: MermaidTheme;
|
|
14
|
+
darkMode?: boolean;
|
|
15
|
+
look?: "classic" | "handdrawn";
|
|
16
|
+
themeVariables?: Record<string, string>;
|
|
17
|
+
flowchart?: { curve?: "linear" | "cardinal"; padding?: number; htmlLabels?: boolean };
|
|
18
|
+
fontFamily?: string;
|
|
19
|
+
fontSize?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface MermaidProps {
|
|
23
|
+
chart: string;
|
|
24
|
+
config?: MermaidConfig;
|
|
25
|
+
className?: string;
|
|
26
|
+
onError?: (error: string) => void;
|
|
27
|
+
debounceTime?: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function useDebounce<T>(value: T, delay: number): T {
|
|
31
|
+
const [debouncedValue, setDebouncedValue] = React.useState(value);
|
|
32
|
+
React.useEffect(() => {
|
|
33
|
+
const handler = setTimeout(() => setDebouncedValue(value), delay);
|
|
34
|
+
return () => clearTimeout(handler);
|
|
35
|
+
}, [value, delay]);
|
|
36
|
+
return debouncedValue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function Mermaid({ chart, config, className, onError, debounceTime = 300 }: MermaidProps) {
|
|
40
|
+
const [svg, setSvg] = React.useState<string | null>(null);
|
|
41
|
+
const [error, setError] = React.useState<string | null>(null);
|
|
42
|
+
const [status, setStatus] = React.useState<"idle" | "loading" | "success" | "error">("idle");
|
|
43
|
+
const id = React.useId().replace(/:/g, "");
|
|
44
|
+
const renderRef = React.useRef<HTMLDivElement>(null);
|
|
45
|
+
const debouncedChart = useDebounce(chart, debounceTime);
|
|
46
|
+
const configString = React.useMemo(() => JSON.stringify(config ?? {}), [config]);
|
|
47
|
+
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
if (!debouncedChart.trim()) { setStatus("idle"); setSvg(null); setError(null); return; }
|
|
50
|
+
let isCancelled = false;
|
|
51
|
+
|
|
52
|
+
const render = async () => {
|
|
53
|
+
setStatus("loading");
|
|
54
|
+
setError(null);
|
|
55
|
+
try {
|
|
56
|
+
const mermaid = (await import("mermaid")).default;
|
|
57
|
+
if (isCancelled) return;
|
|
58
|
+
|
|
59
|
+
const parsedConfig: MermaidConfig = JSON.parse(configString);
|
|
60
|
+
const isCustomTheme = parsedConfig.theme && !BUILTIN_THEMES.has(parsedConfig.theme);
|
|
61
|
+
const resolvedThemeVars = isCustomTheme
|
|
62
|
+
? { ...mermaidThemes[parsedConfig.theme as MermaidCustomTheme], ...parsedConfig.themeVariables }
|
|
63
|
+
: parsedConfig.themeVariables;
|
|
64
|
+
const resolvedMermaidTheme = isCustomTheme ? "base"
|
|
65
|
+
: (parsedConfig.theme as MermaidBuiltinTheme) || (parsedConfig.darkMode ? "dark" : "dark");
|
|
66
|
+
|
|
67
|
+
mermaid.initialize({
|
|
68
|
+
startOnLoad: false,
|
|
69
|
+
theme: resolvedMermaidTheme,
|
|
70
|
+
themeVariables: resolvedThemeVars,
|
|
71
|
+
flowchart: { htmlLabels: parsedConfig.flowchart?.htmlLabels ?? true },
|
|
72
|
+
fontFamily: parsedConfig.fontFamily ?? "JetBrains Mono, monospace",
|
|
73
|
+
fontSize: parsedConfig.fontSize ?? 12,
|
|
74
|
+
logLevel: "error" as const,
|
|
75
|
+
securityLevel: "loose",
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
if (!renderRef.current) return;
|
|
79
|
+
renderRef.current.innerHTML = "";
|
|
80
|
+
const uniqueId = `mermaid-${id}-${Date.now()}`;
|
|
81
|
+
const { svg: svgOutput } = await mermaid.render(uniqueId, debouncedChart.trim(), renderRef.current);
|
|
82
|
+
if (!isCancelled) { setSvg(svgOutput); setStatus("success"); renderRef.current.innerHTML = ""; }
|
|
83
|
+
} catch (err) {
|
|
84
|
+
if (!isCancelled) {
|
|
85
|
+
const message = err instanceof Error ? err.message : "Failed to render diagram";
|
|
86
|
+
setError(message);
|
|
87
|
+
setStatus("error");
|
|
88
|
+
setSvg(null);
|
|
89
|
+
onError?.(message);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
render();
|
|
94
|
+
return () => { isCancelled = true; };
|
|
95
|
+
}, [debouncedChart, configString, id, onError]);
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<div className={cn("relative w-full min-h-[100px]", className)}>
|
|
99
|
+
{status === "success" && svg && (
|
|
100
|
+
<div
|
|
101
|
+
className="flex items-center justify-center w-full h-full overflow-auto [&_svg]:max-w-full [&_svg]:h-auto"
|
|
102
|
+
dangerouslySetInnerHTML={{ __html: svg }}
|
|
103
|
+
role="img"
|
|
104
|
+
aria-label="Mermaid diagram"
|
|
105
|
+
/>
|
|
106
|
+
)}
|
|
107
|
+
<div ref={renderRef} className="absolute inset-0 invisible -z-50 w-full h-full pointer-events-none overflow-hidden" aria-hidden="true" />
|
|
108
|
+
{status === "loading" && (
|
|
109
|
+
<div className="absolute inset-0 flex items-center justify-center">
|
|
110
|
+
<span className="text-xs font-mono text-[var(--hud-text-dim)] animate-pulse">Rendering...</span>
|
|
111
|
+
</div>
|
|
112
|
+
)}
|
|
113
|
+
{status === "error" && error && (
|
|
114
|
+
<div className="flex items-center justify-center w-full p-4 border border-red-500/20 bg-red-500/5 rounded">
|
|
115
|
+
<code className="text-[10px] text-red-400 font-mono">{error.split("\n")[0]}</code>
|
|
116
|
+
</div>
|
|
117
|
+
)}
|
|
118
|
+
{status === "idle" && (
|
|
119
|
+
<div className="flex items-center justify-center w-full h-full min-h-[100px] border border-dashed border-[var(--hud-border)] rounded">
|
|
120
|
+
<p className="text-xs font-mono text-[var(--hud-text-dim)]">No diagram</p>
|
|
121
|
+
</div>
|
|
122
|
+
)}
|
|
123
|
+
</div>
|
|
124
|
+
);
|
|
125
|
+
}
|