failproofai 0.0.1-beta.1 → 0.0.1-beta.2
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0138pgk._.js → [root-of-the-server]__09ienw0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0osi8nq._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0nn6lb4._.js → [root-of-the-server]__0uf3j~z._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
- package/.next/standalone/bin/failproofai.mjs +44 -0
- package/.next/standalone/components/reach-developers.tsx +37 -34
- package/.next/standalone/docs/cli-reference.md +23 -0
- package/.next/standalone/docs/dashboard.md +30 -0
- package/.next/standalone/examples/policies-advanced/index.js +2 -45
- package/.next/standalone/examples/policies-notification.js +59 -0
- package/.next/standalone/next.config.ts +5 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/launch.ts +8 -3
- package/.next/standalone/scripts/parse-script-args.ts +11 -1
- package/bin/failproofai.mjs +44 -0
- package/package.json +1 -1
- package/scripts/launch.ts +8 -3
- package/scripts/parse-script-args.ts +11 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/exospheresmall.png"/><link rel="stylesheet" href="/_next/static/chunks/
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/exospheresmall.png"/><link rel="stylesheet" href="/_next/static/chunks/08f78tecvx61l.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0tyw4u3~2isbh.js"/><script src="/_next/static/chunks/150i0n26fnvso.js" async=""></script><script src="/_next/static/chunks/07uz2g0_38qia.js" async=""></script><script src="/_next/static/chunks/031pa5~qfzt~_.js" async=""></script><script src="/_next/static/chunks/01q52wg_amm60.js" async=""></script><script src="/_next/static/chunks/turbopack-0uc5y~g6h.n7-.js" async=""></script><script src="/_next/static/chunks/0sgecpshdvl.u.js" async=""></script><script src="/_next/static/chunks/14veu4cs33mql.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><script src="/_next/static/chunks/0ksdlt_1hucdm.js" async=""></script><script src="/_next/static/chunks/15fklyav5py5m.js" async=""></script><script src="/_next/static/chunks/0l2m_uxg48my7.js" async=""></script><title>404: This page could not be found.</title><meta name="robots" content="noindex"/><title>Failproof AI - Hooks & Project Monitor</title><meta name="description" content="Open-source hooks, policies, and project visualization for Claude Code & Agents SDK"/><link rel="icon" href="/icon.png"/><script>
|
|
2
2
|
(function() {
|
|
3
3
|
try {
|
|
4
4
|
// Ensure we don't add duplicate classes
|
|
@@ -27,4 +27,4 @@
|
|
|
27
27
|
transition: opacity 0.15s;
|
|
28
28
|
}
|
|
29
29
|
body > *:not(#__loading) { opacity: 0; }
|
|
30
|
-
</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div id="__loading">Loading…</div><header class="relative z-50 border-b border-border bg-card/50 backdrop-blur supports-[backdrop-filter]:bg-card/50"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex items-center justify-between h-16"><div class="flex items-center gap-3"><a href="https://github.com/exospherehost/failproofai" target="_blank" rel="noopener noreferrer" class="flex items-center gap-3 hover:opacity-80 transition-opacity"><img alt="Exosphere Logo" width="28" height="28" decoding="async" data-nimg="1" class="flex-shrink-0" style="color:transparent" src="/exospheresmall.png"/><h1 class="text-lg font-semibold text-foreground leading-tight tracking-tight">Failproof AI</h1></a><div class="w-px h-8 bg-border ml-2"></div><nav class="flex items-center h-16"><a class="relative flex items-center gap-1.5 px-3 h-full text-sm transition-colors text-muted-foreground hover:text-foreground" href="/policies"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield w-4 h-4" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg>Policies<span class="absolute inset-x-1 bottom-0 h-[2px] rounded-full transition-all bg-transparent group-hover:bg-muted"></span></a><a class="relative flex items-center gap-1.5 px-3 h-full text-sm transition-colors text-muted-foreground hover:text-foreground" href="/projects"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder-open w-4 h-4" aria-hidden="true"><path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"></path></svg>Projects<span class="absolute inset-x-1 bottom-0 h-[2px] rounded-full transition-all bg-transparent group-hover:bg-muted"></span></a></nav></div><div class="flex items-center gap-1"><div class="inline-flex items-center rounded-lg border border-border bg-muted/50 p-0.5 gap-0.5"><button title="Refresh" class="inline-flex items-center justify-center rounded-md p-1.5 transition-colors text-muted-foreground hover:text-foreground hover:bg-muted"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-refresh-cw w-3.5 h-3.5" aria-hidden="true"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"></path><path d="M8 16H3v5"></path></svg></button><div class="w-px h-4 bg-border"></div><div class="inline-flex items-center gap-0.5" role="group" aria-label="Auto-refresh interval"><button aria-pressed="true" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors bg-background text-foreground shadow-sm">Off</button><button aria-pressed="false" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors text-muted-foreground hover:text-foreground hover:bg-muted">5s</button><button aria-pressed="false" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors text-muted-foreground hover:text-foreground hover:bg-muted">10s</button><button aria-pressed="false" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors text-muted-foreground hover:text-foreground hover:bg-muted">30s</button></div></div><div class="w-px h-6 bg-border mx-1"></div><div class="relative"><button class="justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none hover:bg-muted h-9 px-3 flex items-center gap-1.5 text-muted-foreground hover:text-foreground" aria-expanded="false" aria-haspopup="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-mail h-4 w-4" aria-hidden="true"><path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7"></path><rect x="2" y="4" width="20" height="16" rx="2"></rect></svg><span class="hidden sm:inline text-xs">Reach Us</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-3 w-3 transition-transform" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div><button class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none hover:bg-muted hover:text-muted-foreground h-10 w-10 relative" aria-label="Switch to light mode"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun h-[1.2rem] w-[1.2rem] transition-all rotate-90 scale-0" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon absolute h-[1.2rem] w-[1.2rem] transition-all rotate-0 scale-100" aria-hidden="true"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"></path></svg></button></div></div></div></header><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div class="fixed bottom-4 right-4 z-50 flex flex-col gap-2"></div><script src="/_next/static/chunks/0tyw4u3~2isbh.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[12344,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"PostHogProvider\"]\n3:I[97917,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"GlobalErrorListeners\"]\n4:I[47613,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"ThemeProvider\"]\n5:I[85881,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"AutoRefreshProvider\"]\n6:I[63780,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"Navbar\"]\n7:I[39756,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"default\"]\n8:I[8821,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\",\"/_next/static/chunks/15fklyav5py5m.js\"],\"default\"]\n9:I[37457,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"default\"]\na:I[55574,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"Toaster\"]\nf:I[53348,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\",\"/_next/static/chunks/0j9.uck5i84a1.js\"],\"default\"]\n:HL[\"/_next/static/chunks/08jb-7621cx72.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/08jb-7621cx72.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/0ksdlt_1hucdm.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n try {\\n // Ensure we don't add duplicate classes\\n document.documentElement.classList.remove('light', 'dark');\\n \\n var theme = localStorage.getItem('theme');\\n if (theme \u0026\u0026 (theme === 'light' || theme === 'dark')) {\\n document.documentElement.classList.add(theme);\\n } else {\\n document.documentElement.classList.add('dark');\\n }\\n } catch (e) {\\n // Fallback to dark theme if there's any error\\n document.documentElement.classList.remove('light', 'dark');\\n document.documentElement.classList.add('dark');\\n }\\n })();\\n \"}}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n #__loading {\\n position: fixed; inset: 0; z-index: 9999;\\n display: flex; align-items: center; justify-content: center;\\n background: var(--background, #031035);\\n color: var(--foreground, #f8fafc);\\n font-family: system-ui, sans-serif;\\n font-size: 1rem;\\n transition: opacity 0.15s;\\n }\\n body \u003e *:not(#__loading) { opacity: 0; }\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[[\"$\",\"div\",null,{\"id\":\"__loading\",\"children\":\"Loading…\"}],[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{\"children\":[[\"$\",\"$L6\",null,{\"disabledPages\":[]}],[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$8\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/15fklyav5py5m.js\",\"async\":true}]],\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],[\"$\",\"$La\",null,{}]]}]]}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$Lb\",null,\"$Lc\"]}],{},null,false,null]},null,false,\"$@d\"]},null,false,null],\"$Le\",false]],\"m\":\"$undefined\",\"G\":[\"$f\",[\"$L10\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"-UgvhWE3aTnZUgMf4WTsN\"}\n"])</script><script>self.__next_f.push([1,"11:I[97367,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"OutletBoundary\"]\n12:\"$Sreact.suspense\"\n15:I[97367,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"ViewportBoundary\"]\n17:I[97367,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"MetadataBoundary\"]\nb:[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]]\nc:[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$12\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@13\"}]}]\n14:[]\nd:\"$W14\"\ne:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L15\",null,{\"children\":\"$L16\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L17\",null,{\"children\":[\"$\",\"$12\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L18\"}]}]}],null]}]\n10:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/08jb-7621cx72.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"16:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"19:I[27201,[\"/_next/static/chunks/0xr2w-j-2ez58.js\",\"/_next/static/chunks/0u5h_cwe-jocx.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"IconMark\"]\n13:null\n18:[[\"$\",\"title\",\"0\",{\"children\":\"Failproof AI - Hooks \u0026 Project Monitor\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Open-source hooks, policies, and project visualization for Claude Code \u0026 Agents SDK\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png\"}],[\"$\",\"$L19\",\"3\",{}]]\n"])</script></body></html>
|
|
30
|
+
</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body class="antialiased"><div hidden=""><!--$--><!--/$--></div><div id="__loading">Loading…</div><header class="relative z-50 border-b border-border bg-card/50 backdrop-blur supports-[backdrop-filter]:bg-card/50"><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex items-center justify-between h-16"><div class="flex items-center gap-3"><a href="https://github.com/exospherehost/failproofai" target="_blank" rel="noopener noreferrer" class="flex items-center gap-3 hover:opacity-80 transition-opacity"><img alt="Exosphere Logo" width="28" height="28" decoding="async" data-nimg="1" class="flex-shrink-0" style="color:transparent" src="/exospheresmall.png"/><h1 class="text-lg font-semibold text-foreground leading-tight tracking-tight">Failproof AI</h1></a><div class="w-px h-8 bg-border ml-2"></div><nav class="flex items-center h-16"><a class="relative flex items-center gap-1.5 px-3 h-full text-sm transition-colors text-muted-foreground hover:text-foreground" href="/policies"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-shield w-4 h-4" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path></svg>Policies<span class="absolute inset-x-1 bottom-0 h-[2px] rounded-full transition-all bg-transparent group-hover:bg-muted"></span></a><a class="relative flex items-center gap-1.5 px-3 h-full text-sm transition-colors text-muted-foreground hover:text-foreground" href="/projects"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder-open w-4 h-4" aria-hidden="true"><path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"></path></svg>Projects<span class="absolute inset-x-1 bottom-0 h-[2px] rounded-full transition-all bg-transparent group-hover:bg-muted"></span></a></nav></div><div class="flex items-center gap-1"><div class="inline-flex items-center rounded-lg border border-border bg-muted/50 p-0.5 gap-0.5"><button title="Refresh" class="inline-flex items-center justify-center rounded-md p-1.5 transition-colors text-muted-foreground hover:text-foreground hover:bg-muted"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-refresh-cw w-3.5 h-3.5" aria-hidden="true"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"></path><path d="M21 3v5h-5"></path><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"></path><path d="M8 16H3v5"></path></svg></button><div class="w-px h-4 bg-border"></div><div class="inline-flex items-center gap-0.5" role="group" aria-label="Auto-refresh interval"><button aria-pressed="true" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors bg-background text-foreground shadow-sm">Off</button><button aria-pressed="false" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors text-muted-foreground hover:text-foreground hover:bg-muted">5s</button><button aria-pressed="false" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors text-muted-foreground hover:text-foreground hover:bg-muted">10s</button><button aria-pressed="false" class="px-2 py-1 text-[11px] font-medium rounded-md transition-colors text-muted-foreground hover:text-foreground hover:bg-muted">30s</button></div></div><div class="w-px h-6 bg-border mx-1"></div><div class="relative"><button class="justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none hover:bg-muted h-9 px-3 relative z-50 flex items-center gap-1.5 text-muted-foreground hover:text-foreground" type="button" aria-expanded="false" aria-haspopup="true"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-git-branch h-4 w-4" aria-hidden="true"><path d="M15 6a9 9 0 0 0-9 9V3"></path><circle cx="18" cy="6" r="3"></circle><circle cx="6" cy="18" r="3"></circle></svg><span class="hidden sm:inline text-xs">Reach Us</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down h-3 w-3 transition-transform" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div><button class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none hover:bg-muted hover:text-muted-foreground h-10 w-10 relative" aria-label="Switch to light mode"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun h-[1.2rem] w-[1.2rem] transition-all rotate-90 scale-0" aria-hidden="true"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon absolute h-[1.2rem] w-[1.2rem] transition-all rotate-0 scale-100" aria-hidden="true"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"></path></svg></button></div></div></div></header><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><div class="fixed bottom-4 right-4 z-50 flex flex-col gap-2"></div><script src="/_next/static/chunks/0tyw4u3~2isbh.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[12344,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"PostHogProvider\"]\n3:I[97917,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"GlobalErrorListeners\"]\n4:I[47613,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"ThemeProvider\"]\n5:I[85881,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"AutoRefreshProvider\"]\n6:I[63780,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"Navbar\"]\n7:I[39756,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"default\"]\n8:I[8821,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\",\"/_next/static/chunks/15fklyav5py5m.js\"],\"default\"]\n9:I[37457,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"default\"]\na:I[55574,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"Toaster\"]\nf:I[53348,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\",\"/_next/static/chunks/0l2m_uxg48my7.js\"],\"default\"]\n:HL[\"/_next/static/chunks/08f78tecvx61l.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/08f78tecvx61l.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0sgecpshdvl.u.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/14veu4cs33mql.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/0ksdlt_1hucdm.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n (function() {\\n try {\\n // Ensure we don't add duplicate classes\\n document.documentElement.classList.remove('light', 'dark');\\n \\n var theme = localStorage.getItem('theme');\\n if (theme \u0026\u0026 (theme === 'light' || theme === 'dark')) {\\n document.documentElement.classList.add(theme);\\n } else {\\n document.documentElement.classList.add('dark');\\n }\\n } catch (e) {\\n // Fallback to dark theme if there's any error\\n document.documentElement.classList.remove('light', 'dark');\\n document.documentElement.classList.add('dark');\\n }\\n })();\\n \"}}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n #__loading {\\n position: fixed; inset: 0; z-index: 9999;\\n display: flex; align-items: center; justify-content: center;\\n background: var(--background, #031035);\\n color: var(--foreground, #f8fafc);\\n font-family: system-ui, sans-serif;\\n font-size: 1rem;\\n transition: opacity 0.15s;\\n }\\n body \u003e *:not(#__loading) { opacity: 0; }\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"antialiased\",\"children\":[[\"$\",\"div\",null,{\"id\":\"__loading\",\"children\":\"Loading…\"}],[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{\"children\":[[\"$\",\"$L6\",null,{\"disabledPages\":[]}],[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$8\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/15fklyav5py5m.js\",\"async\":true}]],\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],[\"$\",\"$La\",null,{}]]}]]}]]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L7\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[\"$Lb\",null,\"$Lc\"]}],{},null,false,null]},null,false,\"$@d\"]},null,false,null],\"$Le\",false]],\"m\":\"$undefined\",\"G\":[\"$f\",[\"$L10\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"LQRVOjXwd9F-ga0pszPmb\"}\n"])</script><script>self.__next_f.push([1,"11:I[97367,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"OutletBoundary\"]\n12:\"$Sreact.suspense\"\n15:I[97367,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"ViewportBoundary\"]\n17:I[97367,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"MetadataBoundary\"]\nb:[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:1:props:children:1:props:children:0:props:children:1:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]]\nc:[\"$\",\"$L11\",null,{\"children\":[\"$\",\"$12\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@13\"}]}]\n14:[]\nd:\"$W14\"\ne:[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L15\",null,{\"children\":\"$L16\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L17\",null,{\"children\":[\"$\",\"$12\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L18\"}]}]}],null]}]\n10:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/08f78tecvx61l.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"16:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"19:I[27201,[\"/_next/static/chunks/0sgecpshdvl.u.js\",\"/_next/static/chunks/14veu4cs33mql.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0ksdlt_1hucdm.js\"],\"IconMark\"]\n13:null\n18:[[\"$\",\"title\",\"0\",{\"children\":\"Failproof AI - Hooks \u0026 Project Monitor\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Open-source hooks, policies, and project visualization for Claude Code \u0026 Agents SDK\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png\"}],[\"$\",\"$L19\",\"3\",{}]]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0tyw4u3~2isbh.js"/><script src="/_next/static/chunks/150i0n26fnvso.js" async=""></script><script src="/_next/static/chunks/07uz2g0_38qia.js" async=""></script><script src="/_next/static/chunks/031pa5~qfzt~_.js" async=""></script><script src="/_next/static/chunks/01q52wg_amm60.js" async=""></script><script src="/_next/static/chunks/turbopack-0uc5y~g6h.n7-.js" async=""></script><script src="/_next/static/chunks/
|
|
1
|
+
<!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0tyw4u3~2isbh.js"/><script src="/_next/static/chunks/150i0n26fnvso.js" async=""></script><script src="/_next/static/chunks/07uz2g0_38qia.js" async=""></script><script src="/_next/static/chunks/031pa5~qfzt~_.js" async=""></script><script src="/_next/static/chunks/01q52wg_amm60.js" async=""></script><script src="/_next/static/chunks/turbopack-0uc5y~g6h.n7-.js" async=""></script><script src="/_next/static/chunks/0l8mjk-mjm~jw.js" async=""></script><script src="/_next/static/chunks/0d3shmwh5_nmn.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0tyw4u3~2isbh.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/0l8mjk-mjm~jw.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/0l8mjk-mjm~jw.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/0l8mjk-mjm~jw.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/0l8mjk-mjm~jw.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/0l8mjk-mjm~jw.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"MetadataBoundary\"]\nc:I[53348,[\"/_next/static/chunks/0l8mjk-mjm~jw.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$@7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"LQRVOjXwd9F-ga0pszPmb\"}\n"])</script><script>self.__next_f.push([1,"d:[]\n7:\"$Wd\"\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\nb:[]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"00b9b1546d3af0db14237486691baab3279ccc55d7\": {\n \"workers\": {\n \"app/_global-error/page\": {\n \"moduleId\": 39027,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n },\n \"app/_not-found/page\": {\n \"moduleId\": 37985,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n },\n \"app/page\": {\n \"moduleId\": 24190,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n },\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n },\n \"app/project/[name]/page\": {\n \"moduleId\": 165,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n },\n \"app/project/[name]/session/[sessionId]/page\": {\n \"moduleId\": 21776,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n },\n \"app/projects/page\": {\n \"moduleId\": 26035,\n \"async\": false,\n \"exportedName\": \"getTelemetryConfig\",\n \"filename\": \"app/actions/get-telemetry-config.ts\"\n }\n },\n \"filename\": \"app/actions/get-telemetry-config.ts\",\n \"exportedName\": \"getTelemetryConfig\"\n },\n \"4093648d5f4f7bff9866fd16db1107178b0317b601\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"getHookActivityAction\",\n \"filename\": \"app/actions/get-hook-activity.ts\"\n }\n },\n \"filename\": \"app/actions/get-hook-activity.ts\",\n \"exportedName\": \"getHookActivityAction\"\n },\n \"60f9aff68e8c06970553597438ac76e24d2028b594\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"searchHookActivityAction\",\n \"filename\": \"app/actions/get-hook-activity.ts\"\n },\n \"app/project/[name]/session/[sessionId]/page\": {\n \"moduleId\": 21776,\n \"async\": false,\n \"exportedName\": \"searchHookActivityAction\",\n \"filename\": \"app/actions/get-hook-activity.ts\"\n }\n },\n \"filename\": \"app/actions/get-hook-activity.ts\",\n \"exportedName\": \"searchHookActivityAction\"\n },\n \"007c11bf479cd43af4aad6c1282e85e89a1f1891b9\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"getHooksConfigAction\",\n \"filename\": \"app/actions/get-hooks-config.ts\"\n }\n },\n \"filename\": \"app/actions/get-hooks-config.ts\",\n \"exportedName\": \"getHooksConfigAction\"\n },\n \"60e7bd7fb5b18011c19e473c089ca6fa64bace6185\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"togglePolicyAction\",\n \"filename\": \"app/actions/update-hooks-config.ts\"\n }\n },\n \"filename\": \"app/actions/update-hooks-config.ts\",\n \"exportedName\": \"togglePolicyAction\"\n },\n \"405da78e272e2c76377fdca2a303b2e14ab90bc2e2\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"installHooksWebAction\",\n \"filename\": \"app/actions/install-hooks-web.ts\"\n }\n },\n \"filename\": \"app/actions/install-hooks-web.ts\",\n \"exportedName\": \"installHooksWebAction\"\n },\n \"4008bc5fdbff233469f91d16429c4889e8a9f5a486\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"removeHooksWebAction\",\n \"filename\": \"app/actions/install-hooks-web.ts\"\n }\n },\n \"filename\": \"app/actions/install-hooks-web.ts\",\n \"exportedName\": \"removeHooksWebAction\"\n },\n \"60b36e4878ea01befa3825c9ac8e0a96f672706561\": {\n \"workers\": {\n \"app/policies/page\": {\n \"moduleId\": 11369,\n \"async\": false,\n \"exportedName\": \"updatePolicyParamsAction\",\n \"filename\": \"app/actions/update-policy-params.ts\"\n }\n },\n \"filename\": \"app/actions/update-policy-params.ts\",\n \"exportedName\": \"updatePolicyParamsAction\"\n }\n },\n \"edge\": {},\n \"encryptionKey\": \"2fpww8EvBNwS+HOdep68M2xCHep76Oxo/T6uidMY6SM=\"\n}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"node": {
|
|
3
|
-
"
|
|
3
|
+
"00b9b1546d3af0db14237486691baab3279ccc55d7": {
|
|
4
4
|
"workers": {
|
|
5
5
|
"app/_global-error/page": {
|
|
6
6
|
"moduleId": 39027,
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"filename": "app/actions/get-telemetry-config.ts",
|
|
49
49
|
"exportedName": "getTelemetryConfig"
|
|
50
50
|
},
|
|
51
|
-
"
|
|
51
|
+
"4093648d5f4f7bff9866fd16db1107178b0317b601": {
|
|
52
52
|
"workers": {
|
|
53
53
|
"app/policies/page": {
|
|
54
54
|
"moduleId": 11369,
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"filename": "app/actions/get-hook-activity.ts",
|
|
61
61
|
"exportedName": "getHookActivityAction"
|
|
62
62
|
},
|
|
63
|
-
"
|
|
63
|
+
"60f9aff68e8c06970553597438ac76e24d2028b594": {
|
|
64
64
|
"workers": {
|
|
65
65
|
"app/policies/page": {
|
|
66
66
|
"moduleId": 11369,
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"filename": "app/actions/get-hook-activity.ts",
|
|
79
79
|
"exportedName": "searchHookActivityAction"
|
|
80
80
|
},
|
|
81
|
-
"
|
|
81
|
+
"007c11bf479cd43af4aad6c1282e85e89a1f1891b9": {
|
|
82
82
|
"workers": {
|
|
83
83
|
"app/policies/page": {
|
|
84
84
|
"moduleId": 11369,
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"filename": "app/actions/get-hooks-config.ts",
|
|
91
91
|
"exportedName": "getHooksConfigAction"
|
|
92
92
|
},
|
|
93
|
-
"
|
|
93
|
+
"60e7bd7fb5b18011c19e473c089ca6fa64bace6185": {
|
|
94
94
|
"workers": {
|
|
95
95
|
"app/policies/page": {
|
|
96
96
|
"moduleId": 11369,
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"filename": "app/actions/update-hooks-config.ts",
|
|
103
103
|
"exportedName": "togglePolicyAction"
|
|
104
104
|
},
|
|
105
|
-
"
|
|
105
|
+
"405da78e272e2c76377fdca2a303b2e14ab90bc2e2": {
|
|
106
106
|
"workers": {
|
|
107
107
|
"app/policies/page": {
|
|
108
108
|
"moduleId": 11369,
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"filename": "app/actions/install-hooks-web.ts",
|
|
115
115
|
"exportedName": "installHooksWebAction"
|
|
116
116
|
},
|
|
117
|
-
"
|
|
117
|
+
"4008bc5fdbff233469f91d16429c4889e8a9f5a486": {
|
|
118
118
|
"workers": {
|
|
119
119
|
"app/policies/page": {
|
|
120
120
|
"moduleId": 11369,
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
"filename": "app/actions/install-hooks-web.ts",
|
|
127
127
|
"exportedName": "removeHooksWebAction"
|
|
128
128
|
},
|
|
129
|
-
"
|
|
129
|
+
"60b36e4878ea01befa3825c9ac8e0a96f672706561": {
|
|
130
130
|
"workers": {
|
|
131
131
|
"app/policies/page": {
|
|
132
132
|
"moduleId": 11369,
|
|
@@ -140,5 +140,5 @@
|
|
|
140
140
|
}
|
|
141
141
|
},
|
|
142
142
|
"edge": {},
|
|
143
|
-
"encryptionKey": "
|
|
143
|
+
"encryptionKey": "2fpww8EvBNwS+HOdep68M2xCHep76Oxo/T6uidMY6SM="
|
|
144
144
|
}
|
|
@@ -10,8 +10,21 @@
|
|
|
10
10
|
* --list-policies List available policies and their status
|
|
11
11
|
* (default) Launch production dashboard
|
|
12
12
|
*/
|
|
13
|
+
import { realpathSync } from "node:fs";
|
|
14
|
+
import { dirname, resolve } from "node:path";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
13
16
|
import { version } from "../package.json";
|
|
14
17
|
|
|
18
|
+
// Resolve the real package root early (following any npm bin symlinks) so that
|
|
19
|
+
// scripts/launch.ts can locate .next/standalone/server.js correctly regardless
|
|
20
|
+
// of how bun resolves import.meta.url for dynamically-imported modules.
|
|
21
|
+
if (!process.env.FAILPROOFAI_PACKAGE_ROOT) {
|
|
22
|
+
process.env.FAILPROOFAI_PACKAGE_ROOT = resolve(
|
|
23
|
+
dirname(realpathSync(fileURLToPath(import.meta.url))),
|
|
24
|
+
".."
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
15
28
|
const args = process.argv.slice(2);
|
|
16
29
|
|
|
17
30
|
// --version / -v
|
|
@@ -89,6 +102,37 @@ if (args.includes("--list-policies")) {
|
|
|
89
102
|
process.exit(0);
|
|
90
103
|
}
|
|
91
104
|
|
|
105
|
+
// Unknown flag guard — must appear after all known-flag branches
|
|
106
|
+
const knownFlags = ["--version", "-v", "--hook", "--install-policies",
|
|
107
|
+
"--remove-policies", "--list-policies"];
|
|
108
|
+
const unknownFlag = args.find(a => a.startsWith("-") && !knownFlags.includes(a));
|
|
109
|
+
|
|
110
|
+
if (unknownFlag) {
|
|
111
|
+
function levenshtein(a, b) {
|
|
112
|
+
const m = a.length, n = b.length;
|
|
113
|
+
const dp = Array.from({ length: m + 1 }, (_, i) =>
|
|
114
|
+
Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))
|
|
115
|
+
);
|
|
116
|
+
for (let i = 1; i <= m; i++)
|
|
117
|
+
for (let j = 1; j <= n; j++)
|
|
118
|
+
dp[i][j] = a[i - 1] === b[j - 1]
|
|
119
|
+
? dp[i - 1][j - 1]
|
|
120
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
121
|
+
return dp[m][n];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const primary = ["--version", "--hook", "--install-policies",
|
|
125
|
+
"--remove-policies", "--list-policies"];
|
|
126
|
+
const closest = primary.reduce((best, flag) => {
|
|
127
|
+
const dist = levenshtein(unknownFlag, flag);
|
|
128
|
+
return dist < best.dist ? { flag, dist } : best;
|
|
129
|
+
}, { flag: primary[0], dist: Infinity });
|
|
130
|
+
|
|
131
|
+
console.error(`Unknown flag: ${unknownFlag}`);
|
|
132
|
+
console.error(`Did you mean: ${closest.flag}?`);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
|
|
92
136
|
// Dashboard launch — always production mode
|
|
93
137
|
const { launch } = await import("../scripts/launch");
|
|
94
138
|
launch("start");
|
|
@@ -1,61 +1,59 @@
|
|
|
1
|
-
/** Dropdown menu for users to reach the development team via
|
|
1
|
+
/** Dropdown menu for users to reach the development team via GitHub. */
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
|
-
import React, { useState,
|
|
5
|
-
import {
|
|
4
|
+
import React, { useState, useCallback } from "react";
|
|
5
|
+
import { GitBranch, Lightbulb, Bug, MessageSquare, ChevronDown } from "lucide-react";
|
|
6
6
|
import { Button } from "@/components/ui/button";
|
|
7
7
|
|
|
8
|
+
const GITHUB_REPO = "https://github.com/exospherehost/failproofai";
|
|
8
9
|
const CONTACT_EMAIL = "failproofai@exosphere.host";
|
|
9
10
|
|
|
10
11
|
const options = [
|
|
11
12
|
{
|
|
12
13
|
label: "Request a Feature",
|
|
13
14
|
icon: Lightbulb,
|
|
14
|
-
|
|
15
|
+
href: `${GITHUB_REPO}/issues/new?labels=enhancement&title=Feature+Request%3A+`,
|
|
15
16
|
},
|
|
16
17
|
{
|
|
17
|
-
label: "Report
|
|
18
|
+
label: "Report an Issue",
|
|
18
19
|
icon: Bug,
|
|
19
|
-
|
|
20
|
+
href: `${GITHUB_REPO}/issues/new?labels=bug&title=Bug+Report%3A+`,
|
|
20
21
|
},
|
|
21
22
|
{
|
|
22
|
-
label: "
|
|
23
|
+
label: "Ask a Question",
|
|
23
24
|
icon: MessageSquare,
|
|
24
|
-
|
|
25
|
+
href: `${GITHUB_REPO}/discussions/new?category=q-a`,
|
|
25
26
|
},
|
|
26
27
|
] as const;
|
|
27
28
|
|
|
28
29
|
export const ReachDevelopers: React.FC = () => {
|
|
29
30
|
const [open, setOpen] = useState(false);
|
|
30
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
const handleClickOutside = (e: MouseEvent) => {
|
|
34
|
-
if (ref.current && !ref.current.contains(e.target as Node)) {
|
|
35
|
-
setOpen(false);
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
document.addEventListener("mousedown", handleClickOutside);
|
|
39
|
-
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
40
|
-
}, []);
|
|
32
|
+
const close = useCallback(() => setOpen(false), []);
|
|
41
33
|
|
|
42
34
|
const handleKeyDown = useCallback((e: React.KeyboardEvent) => {
|
|
43
|
-
if (e.key === "Escape"
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
}, [open]);
|
|
35
|
+
if (e.key === "Escape") setOpen(false);
|
|
36
|
+
}, []);
|
|
47
37
|
|
|
48
38
|
return (
|
|
49
|
-
<div
|
|
39
|
+
<div className="relative" onKeyDown={handleKeyDown}>
|
|
40
|
+
{open && (
|
|
41
|
+
<div
|
|
42
|
+
className="fixed inset-0 z-40"
|
|
43
|
+
onClick={close}
|
|
44
|
+
aria-hidden="true"
|
|
45
|
+
/>
|
|
46
|
+
)}
|
|
50
47
|
<Button
|
|
48
|
+
type="button"
|
|
51
49
|
variant="ghost"
|
|
52
50
|
size="sm"
|
|
53
51
|
onClick={() => setOpen((prev) => !prev)}
|
|
54
52
|
aria-expanded={open}
|
|
55
53
|
aria-haspopup="true"
|
|
56
|
-
className="flex items-center gap-1.5 text-muted-foreground hover:text-foreground"
|
|
54
|
+
className="relative z-50 flex items-center gap-1.5 text-muted-foreground hover:text-foreground"
|
|
57
55
|
>
|
|
58
|
-
<
|
|
56
|
+
<GitBranch className="h-4 w-4" />
|
|
59
57
|
<span className="hidden sm:inline text-xs">Reach Us</span>
|
|
60
58
|
<ChevronDown
|
|
61
59
|
className={`h-3 w-3 transition-transform ${open ? "rotate-180" : ""}`}
|
|
@@ -71,13 +69,15 @@ export const ReachDevelopers: React.FC = () => {
|
|
|
71
69
|
</p>
|
|
72
70
|
</div>
|
|
73
71
|
<div className="py-1">
|
|
74
|
-
{options.map(({ label, icon: Icon,
|
|
72
|
+
{options.map(({ label, icon: Icon, href }) => (
|
|
75
73
|
<a
|
|
76
74
|
key={label}
|
|
77
|
-
href={
|
|
75
|
+
href={href}
|
|
76
|
+
target="_blank"
|
|
77
|
+
rel="noopener noreferrer"
|
|
78
78
|
role="menuitem"
|
|
79
79
|
className="flex items-center gap-2.5 px-3 py-2 text-xs text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors"
|
|
80
|
-
onClick={
|
|
80
|
+
onClick={close}
|
|
81
81
|
>
|
|
82
82
|
<Icon className="h-3.5 w-3.5 flex-shrink-0" />
|
|
83
83
|
{label}
|
|
@@ -85,12 +85,15 @@ export const ReachDevelopers: React.FC = () => {
|
|
|
85
85
|
))}
|
|
86
86
|
</div>
|
|
87
87
|
<div className="px-3 py-2 border-t border-border">
|
|
88
|
-
<
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
<p className="text-[0.65rem] text-muted-foreground">
|
|
89
|
+
or email{" "}
|
|
90
|
+
<a
|
|
91
|
+
href={`mailto:${CONTACT_EMAIL}`}
|
|
92
|
+
className="text-primary hover:text-primary/80 transition-colors"
|
|
93
|
+
>
|
|
94
|
+
{CONTACT_EMAIL}
|
|
95
|
+
</a>
|
|
96
|
+
</p>
|
|
94
97
|
</div>
|
|
95
98
|
</div>
|
|
96
99
|
)}
|
|
@@ -13,6 +13,28 @@ failproofai --start
|
|
|
13
13
|
|
|
14
14
|
Starts the web dashboard at `http://localhost:8020`. Use `--start` for production mode (Next.js standalone). The default bare invocation uses development mode with auto-reload.
|
|
15
15
|
|
|
16
|
+
**Options (dev mode only):**
|
|
17
|
+
|
|
18
|
+
| Flag | Description |
|
|
19
|
+
|------|-------------|
|
|
20
|
+
| `--port <number>` | Port to listen on (default: `8020`) |
|
|
21
|
+
| `--projects-path <path>` | Override the Claude projects path |
|
|
22
|
+
| `--allowed-origins <origins>` | Comma-separated list of hosts/IPs allowed to access dev resources (e.g. HMR websocket). Required when accessing the dev server from a hostname other than `localhost`. |
|
|
23
|
+
|
|
24
|
+
**Example — allow a custom hostname in dev:**
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm run dev -- --allowed-origins dashboard.example.com
|
|
28
|
+
# or multiple:
|
|
29
|
+
npm run dev -- --allowed-origins dashboard.example.com,192.168.1.5
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
You can also set the env var directly instead of using the flag:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
FAILPROOFAI_ALLOWED_DEV_ORIGINS=dashboard.example.com npm run dev
|
|
36
|
+
```
|
|
37
|
+
|
|
16
38
|
---
|
|
17
39
|
|
|
18
40
|
## Hook handler (internal)
|
|
@@ -145,4 +167,5 @@ Prints the installed version number.
|
|
|
145
167
|
| `FAILPROOFAI_TELEMETRY_DISABLED=1` | Disable anonymous usage telemetry |
|
|
146
168
|
| `FAILPROOFAI_LOG_LEVEL=info\|warn\|error` | Server log level (default: `warn`) |
|
|
147
169
|
| `FAILPROOFAI_DISABLE_PAGES=policies,projects` | Comma-separated list of dashboard pages to disable |
|
|
170
|
+
| `FAILPROOFAI_ALLOWED_DEV_ORIGINS` | Comma-separated list of hosts/IPs allowed to access Next.js dev resources (HMR). Dev mode only. Equivalent to `--allowed-origins`. |
|
|
148
171
|
| `CLAUDE_PROJECTS_PATH` | Override the path where Claude Code project folders are found |
|
|
@@ -109,3 +109,33 @@ By default, the dashboard reads from the standard Claude Code projects directory
|
|
|
109
109
|
```bash
|
|
110
110
|
CLAUDE_PROJECTS_PATH=/custom/path/to/projects failproofai
|
|
111
111
|
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Accessing from a non-localhost host
|
|
116
|
+
|
|
117
|
+
When running the dashboard in **dev mode** (`npm run dev`) and accessing it from a hostname other than `localhost` — for example, a custom domain, a remote IP, or a tunneled URL — you may see a warning like:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
⚠ Blocked cross-origin request to Next.js dev resource /_next/webpack-hmr from "dashboard.example.com".
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
This is Next.js blocking cross-origin access to its HMR (hot module reload) websocket, which is a dev-only feature. To allow your host, use the `--allowed-origins` flag:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm run dev -- --allowed-origins dashboard.example.com
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
For multiple hosts or IPs, pass a comma-separated list:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm run dev -- --allowed-origins dashboard.example.com,192.168.1.5
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
You can also set the `FAILPROOFAI_ALLOWED_DEV_ORIGINS` environment variable instead:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
FAILPROOFAI_ALLOWED_DEV_ORIGINS=dashboard.example.com npm run dev
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
> **Note:** This only applies to dev mode. When running `failproofai` (production mode), there is no HMR websocket and no cross-origin dev resource issue.
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Install:
|
|
12
12
|
* failproofai --install-hooks custom ./examples/policies-advanced/index.js
|
|
13
|
+
*
|
|
14
|
+
* See also: ../policies-notification.js for a Notification event example.
|
|
13
15
|
*/
|
|
14
16
|
import { customPolicies, allow, deny, instruct } from "failproofai";
|
|
15
17
|
import { isOutsideProject, extractPushBranch, looksLikeSecretFile } from "./utils.js";
|
|
@@ -99,48 +101,3 @@ customPolicies.add({
|
|
|
99
101
|
return allow();
|
|
100
102
|
},
|
|
101
103
|
});
|
|
102
|
-
|
|
103
|
-
// 6. Notification event: forward Claude's idle notifications to Slack
|
|
104
|
-
customPolicies.add({
|
|
105
|
-
name: "slack-on-idle-notification",
|
|
106
|
-
description: "Forward Claude idle notifications to Slack (set SLACK_WEBHOOK_URL env var)",
|
|
107
|
-
match: { events: ["Notification"] },
|
|
108
|
-
fn: async (ctx) => {
|
|
109
|
-
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
|
|
110
|
-
if (!webhookUrl) return allow(); // skip if not configured
|
|
111
|
-
|
|
112
|
-
const type = String(ctx.payload?.notification_type ?? "");
|
|
113
|
-
if (type !== "idle") return allow(); // only forward idle notifications
|
|
114
|
-
|
|
115
|
-
const message = String(ctx.payload?.message ?? "Claude is waiting for input");
|
|
116
|
-
const cwd = ctx.session?.cwd ?? "unknown";
|
|
117
|
-
const sessionId = ctx.session?.sessionId ?? "unknown";
|
|
118
|
-
|
|
119
|
-
// Fire-and-forget — never block Claude if Slack is unreachable
|
|
120
|
-
fetch(webhookUrl, {
|
|
121
|
-
method: "POST",
|
|
122
|
-
headers: { "Content-Type": "application/json" },
|
|
123
|
-
body: JSON.stringify({
|
|
124
|
-
blocks: [
|
|
125
|
-
{
|
|
126
|
-
type: "header",
|
|
127
|
-
text: { type: "plain_text", text: "💬 Claude is waiting for you", emoji: true },
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
type: "section",
|
|
131
|
-
text: { type: "mrkdwn", text: message },
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
type: "section",
|
|
135
|
-
fields: [
|
|
136
|
-
{ type: "mrkdwn", text: `*Project*\n\`${cwd}\`` },
|
|
137
|
-
{ type: "mrkdwn", text: `*Session*\n\`${sessionId}\`` },
|
|
138
|
-
],
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
}),
|
|
142
|
-
}).catch(() => {});
|
|
143
|
-
|
|
144
|
-
return allow(); // Notification hooks must always return allow
|
|
145
|
-
},
|
|
146
|
-
});
|