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.
Files changed (175) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js +2 -3
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js +2 -3
  18. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  22. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  23. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  24. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  25. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  26. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  27. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/.next/standalone/.next/server/app/api/audit/invite/route.js +2 -2
  29. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/audit/run/route.js +2 -2
  31. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +3 -2
  34. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +2 -2
  36. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/auth/logout/route.js +2 -2
  38. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/auth/reminder/route.js +2 -2
  40. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/auth/status/route.js +2 -2
  42. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  45. package/.next/standalone/.next/server/app/audit/page.js +2 -3
  46. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/index.html +1 -1
  49. package/.next/standalone/.next/server/app/index.rsc +15 -15
  50. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  51. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  52. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  53. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  54. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  55. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  56. package/.next/standalone/.next/server/app/page.js +2 -3
  57. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +10 -10
  60. package/.next/standalone/.next/server/app/policies/page.js +2 -3
  61. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  64. package/.next/standalone/.next/server/app/project/[name]/page.js +3 -4
  65. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  68. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  69. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +3 -4
  70. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  73. package/.next/standalone/.next/server/app/projects/page.js +3 -4
  74. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
  77. package/.next/standalone/.next/server/app/settings/page.js +2 -3
  78. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1a7i2q4._.js → [root-of-the-server]__00ni9za._.js} +1 -1
  81. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08y94xv._.js +3 -0
  82. package/.next/standalone/.next/server/chunks/[root-of-the-server]__094p1f1._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ed01_d._.js +1 -1
  85. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1_ps0jw._.js → [root-of-the-server]__0effm9m._.js} +1 -1
  86. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lk_935._.js → [root-of-the-server]__0ix8gm7._.js} +1 -1
  87. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ky_n0r._.js → [root-of-the-server]__0ji11a-._.js} +1 -1
  88. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0v2fpxe._.js → [root-of-the-server]__0ojwjxl._.js} +1 -1
  89. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vb5fl2._.js +3 -0
  90. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ibjy5x._.js +1 -1
  91. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +1 -1
  92. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1uyc-z4._.js +3 -0
  93. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20d06rh._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +1 -3
  95. package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +1 -3
  96. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  97. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1rdruw4._.js → [root-of-the-server]__0_1tiya._.js} +1 -1
  98. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spkm68._.js +3 -3
  99. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ha3gul._.js → [root-of-the-server]__0vlyx3j._.js} +2 -2
  100. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1io8n-9._.js → [root-of-the-server]__12y_xo0._.js} +2 -2
  101. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1tyf0tc._.js → [root-of-the-server]__17itmx-._.js} +2 -2
  102. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mmefsr._.js +5 -0
  103. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1yw368c._.js → [root-of-the-server]__1n2vcv4._.js} +1 -1
  104. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1rv-sc9._.js +1 -1
  105. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1a2hcb_._.js → [root-of-the-server]__1tlvv9a._.js} +1 -1
  106. package/.next/standalone/.next/server/chunks/ssr/_0rjgfln._.js +1 -1
  107. package/.next/standalone/.next/server/chunks/ssr/{_1fahg9e._.js → _0vo2qyt._.js} +2 -2
  108. package/.next/standalone/.next/server/chunks/ssr/{_0uz7o9y._.js → _0xej-0e._.js} +2 -2
  109. package/.next/standalone/.next/server/chunks/ssr/{_04mekdy._.js → _10399ge._.js} +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/{_0se484m._.js → _149k9oy._.js} +2 -2
  111. package/.next/standalone/.next/server/chunks/ssr/{_0r-dsre._.js → _1_hwp06._.js} +2 -2
  112. package/.next/standalone/.next/server/chunks/ssr/{_1w8sola._.js → _1mnhi_r._.js} +2 -2
  113. package/.next/standalone/.next/server/chunks/ssr/{_1w_6p9g._.js → _1ror7k9._.js} +2 -2
  114. package/.next/standalone/.next/server/chunks/ssr/{_1gmzkwj._.js → _1sdgprl._.js} +1 -1
  115. package/.next/standalone/.next/server/chunks/ssr/{_1vsgpqt._.js → _202d777._.js} +1 -1
  116. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  117. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  118. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  119. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  120. package/.next/standalone/.next/server/pages/404.html +1 -1
  121. package/.next/standalone/.next/server/pages/500.html +1 -1
  122. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/server-reference-manifest.json +15 -15
  124. package/.next/standalone/.next/static/chunks/0km-jn9o5xyqs.css +2 -0
  125. package/.next/standalone/.next/static/chunks/{2bie7ajv70p9b.js → 0mot4rr-baiiq.js} +1 -1
  126. package/.next/standalone/.next/static/chunks/{40-zk44qsg5y-.js → 0pkz6r-cgdr3-.js} +1 -1
  127. package/.next/standalone/.next/static/chunks/{0cakk77ppmlo7.js → 0ynhunx0nt0n-.js} +1 -1
  128. package/.next/standalone/.next/static/chunks/{1spk1bub0vd-h.js → 1_0nr2fuuslbb.js} +1 -1
  129. package/.next/standalone/.next/static/chunks/{23hp7hekegpe5.js → 1tyg866lrq4kh.js} +1 -1
  130. package/.next/standalone/.next/static/chunks/{0-zh1umoq6ppc.js → 1wn2p7yzbcifa.js} +2 -2
  131. package/.next/standalone/.next/static/chunks/{1wb8cnmzx69rz.js → 2hiai8kvhjcov.js} +1 -1
  132. package/.next/standalone/.next/static/chunks/2yy1767yfda67.js +1 -0
  133. package/.next/standalone/.next/static/chunks/{0_rdbv_k5j51p.js → 2zilodg05qgcf.js} +1 -1
  134. package/.next/standalone/.next/static/chunks/{298v78ypf8edl.js → 30f--ye1ly8m6.js} +1 -1
  135. package/.next/standalone/app/policies/hooks-client.tsx +4 -4
  136. package/.next/standalone/ino.ujh3/.failproofai/VERSION +4 -0
  137. package/.next/standalone/ino.ujh3/.failproofai/state/last-version +1 -0
  138. package/.next/standalone/ino.ujh3/.failproofai/state/telemetry-id +1 -0
  139. package/.next/standalone/package.json +10 -10
  140. package/.next/standalone/server.js +1 -1
  141. package/bin/failproofai.mjs +210 -5
  142. package/dist/cli.mjs +1158 -1353
  143. package/dist/worker.mjs +107 -1000
  144. package/package.json +10 -10
  145. package/src/hooks/backfill-cli.ts +1 -1
  146. package/src/hooks/cloud-connection.ts +4 -4
  147. package/src/hooks/cloud-enrollment-cli.ts +1 -1
  148. package/src/hooks/cloud-enrollment.ts +3 -3
  149. package/src/hooks/cloud-managed-policies.ts +60 -22
  150. package/src/hooks/collector-config.ts +1 -1
  151. package/src/hooks/configure-wizard.ts +125 -54
  152. package/src/hooks/custom-hooks-loader.ts +57 -8
  153. package/src/hooks/daemon-service.ts +84 -12
  154. package/src/hooks/flush-cli.ts +180 -0
  155. package/src/hooks/fp-config.ts +242 -118
  156. package/src/hooks/fp-home.ts +140 -24
  157. package/src/hooks/fp-reset.ts +357 -43
  158. package/src/hooks/handler.ts +11 -11
  159. package/src/hooks/harness-cli.ts +309 -0
  160. package/src/hooks/hook-activity-store.ts +5 -5
  161. package/src/hooks/manager.ts +35 -0
  162. package/src/hooks/onboarding-attempt.ts +22 -6
  163. package/src/hooks/tui.ts +64 -7
  164. package/src/hooks/uninstall-cli.ts +1 -1
  165. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06hexd0._.js +0 -3
  166. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1iny24d._.js +0 -3
  167. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tyedjt._.js +0 -3
  168. package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +0 -5
  169. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1u-wx42._.js +0 -4
  170. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +0 -5
  171. package/.next/standalone/.next/static/chunks/13vrxdsdihqd_.css +0 -2
  172. package/.next/standalone/.next/static/chunks/2_h--2ame3r83.js +0 -1
  173. /package/.next/standalone/.next/static/{-3gDrXYxNRTVwrFnqXAWd → ZbPDZe0dNBNdNmo31aq_e}/_buildManifest.js +0 -0
  174. /package/.next/standalone/.next/static/{-3gDrXYxNRTVwrFnqXAWd → ZbPDZe0dNBNdNmo31aq_e}/_clientMiddlewareManifest.js +0 -0
  175. /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.12",
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.12",
118
- "@failproofai/failproofaid-linux-arm64": "1.0.0-beta.12",
119
- "@failproofai/failproofaid-darwin-x64": "1.0.0-beta.12",
120
- "@failproofai/failproofaid-darwin-arm64": "1.0.0-beta.12"
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": "3a17bf65b24cc16cd907578cbb90158b5ec53f12fb133c3d4b37a02e3c41ff98",
124
- "linux-arm64": "d341762677d7dbdcf03321d803d97b41ad12f4b903d766cf45b4d5258bf4ed93",
125
- "darwin-x64": "d17e95386c51bcefbb845d67134c64e1a269cbb444beed1801e4181ab976ab23",
126
- "darwin-arm64": "e8987ecfa755dedc3bc4470bde25a54838735a7a1cefa4b9c9225dd868503f44"
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"},"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"}
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
 
@@ -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
- const { layoutWarningForHook } = await import("../src/hooks/fp-reset");
423
- const warning = layoutWarningForHook();
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. Assistants — which agent CLIs to protect (Claude, Codex, ...)
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