failproofai 1.0.0-beta.12 → 1.0.0-beta.14
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/required-server-files.json +1 -1
- 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 +2 -3
- 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 +2 -3
- 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 +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- 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 +10 -10
- 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/api/audit/invite/route.js +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +2 -2
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +3 -2
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js +2 -3
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- 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 +2 -3
- 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 +10 -10
- package/.next/standalone/.next/server/app/policies/page.js +2 -3
- 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 +3 -4
- 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 +3 -4
- 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 +3 -4
- 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/app/settings/page/server-reference-manifest.json +4 -4
- package/.next/standalone/.next/server/app/settings/page.js +2 -3
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1a7i2q4._.js → [root-of-the-server]__00ni9za._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08y94xv._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__094p1f1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ed01_d._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1_ps0jw._.js → [root-of-the-server]__0effm9m._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lk_935._.js → [root-of-the-server]__0ix8gm7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ky_n0r._.js → [root-of-the-server]__0ji11a-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0v2fpxe._.js → [root-of-the-server]__0ojwjxl._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vb5fl2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ibjy5x._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1uyc-z4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__20d06rh._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +1 -3
- package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +1 -3
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1rdruw4._.js → [root-of-the-server]__0_1tiya._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spkm68._.js +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ha3gul._.js → [root-of-the-server]__0vlyx3j._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1io8n-9._.js → [root-of-the-server]__12y_xo0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1tyf0tc._.js → [root-of-the-server]__17itmx-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mmefsr._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1yw368c._.js → [root-of-the-server]__1n2vcv4._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1rv-sc9._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1a2hcb_._.js → [root-of-the-server]__1tlvv9a._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0rjgfln._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1fahg9e._.js → _0vo2qyt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0uz7o9y._.js → _0xej-0e._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_04mekdy._.js → _10399ge._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0se484m._.js → _149k9oy._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0r-dsre._.js → _1_hwp06._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_1w8sola._.js → _1mnhi_r._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_1w_6p9g._.js → _1ror7k9._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_1gmzkwj._.js → _1sdgprl._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1vsgpqt._.js → _202d777._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- 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 +15 -15
- package/.next/standalone/.next/static/chunks/0km-jn9o5xyqs.css +2 -0
- package/.next/standalone/.next/static/chunks/{2bie7ajv70p9b.js → 0mot4rr-baiiq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{40-zk44qsg5y-.js → 0pkz6r-cgdr3-.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0cakk77ppmlo7.js → 0ynhunx0nt0n-.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1spk1bub0vd-h.js → 1_0nr2fuuslbb.js} +1 -1
- package/.next/standalone/.next/static/chunks/{23hp7hekegpe5.js → 1tyg866lrq4kh.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0-zh1umoq6ppc.js → 1wn2p7yzbcifa.js} +2 -2
- package/.next/standalone/.next/static/chunks/{1wb8cnmzx69rz.js → 2hiai8kvhjcov.js} +1 -1
- package/.next/standalone/.next/static/chunks/2yy1767yfda67.js +1 -0
- package/.next/standalone/.next/static/chunks/{0_rdbv_k5j51p.js → 2zilodg05qgcf.js} +1 -1
- package/.next/standalone/.next/static/chunks/{298v78ypf8edl.js → 30f--ye1ly8m6.js} +1 -1
- package/.next/standalone/app/policies/hooks-client.tsx +4 -4
- package/.next/standalone/ino.ujh3/.failproofai/VERSION +4 -0
- package/.next/standalone/ino.ujh3/.failproofai/state/last-version +1 -0
- package/.next/standalone/ino.ujh3/.failproofai/state/telemetry-id +1 -0
- package/.next/standalone/package.json +10 -10
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +210 -5
- package/dist/cli.mjs +1158 -1353
- package/dist/worker.mjs +107 -1000
- package/package.json +10 -10
- package/src/hooks/backfill-cli.ts +1 -1
- package/src/hooks/cloud-connection.ts +4 -4
- package/src/hooks/cloud-enrollment-cli.ts +1 -1
- package/src/hooks/cloud-enrollment.ts +3 -3
- package/src/hooks/cloud-managed-policies.ts +60 -22
- package/src/hooks/collector-config.ts +1 -1
- package/src/hooks/configure-wizard.ts +125 -54
- package/src/hooks/custom-hooks-loader.ts +57 -8
- package/src/hooks/daemon-service.ts +84 -12
- package/src/hooks/flush-cli.ts +180 -0
- package/src/hooks/fp-config.ts +242 -118
- package/src/hooks/fp-home.ts +140 -24
- package/src/hooks/fp-reset.ts +357 -43
- package/src/hooks/handler.ts +11 -11
- package/src/hooks/harness-cli.ts +309 -0
- package/src/hooks/hook-activity-store.ts +5 -5
- package/src/hooks/manager.ts +35 -0
- package/src/hooks/onboarding-attempt.ts +22 -6
- package/src/hooks/tui.ts +64 -7
- package/src/hooks/uninstall-cli.ts +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06hexd0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1iny24d._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tyedjt._.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1u-wx42._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +0 -5
- package/.next/standalone/.next/static/chunks/13vrxdsdihqd_.css +0 -2
- package/.next/standalone/.next/static/chunks/2_h--2ame3r83.js +0 -1
- /package/.next/standalone/.next/static/{-3gDrXYxNRTVwrFnqXAWd → ZbPDZe0dNBNdNmo31aq_e}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{-3gDrXYxNRTVwrFnqXAWd → ZbPDZe0dNBNdNmo31aq_e}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{-3gDrXYxNRTVwrFnqXAWd → ZbPDZe0dNBNdNmo31aq_e}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "failproofai",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.14",
|
|
4
4
|
"description": "The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",
|
|
5
5
|
"bin": {
|
|
6
6
|
"failproofai": "./dist/cli.mjs",
|
|
@@ -101,12 +101,12 @@
|
|
|
101
101
|
"html-to-image": "^1.11.13",
|
|
102
102
|
"html2canvas": "^1.4.1",
|
|
103
103
|
"posthog-node": "^5.47.7",
|
|
104
|
-
"smol-toml": "^1.7.1",
|
|
105
104
|
"sql.js": "^1.14.1",
|
|
106
105
|
"yaml": "^2.9.0"
|
|
107
106
|
},
|
|
108
107
|
"overrides": {
|
|
109
108
|
"postcss": "8.5.23",
|
|
109
|
+
"nanoid": "3.3.17",
|
|
110
110
|
"eslint-plugin-react-hooks": "7.0.1",
|
|
111
111
|
"vite": "8.0.16",
|
|
112
112
|
"undici": "7.29.0",
|
|
@@ -114,15 +114,15 @@
|
|
|
114
114
|
"sharp": "0.35.0"
|
|
115
115
|
},
|
|
116
116
|
"optionalDependencies": {
|
|
117
|
-
"@failproofai/failproofaid-linux-x64": "1.0.0-beta.
|
|
118
|
-
"@failproofai/failproofaid-linux-arm64": "1.0.0-beta.
|
|
119
|
-
"@failproofai/failproofaid-darwin-x64": "1.0.0-beta.
|
|
120
|
-
"@failproofai/failproofaid-darwin-arm64": "1.0.0-beta.
|
|
117
|
+
"@failproofai/failproofaid-linux-x64": "1.0.0-beta.14",
|
|
118
|
+
"@failproofai/failproofaid-linux-arm64": "1.0.0-beta.14",
|
|
119
|
+
"@failproofai/failproofaid-darwin-x64": "1.0.0-beta.14",
|
|
120
|
+
"@failproofai/failproofaid-darwin-arm64": "1.0.0-beta.14"
|
|
121
121
|
},
|
|
122
122
|
"failproofaidBinaries": {
|
|
123
|
-
"linux-x64": "
|
|
124
|
-
"linux-arm64": "
|
|
125
|
-
"darwin-x64": "
|
|
126
|
-
"darwin-arm64": "
|
|
123
|
+
"linux-x64": "969fa920cb6e06a607d4a97bd17078519929b9b7cfd78e1bbf4ed6bd8d21e300",
|
|
124
|
+
"linux-arm64": "79caf004fced34e827e7566346fd5b47852e3e8a1fd4e41bb7ecd85e68d76e24",
|
|
125
|
+
"darwin-x64": "0b81018cb2a851c62f5b561d8027dee6897f34cebe32d695ce531c58b70aecf4",
|
|
126
|
+
"darwin-arm64": "eb91832ea41d569110cc58d15efa9e18151d5f13daa6aca2b968e72ab57dee41"
|
|
127
127
|
}
|
|
128
128
|
}
|
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"1.0.0-beta.
|
|
12
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_APP_VERSION":"1.0.0-beta.14"},"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":true,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/failproofai/failproofai","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"useTypeScriptCli":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","outputFileTracingExcludes":{"*":["node_modules/@img/**","node_modules/sharp/**"]},"turbopack":{"root":"/home/runner/work/failproofai/failproofai"},"distDirRoot":".next"}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|
package/bin/failproofai.mjs
CHANGED
|
@@ -271,7 +271,7 @@ if (hookIdx >= 0) {
|
|
|
271
271
|
*/
|
|
272
272
|
async function runCli() {
|
|
273
273
|
// --help / -h (only when not inside a subcommand that handles its own --help)
|
|
274
|
-
const SUBCOMMANDS = ["policies", "policy", "audit", "config", "uninstall", "backfill"];
|
|
274
|
+
const SUBCOMMANDS = ["policies", "policy", "audit", "config", "uninstall", "backfill", "flush", "harness"];
|
|
275
275
|
if ((args.includes("--help") || args.includes("-h")) && !SUBCOMMANDS.includes(args[0])) {
|
|
276
276
|
const extraArgs = args.filter((a) => a !== "--help" && a !== "-h");
|
|
277
277
|
if (extraArgs.length > 0) {
|
|
@@ -286,6 +286,13 @@ USAGE
|
|
|
286
286
|
COMMANDS
|
|
287
287
|
(no args) Launch the policy dashboard
|
|
288
288
|
config Interactive setup — pick scope, agents & policies
|
|
289
|
+
--connect <url> --token <key> Connect to Failproof Cloud non-interactively
|
|
290
|
+
--machine-id <id> Stable id for this machine
|
|
291
|
+
--machine-label <name> Human-readable name in the dashboard
|
|
292
|
+
--no-transcripts Report decisions only, never transcripts
|
|
293
|
+
--disconnect Stop pulling policy and sending activity
|
|
294
|
+
--status Show connection, daemon and pause state
|
|
295
|
+
--pause / --resume Pause or resume enforcement
|
|
289
296
|
|
|
290
297
|
policy add <name> Enable a single policy (see \`policy --help\`)
|
|
291
298
|
policy remove <name> Disable a single policy
|
|
@@ -312,10 +319,50 @@ COMMANDS
|
|
|
312
319
|
|
|
313
320
|
policies --help, -h Show this help for the policies command
|
|
314
321
|
|
|
322
|
+
harness list Show extra capture paths per agent CLI
|
|
323
|
+
harness add-path <h> <path> Also capture sessions from <path> for harness
|
|
324
|
+
<h>. Accepts \`<label>=<path>\`; the label
|
|
325
|
+
namespaces agent ids so two copies of one
|
|
326
|
+
project stay distinct.
|
|
327
|
+
harness remove-path <h> <p> Stop capturing that path
|
|
328
|
+
harness --help, -h Show this help for the harness command
|
|
329
|
+
|
|
330
|
+
Each agent CLI is watched wherever its own installer put it. Extra paths add
|
|
331
|
+
the places it did not: a second profile, a team share, a per-user home.
|
|
332
|
+
|
|
333
|
+
failproofai harness add-path openclaw user1=/srv/.openclaw-user1
|
|
334
|
+
failproofai harness add-path openclaw user2=/srv/.openclaw-user2
|
|
335
|
+
failproofai harness add-path hermes user1=/srv/.hermes-user1/state.db
|
|
336
|
+
|
|
337
|
+
LABEL PER-USER PATHS EXPLICITLY. An agent id comes from the cwd recorded
|
|
338
|
+
inside the transcript, identical in every copy of a project, so unlabelled
|
|
339
|
+
paths merge two people into one agent whose sessions interleave. Omitting the
|
|
340
|
+
label derives one from the folder name — fine for .openclaw-user1, but
|
|
341
|
+
/home/u1/.openclaw and /home/u2/.openclaw both derive "openclaw" and the
|
|
342
|
+
second is refused. A path overlapping one already captured is refused too.
|
|
343
|
+
|
|
344
|
+
FAILPROOFAI_<HARNESS>_EXTRA_PATHS overrides the file for containers:
|
|
345
|
+
FAILPROOFAI_OPENCLAW_EXTRA_PATHS="user1=/srv/.openclaw-user1,user2=/srv/.openclaw-user2"
|
|
346
|
+
|
|
347
|
+
Written to ~/.failproofai/config.json; the daemon picks it up in seconds —
|
|
348
|
+
no restart, no sudo. Session collection must be on for any of it to be read.
|
|
349
|
+
|
|
315
350
|
audit Audit your agent's behavior, then open the
|
|
316
351
|
dashboard at http://localhost:8020/audit
|
|
317
352
|
audit --help, -h Show this help for the audit command
|
|
318
353
|
|
|
354
|
+
backfill Re-send history the collector already read past
|
|
355
|
+
— after clearing the dashboard, re-enrolling a
|
|
356
|
+
machine, or connecting later than the work
|
|
357
|
+
--since <when> How far back: 30d, 6m, or YYYY-MM-DD
|
|
358
|
+
(default: 30 days)
|
|
359
|
+
--dry-run Report what would be re-read, change nothing
|
|
360
|
+
|
|
361
|
+
flush Deliver everything already spooled, now,
|
|
362
|
+
instead of waiting for the next sweep
|
|
363
|
+
--wait Block until the spool drains (or --timeout)
|
|
364
|
+
--timeout <secs> How long to wait with --wait (default: 60)
|
|
365
|
+
|
|
319
366
|
uninstall Remove failproofai from this machine: hook
|
|
320
367
|
entries from every agent CLI, and the daemon
|
|
321
368
|
service. Run this BEFORE \`npm rm -g failproofai\`
|
|
@@ -355,6 +402,10 @@ EXAMPLES
|
|
|
355
402
|
failproofai policies --uninstall --cli opencode
|
|
356
403
|
failproofai policies --uninstall --cli pi
|
|
357
404
|
failproofai policies --uninstall --custom
|
|
405
|
+
failproofai backfill --since 6m
|
|
406
|
+
failproofai backfill --dry-run
|
|
407
|
+
failproofai flush --wait
|
|
408
|
+
failproofai config --status
|
|
358
409
|
|
|
359
410
|
LINKS
|
|
360
411
|
⭐ Star us: https://github.com/failproofai/failproofai
|
|
@@ -419,8 +470,12 @@ LINKS
|
|
|
419
470
|
const isHelpOrVersion =
|
|
420
471
|
args.includes("--help") || args.includes("-h") || args.includes("--version") || args.includes("-v");
|
|
421
472
|
if (args[0] === "audit" && args.includes("--scheduled")) {
|
|
422
|
-
|
|
423
|
-
|
|
473
|
+
// NOT `layoutWarningForHook` — that one answers the hook's question
|
|
474
|
+
// ("are policies unenforced?") and deliberately stays quiet when the
|
|
475
|
+
// global config is readable. This gate is about the LAYOUT, and must
|
|
476
|
+
// fire whenever completing the run would reset the home.
|
|
477
|
+
const { layoutBlockerForScheduledRun } = await import("../src/hooks/fp-reset");
|
|
478
|
+
const warning = layoutBlockerForScheduledRun();
|
|
424
479
|
if (warning) {
|
|
425
480
|
// Exit 1, not 75: 75 means "another audit holds the lock" and is retried
|
|
426
481
|
// in fifteen minutes, which here would just re-warn four times an hour
|
|
@@ -487,6 +542,72 @@ LINKS
|
|
|
487
542
|
// over. Every precondition a person can get wrong is still checked HERE,
|
|
488
543
|
// synchronously, because reporting success and leaving the real failure in the
|
|
489
544
|
// journal is what already cost twenty minutes on a live machine.
|
|
545
|
+
if (args[0] === "flush") {
|
|
546
|
+
const subArgs = args.slice(1);
|
|
547
|
+
if (subArgs.includes("--help") || subArgs.includes("-h")) {
|
|
548
|
+
console.log(`
|
|
549
|
+
failproofai flush — deliver what is already spooled, now
|
|
550
|
+
|
|
551
|
+
USAGE
|
|
552
|
+
failproofai flush [--wait] [--timeout <secs>]
|
|
553
|
+
|
|
554
|
+
WHY
|
|
555
|
+
The collector is unhurried on purpose: a batch is swept once it is older than
|
|
556
|
+
two minutes, at most 64 per pass, on a 60-second cadence. That pacing keeps a
|
|
557
|
+
backlog from stampeding the server, and it is exactly wrong when you are
|
|
558
|
+
standing at a dashboard waiting to see your own events — "not delivered yet"
|
|
559
|
+
and "not working" look identical from there.
|
|
560
|
+
|
|
561
|
+
This asks the daemon to make a pass right now, with no minimum age and no
|
|
562
|
+
per-pass cap. It re-sends nothing: only batches already spooled and not yet
|
|
563
|
+
delivered. For history the collector has already read past, use \`backfill\`.
|
|
564
|
+
|
|
565
|
+
OPTIONS
|
|
566
|
+
--wait Block until the spool drains, or --timeout elapses.
|
|
567
|
+
--timeout <secs> How long --wait waits. Default: 60.
|
|
568
|
+
`);
|
|
569
|
+
process.exit(0);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
const KNOWN = new Set(["--wait", "--timeout"]);
|
|
573
|
+
const unknown = subArgs.find(
|
|
574
|
+
(a, i) => a.startsWith("-") && !KNOWN.has(a) && subArgs[i - 1] !== "--timeout",
|
|
575
|
+
);
|
|
576
|
+
if (unknown) {
|
|
577
|
+
throw new CliError(`Unexpected argument: ${unknown}\nRun \`failproofai flush --help\` for usage.`);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
let timeoutSecs;
|
|
581
|
+
const tIdx = subArgs.indexOf("--timeout");
|
|
582
|
+
if (tIdx >= 0) {
|
|
583
|
+
const raw = subArgs[tIdx + 1];
|
|
584
|
+
if (!raw || raw.startsWith("-")) throw new CliError("Missing value after --timeout.");
|
|
585
|
+
const n = Number(raw);
|
|
586
|
+
// Rejected rather than coerced: NaN would silently become "wait forever
|
|
587
|
+
// or not at all" depending on the comparison, and neither is what was asked.
|
|
588
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
589
|
+
throw new CliError(`Could not read --timeout ${raw}. Give a number of seconds.`);
|
|
590
|
+
}
|
|
591
|
+
timeoutSecs = n;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
lastSubcommand = "flush";
|
|
595
|
+
const { runFlushCommand } = await import("../src/hooks/flush-cli");
|
|
596
|
+
const result = await runFlushCommand({ wait: subArgs.includes("--wait"), timeoutSecs });
|
|
597
|
+
for (const line of result.lines) {
|
|
598
|
+
if (result.exitCode === 0) console.log(line);
|
|
599
|
+
else console.error(line);
|
|
600
|
+
}
|
|
601
|
+
await track("cli_flush", {
|
|
602
|
+
ok: result.exitCode === 0,
|
|
603
|
+
waited: subArgs.includes("--wait"),
|
|
604
|
+
pending: result.pending,
|
|
605
|
+
});
|
|
606
|
+
lastSubcommand = null;
|
|
607
|
+
await exitAfterFlush(result.exitCode);
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
|
|
490
611
|
if (args[0] === "backfill") {
|
|
491
612
|
const subArgs = args.slice(1);
|
|
492
613
|
if (subArgs.includes("--help") || subArgs.includes("-h")) {
|
|
@@ -557,6 +678,84 @@ OPTIONS
|
|
|
557
678
|
return;
|
|
558
679
|
}
|
|
559
680
|
|
|
681
|
+
// harness list | add-path | remove-path
|
|
682
|
+
//
|
|
683
|
+
// Extra capture paths per harness. Writes ~/.failproofai/config.toml and
|
|
684
|
+
// nothing else — no root, no daemon call — so it works on a machine whose
|
|
685
|
+
// daemon is stopped, which is when someone is most likely to be fixing what
|
|
686
|
+
// it captures.
|
|
687
|
+
if (args[0] === "harness") {
|
|
688
|
+
const subArgs = args.slice(1);
|
|
689
|
+
if (subArgs.length === 0 || subArgs.includes("--help") || subArgs.includes("-h")) {
|
|
690
|
+
console.log(`
|
|
691
|
+
failproofai harness — capture sessions from more than one location per agent CLI
|
|
692
|
+
|
|
693
|
+
USAGE
|
|
694
|
+
failproofai harness list [<harness>]
|
|
695
|
+
failproofai harness add-path <harness> [<label>=]<path>
|
|
696
|
+
failproofai harness remove-path <harness> <path|label>
|
|
697
|
+
|
|
698
|
+
WHY
|
|
699
|
+
Each agent CLI is watched wherever its own installer put it — ~/.claude/projects,
|
|
700
|
+
~/.hermes/state.db, and so on. That misses every other arrangement: a second
|
|
701
|
+
profile, a mounted team share, a container's home beside the host's, an agent
|
|
702
|
+
an operator moved. Those hold real sessions and nothing collects them.
|
|
703
|
+
|
|
704
|
+
THE LABEL
|
|
705
|
+
An entry is \`<path>\` or \`<label>=<path>\`. The label namespaces agent ids as
|
|
706
|
+
<label>-<agentId>, and it matters: two locations holding the same project
|
|
707
|
+
derive the SAME id (it comes from the cwd inside the transcript, identical in
|
|
708
|
+
both copies), so without a label they merge into one agent whose sessions
|
|
709
|
+
interleave from two machines' worth of history. Omit it and one is derived
|
|
710
|
+
from the folder name.
|
|
711
|
+
|
|
712
|
+
HARNESSES
|
|
713
|
+
claude, codex, copilot, openclaw, pi, factory, antigravity, cursor,
|
|
714
|
+
goose, opencode, devin, hermes
|
|
715
|
+
|
|
716
|
+
\`claude\` covers subagent transcripts too — they live under the same root.
|
|
717
|
+
|
|
718
|
+
NOTES
|
|
719
|
+
• Session collection must be on for any of this to be read; extra paths live
|
|
720
|
+
under "collector" in ~/.failproofai/config.json like the default ones do.
|
|
721
|
+
• A path overlapping one already captured is REFUSED by the daemon at startup
|
|
722
|
+
rather than collected twice under two ids. It says so in the journal.
|
|
723
|
+
• Two entries sharing a LABEL are refused too: they would share one cursor
|
|
724
|
+
directory, whose whole map is written at once, so each would clobber the
|
|
725
|
+
other's watermark and re-read from zero after every restart.
|
|
726
|
+
• Takes effect within seconds — the daemon re-reads config.json on an interval
|
|
727
|
+
and cycles its collector. No restart, no sudo.
|
|
728
|
+
|
|
729
|
+
EXAMPLES
|
|
730
|
+
failproofai harness add-path claude work=/srv/team/.claude/projects
|
|
731
|
+
failproofai harness add-path hermes prod=/srv/hermes-prod/state.db
|
|
732
|
+
failproofai harness add-path codex /mnt/other-home/.codex/sessions
|
|
733
|
+
failproofai harness list
|
|
734
|
+
failproofai harness remove-path claude work
|
|
735
|
+
|
|
736
|
+
`.trimStart());
|
|
737
|
+
process.exit(0);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
lastSubcommand = "harness";
|
|
741
|
+
const { runHarnessCommand } = await import("../src/hooks/harness-cli");
|
|
742
|
+
const result = runHarnessCommand(subArgs);
|
|
743
|
+
for (const line of result.lines) {
|
|
744
|
+
if (result.exitCode === 0) console.log(line);
|
|
745
|
+
else console.error(line);
|
|
746
|
+
}
|
|
747
|
+
await track("cli_harness", {
|
|
748
|
+
ok: result.exitCode === 0,
|
|
749
|
+
// The subcommand only — never the harness name, the label or the path.
|
|
750
|
+
// A path is a value the user typed, and `enterprise-docs/product-analytics.md`
|
|
751
|
+
// promises we send shape, never value.
|
|
752
|
+
sub: ["list", "add-path", "remove-path"].includes(subArgs[0]) ? subArgs[0] : "unknown",
|
|
753
|
+
});
|
|
754
|
+
lastSubcommand = null;
|
|
755
|
+
await exitAfterFlush(result.exitCode);
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
|
|
560
759
|
// uninstall [--purge] [--dry-run] [--yes|-y]
|
|
561
760
|
//
|
|
562
761
|
// Top-level, and deliberately NOT a flag on `policies`. `policies --uninstall`
|
|
@@ -1115,7 +1314,7 @@ USAGE
|
|
|
1115
1314
|
WHAT IT DOES
|
|
1116
1315
|
Walks you through 4 quick steps and writes everything for you:
|
|
1117
1316
|
1. Where — global (all projects) or just this project
|
|
1118
|
-
2.
|
|
1317
|
+
2. Harnesses — which agent CLIs to protect (Claude, Codex, ...)
|
|
1119
1318
|
3. Policies — presets (combine any), Everything, or a custom pick
|
|
1120
1319
|
4. Review — confirms the exact files it will change, then applies
|
|
1121
1320
|
|
|
@@ -1124,7 +1323,13 @@ FAILPROOF CLOUD
|
|
|
1124
1323
|
Connect this machine to Failproof Cloud
|
|
1125
1324
|
[--no-transcripts] decisions only, no transcripts
|
|
1126
1325
|
failproofai config --disconnect Stop pulling policy and sending activity
|
|
1127
|
-
failproofai config --status Show connection and pause state
|
|
1326
|
+
failproofai config --status Show connection, daemon and pause state
|
|
1327
|
+
failproofai config --pause [--session <id>]
|
|
1328
|
+
Pause enforcement, time-boxed
|
|
1329
|
+
failproofai config --resume [--all]
|
|
1330
|
+
Resume enforcement
|
|
1331
|
+
|
|
1332
|
+
--machine-label <name> Human-readable name in the dashboard
|
|
1128
1333
|
|
|
1129
1334
|
One connection, two capabilities: this machine PULLS centrally-managed
|
|
1130
1335
|
policies and SENDS what its hooks decided, so the dashboard shows the fleet
|