failproofai 1.0.5 → 1.0.6-beta.1
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 +5 -5
- package/.next/standalone/.next/prerender-manifest.json +5 -5
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- 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 +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
- 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 +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- 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 +4 -4
- 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.nft.json +1 -1
- 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.nft.json +1 -1
- 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/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- 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 +14 -14
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page/build-manifest.json +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/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
- package/.next/standalone/.next/server/app/policies/page.js +6 -5
- 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/build-manifest.json +2 -2
- 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 +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/build-manifest.json +2 -2
- 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 +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/build-manifest.json +2 -2
- 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/app/settings/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
- package/.next/standalone/.next/server/app/settings/page.js +3 -2
- 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/[externals]__0sds_16._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zlqo2t._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__112b4go._.js → [root-of-the-server]__1_r2rbg._.js} +4 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1anxb5k._.js +1 -1
- package/.next/standalone/.next/server/chunks/_09dz7xv._.js +3 -3
- package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +2 -2
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +2 -2
- 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]__0-_ki57._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0576iuy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bym1os._.js → [root-of-the-server]__0cg-bgc._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__00y9ww2._.js → [root-of-the-server]__0u3w0ll._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0sz_5na._.js → [root-of-the-server]__1ouobn4._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1py795m._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qapotl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__15k-dqb._.js → [root-of-the-server]__1x3j9mj._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0-yi74u._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_06imw3p._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0guaevg._.js → _0qlygw6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0wso5d3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1-3unkg._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1b78kcp._.js → _1_ddpm3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_14c6q09._.js → _1_qswah._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1ddpc5g._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1es2j7i._.js +3 -3
- package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +12 -11
- 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_components_project-list_tsx_1ke6anr._.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 +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1hl81y4._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
- 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 +19 -19
- package/.next/standalone/.next/static/chunks/{3w46euc60dx39.js → 02vwr5js1x28j.js} +1 -1
- package/.next/standalone/.next/static/chunks/06fjx8-0_qufs.js +1 -0
- package/.next/standalone/.next/static/chunks/{2zafgs90r_leq.js → 06jxjnw8bfczc.js} +1 -1
- package/.next/standalone/.next/static/chunks/0cbvytf8epn34.js +1 -0
- package/.next/standalone/.next/static/chunks/0y227_ohdqwvn.js +1 -0
- package/.next/standalone/.next/static/chunks/{252xreaecy80h.js → 1p4xauf-zu6zk.js} +1 -1
- package/.next/standalone/.next/static/chunks/{021ydrq6rhpsi.js → 1qf2uiipatr80.js} +1 -1
- package/.next/standalone/.next/static/chunks/1uc_s_dftgxiq.js +6 -0
- package/.next/standalone/.next/static/chunks/1xacnwjkbekn7.js +1 -0
- package/.next/standalone/.next/static/chunks/{11s_v03ub6nss.js → 27_bwbg8sv6vj.js} +1 -1
- package/.next/standalone/.next/static/chunks/2hg_bp8z_vm2g.js +1 -0
- package/.next/standalone/.next/static/chunks/{3bleyy40s99f2.js → 2x776s0x3n_tu.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1vb33xa6j9y2q.js → 3ht0xsco46pul.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-3p73obe0xmrxm.js → turbopack-38nzuvp95_2rv.js} +1 -1
- package/.next/standalone/fp-cloud-cli/uv.lock +3 -3
- package/.next/standalone/hermes-plugin/README.md +138 -0
- package/.next/standalone/hermes-plugin/__init__.py +248 -0
- package/.next/standalone/hermes-plugin/client.py +150 -0
- package/.next/standalone/hermes-plugin/ledger.py +187 -0
- package/.next/standalone/hermes-plugin/plugin.yaml +37 -0
- package/.next/standalone/lib/hermes-profiles.ts +67 -19
- package/.next/standalone/lib/hermes-sessions.ts +3 -2
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/app-render/create-component-styles-and-scripts.js +2 -1
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +14 -0
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/disk-lru-cache.external.js +7 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +6 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +10 -10
- package/.next/standalone/node_modules/react/cjs/react.development.js +92 -46
- package/.next/standalone/node_modules/react/cjs/react.production.js +112 -89
- package/.next/standalone/node_modules/react/package.json +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1165 -790
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1171 -791
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +1294 -862
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +1305 -868
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +1315 -896
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +24 -5
- package/.next/standalone/node_modules/react-dom/package.json +4 -4
- package/.next/standalone/package.json +13 -12
- package/.next/standalone/sdk/python/uv.lock +18 -18
- package/.next/standalone/server.js +1 -1
- package/README.md +29 -13
- package/bin/failproofai.mjs +3 -1
- package/dist/cli.mjs +655 -360
- package/dist/worker.mjs +78 -34
- package/hermes-plugin/README.md +138 -0
- package/hermes-plugin/__init__.py +248 -0
- package/hermes-plugin/client.py +150 -0
- package/hermes-plugin/ledger.py +187 -0
- package/hermes-plugin/plugin.yaml +37 -0
- package/lib/hermes-profiles.ts +67 -19
- package/lib/hermes-sessions.ts +3 -2
- package/package.json +13 -12
- package/scripts/translate-docs/validate-translation.ts +48 -0
- package/src/hooks/handler.ts +29 -1
- package/src/hooks/integrations.ts +271 -73
- package/src/hooks/manager.ts +41 -7
- package/src/hooks/types.ts +8 -8
- package/src/hooks/worker-server.ts +1 -0
- package/.next/standalone/.next/server/chunks/[externals]__157pf8j._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +0 -6
- package/.next/standalone/.next/server/chunks/ssr/node_modules_13n822a._.js +0 -3
- package/.next/standalone/.next/static/chunks/0y8_1s45gbqmn.js +0 -6
- package/.next/standalone/.next/static/chunks/14b3ezufe5411.js +0 -1
- package/.next/standalone/.next/static/chunks/1oskk7pdo8aon.js +0 -1
- package/.next/standalone/.next/static/chunks/2xycd6mjg00fb.js +0 -1
- package/.next/standalone/.next/static/chunks/3l36d73kj18zw.js +0 -1
- package/.next/standalone/.next/static/chunks/40lpt2o2b283e.js +0 -1
- /package/.next/standalone/.next/static/{uFpAs_vIXSo6qBzmkXPWD → QCNYz2yCxxdeggg1k0iEq}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{uFpAs_vIXSo6qBzmkXPWD → QCNYz2yCxxdeggg1k0iEq}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{uFpAs_vIXSo6qBzmkXPWD → QCNYz2yCxxdeggg1k0iEq}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,43418,e=>{"use strict";var t=e.i(43476),r=e.i(24578);e.s(["CliBadge",0,function({cli:e}){let a=(0,r.getCliLabel)(e),n=(0,r.getCliBadgeClasses)(e);return(0,t.jsx)("span",{className:`inline-flex items-center rounded px-1.5 py-0.5 text-[0.6rem] font-mono font-medium uppercase tracking-wider border ${n}`,title:`Agent CLI: ${a}`,children:a})}])},73520,e=>{"use strict";var t=e.i(43476),r=e.i(24071),a=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:n,onPageChange:l}){if(n<=1)return null;let o=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>l(e-1),disabled:1===e,className:o(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(r.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(n<=7)return Array.from({length:n},(e,t)=>t+1);let t=[1],r=Math.max(2,e-1),a=Math.min(n-1,e+1);e<=3&&(a=Math.min(5,n-1)),e>=n-2&&(r=Math.max(2,n-4)),r>2&&t.push("ellipsis-start");for(let e=r;e<=a;e++)t.push(e);return a<n-1&&t.push("ellipsis-end"),t.push(n),t})().map(r=>"string"==typeof r?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},r):(0,t.jsx)("button",{onClick:()=>l(r),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===r?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${r}`,"aria-current":e===r?"page":void 0,children:r},r))}),(0,t.jsxs)("button",{onClick:()=>l(e+1),disabled:e===n,className:o(e===n),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(a.ChevronRight,{className:"w-4 h-4"})]})]})}])},62481,e=>{"use strict";var t=e.i(43476),r=e.i(71645),a=e.i(43418);e.i(45425),e.i(41790);let n=/^[a-z]{2,}:/;function l(e){return!!e&&n.test(e)}var o=e.i(62706),s=e.i(20087),i=e.i(30005),d=e.i(80060),c=e.i(2711),u=e.i(24578);function m(e,t,r){return{key:e,label:t,depth:r,children:new Map,projectCount:0,lastModified:new Date(0),cli:[]}}function f(e,t){for(let r of(t.lastModified.getTime()>e.lastModified.getTime()&&(e.lastModified=t.lastModified,e.lastModifiedFormatted=t.lastModifiedFormatted),"number"==typeof t.sessionCount&&(e.sessionCount=(e.sessionCount??0)+t.sessionCount),e.projectCount+=1,t.cli))e.cli.includes(r)||e.cli.push(r)}function h(e){let t=[...e.children.values()].map(h).sort((e,t)=>t.lastModified.getTime()-e.lastModified.getTime());return{key:e.key,label:e.label,depth:e.depth,children:t,project:e.project,sessionCount:e.sessionCount,projectCount:e.projectCount,lastModified:e.lastModified,lastModifiedFormatted:e.lastModifiedFormatted,cli:e.cli}}var g=e.i(16327),p=e.i(67927),x=e.i(56420);let b={name:"folder",size:24,node:[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]};b.node;let v=(0,x.default)(b);var y=e.i(66595),C=e.i(63676),j=e.i(22016),w=e.i(73520),N=e.i(85898);function k({date:e,formatted:r}){return(0,t.jsx)("span",{children:r||(0,o.formatDate)(e)})}let M="failproofai.projects.collapsed";function T(e){try{window.localStorage.setItem(M,JSON.stringify([...e]))}catch{}}function S({node:e,collapsed:r,interactive:n,onToggle:o}){let s=e.children.length>0,i=e.project,d=r?p.ChevronRight:g.ChevronDown,c={paddingLeft:`${1.25*Math.min(e.depth,4)}rem`};return(0,t.jsxs)("tr",{className:"border-b border-border hover:bg-muted/50 transition-colors",children:[(0,t.jsx)("td",{className:"px-4 py-3",children:(0,t.jsx)("div",{style:c,children:(0,t.jsx)(v,{className:`w-5 h-5 ${s?"text-muted-foreground":"text-primary"}`})})}),(0,t.jsx)("td",{className:"px-4 py-3 max-w-md",children:(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",style:c,children:[s?n?(0,t.jsxs)("button",{type:"button",onClick:()=>o(e.key),"aria-expanded":!r,"aria-label":`${r?"Expand":"Collapse"} ${e.label}`,className:"flex items-center gap-1 font-semibold text-foreground hover:text-primary transition-colors break-words break-all text-left",children:[(0,t.jsx)(d,{className:"w-4 h-4 shrink-0"}),e.label]}):(0,t.jsxs)("span",{className:"flex items-center gap-1 font-semibold text-foreground break-words break-all",children:[(0,t.jsx)(d,{className:"w-4 h-4 shrink-0"}),e.label]}):i?(0,t.jsx)(j.default,{href:`/project/${encodeURIComponent(i.name)}`,className:"font-semibold text-foreground hover:text-primary transition-colors break-words break-all inline-block max-w-full",children:e.depth>0?e.label:function(e,t){return l(t)?t.replace(/:/g,"/"):/^[A-Za-z]--/.test(e)?e[0]+":/"+e.slice(3).replace(/-/g,"/"):e.replace(/-/g,"/")}(i.name,i.path)}):(0,t.jsx)("span",{className:"font-semibold text-foreground",children:e.label}),e.cli.map(e=>(0,t.jsx)(a.CliBadge,{cli:e},e)),s&&void 0!==e.sessionCount&&(0,t.jsxs)("span",{className:"text-xs text-muted-foreground",children:[e.sessionCount," session",1===e.sessionCount?"":"s"]})]})}),(0,t.jsx)("td",{className:"px-4 py-3 text-sm text-muted-foreground hidden md:table-cell truncate max-w-md",children:i?i.path:""}),(0,t.jsx)("td",{className:"px-4 py-3 text-sm text-muted-foreground",children:(0,t.jsx)(k,{date:e.lastModified,formatted:e.lastModifiedFormatted})})]})}e.s(["default",0,function({folders:e}){let a=(0,d.useUrlParams)(),n=(0,r.useRef)(!1),[o,g]=(0,r.useState)(()=>(0,c.paramToKeywords)(a.get("q"))),[p,x]=(0,r.useState)(""),[b,v]=(0,r.useState)(()=>{let e=a.get("cli");return(0,u.isKnownCli)(e)?e:""}),{filterPreset:j,dateRange:k,currentPage:A,setCurrentPage:P,handlePresetChange:D,handleDateRangeChange:E,clearFilters:R}=(0,i.useFilterState)(o,{filterPreset:(0,c.paramToPreset)(a.get("preset")),dateRange:(0,c.paramsToDateRange)(a.get("from"),a.get("to")),currentPage:(0,c.paramToPage)(a.get("page"))});(0,r.useEffect)(()=>{if(!n.current){n.current=!0;return}a.setAll({preset:(0,c.presetToParam)(j),...(0,c.dateRangeToParams)(k),q:(0,c.keywordsToParam)(o),page:(0,c.pageToParam)(A),cli:b||void 0})},[j,k,o,A,b]);let I=e=>{let t=e.trim();t&&!o.includes(t)&&(g([...o,t]),x(""))},L=()=>{g([]),x("")},_=(0,r.useMemo)(()=>(0,s.rehydrateDates)(e),[e]),O=(0,r.useMemo)(()=>{let e=(0,s.filterByDate)(_,j,k);return o.length>0&&(e=e.filter(e=>{let t=e.name.toLowerCase();return o.every(e=>{let r=e.trim().toLowerCase().replace(/\//g,"-");return 0===r.length||t.includes(r)})})),b&&(e=e.filter(e=>e.cli.includes(b))),e.sort((e,t)=>t.lastModified.getTime()-e.lastModified.getTime())},[_,j,k,o,b]),$=(0,r.useMemo)(()=>(function(e){let t=new Map;for(let a of e){var r;let e,n=l(r=a.path)?r.split(":"):[];if(0===n.length){let e=m(`project:${a.name}`,a.name,0);e.project=a,f(e,a),t.set(e.key,e);continue}let o=t,s="";for(let t=0;t<n.length;t++){let r=n[t];s=0===t?r:`${s}:${r}`;let l=o.get(s);l||(l=m(s,r,t),o.set(s,l)),f(l,a),e=l,o=l.children}e&&!e.project&&(e.project=a)}return[...t.values()].map(h).sort((e,t)=>t.lastModified.getTime()-e.lastModified.getTime())})(O),[O]),F=Math.max(1,Math.ceil($.length/s.ITEMS_PER_PAGE));(0,r.useEffect)(()=>{A>F&&P(F)},[A,F,P]);let U=(A-1)*s.ITEMS_PER_PAGE,z=Math.min(U+s.ITEMS_PER_PAGE,$.length),K=(0,r.useMemo)(()=>$.slice(U,z),[$,U,z]),B=$.slice(0,U).reduce((e,t)=>e+t.projectCount,0),G=K.reduce((e,t)=>e+t.projectCount,0),[H,q]=(0,r.useState)(()=>new Set);(0,r.useEffect)(()=>{q(new Set(function(){try{let e=window.localStorage.getItem(M),t=e?JSON.parse(e):null;return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}()))},[]);let J=e=>{q(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),T(r),r})},V=o.length>0,X=(0,r.useMemo)(()=>{var e;let t,r;return e=e=>!V&&H.has(e),t=[],(r=a=>{for(let n of a)t.push(n),n.children.length>0&&!e(n.key)&&r(n.children)})(K),t},[K,H,V]),W=(0,r.useMemo)(()=>{let e,t;return e=[],(t=r=>{for(let a of r)a.children.length>0&&(e.push(a.key),t(a.children))})(K),e},[K]),Y=X.filter(e=>e.children.length>0).map(e=>e.key).some(e=>!H.has(e));return(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)("div",{className:"bg-card border border-border rounded-lg p-4",children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Filter by:"}),s.FILTER_PRESETS.map(e=>(0,t.jsx)("button",{onClick:()=>D(e.value),className:`px-3 py-1.5 text-sm rounded-md transition-colors ${j===e.value?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,children:e.label},e.value)),(0,t.jsx)("span",{className:"ml-2 text-sm font-medium text-foreground",children:"CLI:"}),(0,t.jsxs)("select",{"aria-label":"Filter by CLI",value:b,onChange:e=>{let t=e.target.value;v(""===t||(0,u.isKnownCli)(t)?t:"")},className:"px-2 py-1.5 text-sm bg-input border border-border rounded-md text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent",children:[(0,t.jsx)("option",{value:"",children:"All CLIs"}),u.KNOWN_CLI_IDS.map(e=>(0,t.jsx)("option",{value:e,children:(0,u.getCliLabel)(e)},e))]})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(y.Search,{className:"w-4 h-4 text-muted-foreground"}),(0,t.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Search Keywords:"})]}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("input",{type:"text",value:p,onChange:e=>x(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),I(p))},placeholder:"Enter keyword and press Enter",className:"px-3 py-2 text-sm bg-input border border-border rounded-md text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-all hover:border-primary/50 w-[250px]","aria-label":"Add keyword"}),(0,t.jsx)("button",{onClick:()=>I(p),className:"px-3 py-2 text-sm bg-muted text-muted-foreground hover:bg-muted/80 rounded-md transition-colors","aria-label":"Add keyword",children:"Add"})]}),o.length>0&&(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[o.map((e,r)=>(0,t.jsxs)("div",{className:"flex items-center gap-1.5 px-3 py-1.5 bg-muted text-muted-foreground rounded-md text-sm",children:[(0,t.jsx)("span",{children:e}),(0,t.jsx)("button",{onClick:()=>{g(o.filter((e,t)=>t!==r))},className:"hover:text-foreground transition-colors p-0.5 rounded hover:bg-muted/80","aria-label":`Remove keyword ${e}`,children:(0,t.jsx)(C.X,{className:"w-3.5 h-3.5"})})]},r)),(0,t.jsx)("button",{onClick:L,className:"px-2 py-1.5 text-xs bg-muted text-muted-foreground hover:bg-muted/80 rounded-md transition-colors","aria-label":"Clear all keywords",children:"Clear all"})]})]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-4",children:[(0,t.jsx)("span",{className:"text-sm font-medium text-foreground",children:"Custom Range:"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(N.default,{id:"date-from",value:k.from,onChange:e=>E("from",e),"aria-label":"Filter from date"}),(0,t.jsx)("span",{className:"text-muted-foreground",children:"to"}),(0,t.jsx)(N.default,{id:"date-to",value:k.to,onChange:e=>E("to",e),"aria-label":"Filter to date"})]}),("all"!==j||null!==k.from||null!==k.to||o.length>0||""!==b)&&(0,t.jsx)("button",{onClick:()=>{R(),L(),v("")},className:"px-3 py-2 text-sm bg-muted text-muted-foreground hover:bg-muted/80 rounded-md transition-colors",children:"Clear"})]}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 text-sm text-muted-foreground",children:[W.length>0&&!V&&(0,t.jsx)("button",{type:"button",onClick:()=>{q(e=>{let t=new Set(e);for(let e of W)Y?t.add(e):t.delete(e);return T(t),t})},className:"text-xs text-muted-foreground hover:text-foreground underline underline-offset-2 transition-colors",children:Y?"Collapse all":"Expand all"}),0===O.length?(0,t.jsx)("span",{children:"No projects found"}):(0,t.jsxs)("span",{children:["Showing ",B+1,"-",B+G," of ",O.length," projects",O.length!==_.length&&(0,t.jsxs)("span",{className:"ml-1",children:["(filtered from ",_.length," total)"]}),o.length>0&&(0,t.jsxs)("span",{className:"ml-1",children:["with ",o.length," keyword",1!==o.length?"s":""]})]})]})]})}),(0,t.jsxs)("div",{className:"bg-card border border-border rounded-lg overflow-hidden",children:[(0,t.jsx)("div",{className:"overflow-x-auto",children:(0,t.jsxs)("table",{className:"w-full",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{className:"border-b border-border bg-muted/50",children:[(0,t.jsx)("th",{scope:"col",className:"px-4 py-3 text-left text-sm font-semibold text-foreground w-12",children:(0,t.jsx)("span",{className:"sr-only",children:"Icon"})}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3 text-left text-sm font-semibold text-foreground max-w-md",children:"Agent Root"}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3 text-left text-sm font-semibold text-foreground hidden md:table-cell",children:"Path"}),(0,t.jsx)("th",{scope:"col",className:"px-4 py-3 text-left text-sm font-semibold text-foreground",children:"Last Modified"})]})}),(0,t.jsx)("tbody",{children:0===X.length?(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:4,className:"px-4 py-8 text-center text-muted-foreground",children:"No projects found matching the selected filter."})}):X.map(e=>(0,t.jsx)(S,{node:e,collapsed:!V&&H.has(e.key),interactive:!V,onToggle:J},e.key))})]})}),O.length>0&&(0,t.jsx)(w.default,{currentPage:A,totalPages:F,onPageChange:P})]})]})}],62481)},24578,e=>{"use strict";let t={claude:{id:"claude",label:"Claude Code",badgeClasses:"bg-orange-500/10 text-orange-400 border-orange-500/20"},codex:{id:"codex",label:"OpenAI Codex",badgeClasses:"bg-purple-500/10 text-purple-400 border-purple-500/20"},copilot:{id:"copilot",label:"GitHub Copilot",badgeClasses:"bg-blue-500/10 text-blue-400 border-blue-500/20"},cursor:{id:"cursor",label:"Cursor Agent",badgeClasses:"bg-emerald-500/10 text-emerald-400 border-emerald-500/20"},opencode:{id:"opencode",label:"OpenCode",badgeClasses:"bg-amber-500/10 text-amber-400 border-amber-500/20"},pi:{id:"pi",label:"Pi",badgeClasses:"bg-pink-500/10 text-pink-400 border-pink-500/20"},hermes:{id:"hermes",label:"Hermes",badgeClasses:"bg-indigo-500/10 text-indigo-400 border-indigo-500/20"},openclaw:{id:"openclaw",label:"OpenClaw",badgeClasses:"bg-teal-500/10 text-teal-400 border-teal-500/20"},factory:{id:"factory",label:"Factory Droid",badgeClasses:"bg-rose-500/10 text-rose-400 border-rose-500/20"},devin:{id:"devin",label:"Devin CLI",badgeClasses:"bg-violet-500/10 text-violet-400 border-violet-500/20"},antigravity:{id:"antigravity",label:"Antigravity CLI",badgeClasses:"bg-cyan-500/10 text-cyan-400 border-cyan-500/20"},goose:{id:"goose",label:"Goose",badgeClasses:"bg-lime-500/10 text-lime-400 border-lime-500/20"}};e.s(["KNOWN_CLI_IDS",0,["claude","codex","copilot","cursor","opencode","pi","hermes","openclaw","factory","devin","antigravity","goose"],"getCliBadgeClasses",0,function(e){return t[e]?.badgeClasses??t.claude.badgeClasses},"getCliLabel",0,function(e){return t[e]?.label??e},"isKnownCli",0,function(e){return"string"==typeof e&&Object.prototype.hasOwnProperty.call(t,e)}])},62706,20087,30005,66595,85898,e=>{"use strict";e.s(["formatDate",0,function(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}).format(e)}],62706),e.s(["FILTER_PRESETS",0,[{value:"all",label:"All"},{value:"last-hour",label:"Last Hour"},{value:"today",label:"Today"},{value:"last-7-days",label:"Last 7 Days"},{value:"last-30-days",label:"Last 30 Days"}],"ITEMS_PER_PAGE",0,25,"filterByDate",0,function(e,t,r){if("all"===t)return e;if("custom"===t){let t,a,n=r.from?((t=new Date(r.from)).setHours(0,0,0,0),t):null,l=r.to?((a=new Date(r.to)).setHours(23,59,59,999),a):null;return e.filter(e=>(!n||!(e.lastModified<n))&&(!l||!(e.lastModified>l)))}let a=function(e){let t=new Date;switch(e){case"last-hour":return new Date(t.getTime()-36e5);case"today":return new Date(t.getFullYear(),t.getMonth(),t.getDate());case"last-7-days":return new Date(t.getTime()-6048e5);case"last-30-days":return new Date(t.getTime()-2592e6);default:return null}}(t);return a?e.filter(e=>e.lastModified>=a):e},"rehydrateDates",0,function(e){return e.map(e=>({...e,lastModified:e.lastModified instanceof Date?e.lastModified:new Date(e.lastModified)}))}],20087);var t=e.i(71645);e.s(["useFilterState",0,function(e=[],r){let[a,n]=(0,t.useState)(r?.filterPreset??"all"),[l,o]=(0,t.useState)(r?.dateRange??{from:null,to:null}),[s,i]=(0,t.useState)(r?.currentPage??1),d=`${a}|${JSON.stringify(l)}|${JSON.stringify(e)}`,[c,u]=(0,t.useState)(d);d!==c&&(u(d),i(1));let m=(0,t.useCallback)(e=>{n(e),"custom"!==e&&o({from:null,to:null})},[]);return{filterPreset:a,dateRange:l,currentPage:s,setCurrentPage:i,handlePresetChange:m,handleDateRangeChange:(0,t.useCallback)((e,t)=>{n("custom"),o(r=>({...r,[e]:t?new Date(t):null}))},[]),clearFilters:(0,t.useCallback)(()=>{n("all"),o({from:null,to:null})},[])}}],30005);var r=e.i(56420);let a={name:"search",size:24,node:[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]};a.node;let n=(0,r.default)(a);e.s(["Search",0,n],66595);var l=e.i(43476);let o={name:"calendar",size:24,node:[["path",{d:"M8 2v3",key:"1ioesn"}],["path",{d:"M16 2v3",key:"otl347"}],["rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",key:"h1oib"}],["path",{d:"M3 9h18",key:"1pudct"}]]};o.node;let s=(0,r.default)(o);e.s(["default",0,function({id:e,value:t,stringValue:r,onChange:a,"aria-label":n}){let o=null!=r?r:t?t.toISOString().split("T")[0]:"";return(0,l.jsxs)("div",{className:"relative group",children:[(0,l.jsx)("input",{type:"date",id:e,value:o,onChange:e=>a(e.target.value),"aria-label":n,className:"date-input px-3 py-2 pr-8 text-sm bg-input border border-border rounded-md text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-all hover:border-primary/50 w-[200px]"}),(0,l.jsx)("label",{htmlFor:e,className:"absolute right-2.5 top-1/2 -translate-y-1/2 cursor-pointer pointer-events-auto z-10 p-1 rounded hover:bg-muted/50 transition-colors",onClick:t=>{t.preventDefault();let r=document.getElementById(e);r&&"function"==typeof r.showPicker?r.showPicker():r?.click()},children:(0,l.jsx)(s,{className:"w-4 h-4 text-primary group-hover:text-primary/80 transition-colors"})})]})}],85898)},80060,2711,e=>{"use strict";var t=e.i(18566),r=e.i(71645);function a(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${a}`}function n(e){var t;if(!e||(t=e,!/^\d{4}-\d{2}-\d{2}$/.test(t)||isNaN(Date.parse(t))))return null;let[r,a,n]=e.split("-").map(Number);return new Date(r,a-1,n,12,0,0)}e.s(["useUrlParams",0,function(){let e=(0,t.useSearchParams)(),a=(0,t.useRouter)(),n=(0,t.usePathname)(),l=(0,r.useRef)(null),o=(0,r.useCallback)(t=>e.get(t),[e]),s=(0,r.useCallback)(()=>new URLSearchParams(e.toString()),[e]),i=(0,r.useCallback)(t=>{l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{let r=new URLSearchParams(e.toString());for(let[e,a]of Object.entries(t))void 0===a||""===a?r.delete(e):r.set(e,a);let l=r.toString(),o=l?`${n}?${l}`:n;a.replace(o,{scroll:!1})},150)},[e,n,a]);return(0,r.useEffect)(()=>()=>{l.current&&clearTimeout(l.current)},[]),{get:o,getAll:s,setAll:i}}],80060),e.s(["dateRangeToParams",0,function(e){let t={};return e.from&&(t.from=a(e.from)),e.to&&(t.to=a(e.to)),t},"keywordsToParam",0,function(e){if(0!==e.length)return e.map(e=>encodeURIComponent(e)).join(",")},"pageToParam",0,function(e){return e<=1?void 0:String(e)},"paramToKeywords",0,function(e){return e?e.split(",").map(e=>decodeURIComponent(e.trim())).filter(e=>e.length>0):[]},"paramToPage",0,function(e){if(!e)return 1;let t=parseInt(e,10);return Number.isFinite(t)&&t>=1?t:1},"paramToPreset",0,function(e){return e&&["all","last-hour","today","last-7-days","last-30-days","custom"].includes(e)?e:"all"},"paramsToDateRange",0,function(e,t){return{from:n(e),to:n(t)}},"presetToParam",0,function(e){return"all"===e?void 0:e}],2711)},24071,e=>{"use strict";var t=e.i(56420);let r={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]};r.node;let a=(0,t.default)(r);e.s(["ChevronLeft",0,a],24071)},67927,e=>{"use strict";var t=e.i(56420);let r={name:"chevron-right",size:24,node:[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]};r.node;let a=(0,t.default)(r);e.s(["ChevronRight",0,a],67927)},63676,e=>{"use strict";var t=e.i(56420);let r={name:"x",size:24,node:[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]};r.node;let a=(0,t.default)(r);e.s(["X",0,a],63676)},45425,(e,t,r)=>{var a;"u">typeof __nccwpck_require__&&(__nccwpck_require__.ab="/ROOT/node_modules/next/dist/compiled/os-browserify/"),(a={}).endianness=function(){return"LE"},a.hostname=function(){return"u">typeof location?location.hostname:""},a.loadavg=function(){return[]},a.uptime=function(){return 0},a.freemem=function(){return Number.MAX_VALUE},a.totalmem=function(){return Number.MAX_VALUE},a.cpus=function(){return[]},a.type=function(){return"Browser"},a.release=function(){return"u">typeof navigator?navigator.appVersion:""},a.networkInterfaces=a.getNetworkInterfaces=function(){return{}},a.arch=function(){return"javascript"},a.platform=function(){return"browser"},a.tmpdir=a.tmpDir=function(){return"/tmp"},a.EOL="\n",a.homedir=function(){return"/"},t.exports=a},41790,(e,t,r)=>{!function(){"use strict";var e={431:function(e){function t(e){if("string"!=typeof e)throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function r(e,t){for(var r,a="",n=0,l=-1,o=0,s=0;s<=e.length;++s){if(s<e.length)r=e.charCodeAt(s);else if(47===r)break;else r=47;if(47===r){if(l===s-1||1===o);else if(l!==s-1&&2===o){if(a.length<2||2!==n||46!==a.charCodeAt(a.length-1)||46!==a.charCodeAt(a.length-2)){if(a.length>2){var i=a.lastIndexOf("/");if(i!==a.length-1){-1===i?(a="",n=0):n=(a=a.slice(0,i)).length-1-a.lastIndexOf("/"),l=s,o=0;continue}}else if(2===a.length||1===a.length){a="",n=0,l=s,o=0;continue}}t&&(a.length>0?a+="/..":a="..",n=2)}else a.length>0?a+="/"+e.slice(l+1,s):a=e.slice(l+1,s),n=s-l-1;l=s,o=0}else 46===r&&-1!==o?++o:o=-1}return a}var a={resolve:function(){for(var e,a,n="",l=!1,o=arguments.length-1;o>=-1&&!l;o--)o>=0?a=arguments[o]:(void 0===e&&(e=""),a=e),t(a),0!==a.length&&(n=a+"/"+n,l=47===a.charCodeAt(0));if(n=r(n,!l),l)if(n.length>0)return"/"+n;else return"/";return n.length>0?n:"."},normalize:function(e){if(t(e),0===e.length)return".";var a=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return(0!==(e=r(e,!a)).length||a||(e="."),e.length>0&&n&&(e+="/"),a)?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0==arguments.length)return".";for(var e,r=0;r<arguments.length;++r){var n=arguments[r];t(n),n.length>0&&(void 0===e?e=n:e+="/"+n)}return void 0===e?".":a.normalize(e)},relative:function(e,r){if(t(e),t(r),e===r||(e=a.resolve(e))===(r=a.resolve(r)))return"";for(var n=1;n<e.length&&47===e.charCodeAt(n);++n);for(var l=e.length,o=l-n,s=1;s<r.length&&47===r.charCodeAt(s);++s);for(var i=r.length-s,d=o<i?o:i,c=-1,u=0;u<=d;++u){if(u===d){if(i>d){if(47===r.charCodeAt(s+u))return r.slice(s+u+1);else if(0===u)return r.slice(s+u)}else o>d&&(47===e.charCodeAt(n+u)?c=u:0===u&&(c=0));break}var m=e.charCodeAt(n+u);if(m!==r.charCodeAt(s+u))break;47===m&&(c=u)}var f="";for(u=n+c+1;u<=l;++u)(u===l||47===e.charCodeAt(u))&&(0===f.length?f+="..":f+="/..");return f.length>0?f+r.slice(s+c):(s+=c,47===r.charCodeAt(s)&&++s,r.slice(s))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var r=e.charCodeAt(0),a=47===r,n=-1,l=!0,o=e.length-1;o>=1;--o)if(47===(r=e.charCodeAt(o))){if(!l){n=o;break}}else l=!1;return -1===n?a?"/":".":a&&1===n?"//":e.slice(0,n)},basename:function(e,r){if(void 0!==r&&"string"!=typeof r)throw TypeError('"ext" argument must be a string');t(e);var a,n=0,l=-1,o=!0;if(void 0!==r&&r.length>0&&r.length<=e.length){if(r.length===e.length&&r===e)return"";var s=r.length-1,i=-1;for(a=e.length-1;a>=0;--a){var d=e.charCodeAt(a);if(47===d){if(!o){n=a+1;break}}else -1===i&&(o=!1,i=a+1),s>=0&&(d===r.charCodeAt(s)?-1==--s&&(l=a):(s=-1,l=i))}return n===l?l=i:-1===l&&(l=e.length),e.slice(n,l)}for(a=e.length-1;a>=0;--a)if(47===e.charCodeAt(a)){if(!o){n=a+1;break}}else -1===l&&(o=!1,l=a+1);return -1===l?"":e.slice(n,l)},extname:function(e){t(e);for(var r=-1,a=0,n=-1,l=!0,o=0,s=e.length-1;s>=0;--s){var i=e.charCodeAt(s);if(47===i){if(!l){a=s+1;break}continue}-1===n&&(l=!1,n=s+1),46===i?-1===r?r=s:1!==o&&(o=1):-1!==r&&(o=-1)}return -1===r||-1===n||0===o||1===o&&r===n-1&&r===a+1?"":e.slice(r,n)},format:function(e){var t,r;if(null===e||"object"!=typeof e)throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return t=e.dir||e.root,r=e.base||(e.name||"")+(e.ext||""),t?t===e.root?t+r:t+"/"+r:r},parse:function(e){t(e);var r,a={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return a;var n=e.charCodeAt(0),l=47===n;l?(a.root="/",r=1):r=0;for(var o=-1,s=0,i=-1,d=!0,c=e.length-1,u=0;c>=r;--c){if(47===(n=e.charCodeAt(c))){if(!d){s=c+1;break}continue}-1===i&&(d=!1,i=c+1),46===n?-1===o?o=c:1!==u&&(u=1):-1!==o&&(u=-1)}return -1===o||-1===i||0===u||1===u&&o===i-1&&o===s+1?-1!==i&&(0===s&&l?a.base=a.name=e.slice(1,i):a.base=a.name=e.slice(s,i)):(0===s&&l?(a.name=e.slice(1,o),a.base=e.slice(1,i)):(a.name=e.slice(s,o),a.base=e.slice(s,i)),a.ext=e.slice(o,i)),s>0?a.dir=e.slice(0,s-1):l&&(a.dir="/"),a},sep:"/",delimiter:":",win32:null,posix:null};a.posix=a,e.exports=a}},r={};function a(t){var n=r[t];if(void 0!==n)return n.exports;var l=r[t]={exports:{}},o=!0;try{e[t](l,l.exports,a),o=!1}finally{o&&delete r[t]}return l.exports}a.ab="/ROOT/node_modules/next/dist/compiled/path-browserify/",t.exports=a(431)}()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,68166,e=>{"use strict";var t=e.i(95187);let a=(0,t.createServerReference)("604274cf2520d92ced15f4e2c8ded45d484e5745fc",t.callServer,void 0,t.findSourceMapURL,"searchHookActivityAction");e.s(["searchHookActivityAction",0,a])},73520,e=>{"use strict";var t=e.i(43476),a=e.i(24071),r=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:s,onPageChange:i}){if(s<=1)return null;let l=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>i(e-1),disabled:1===e,className:l(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(a.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(s<=7)return Array.from({length:s},(e,t)=>t+1);let t=[1],a=Math.max(2,e-1),r=Math.min(s-1,e+1);e<=3&&(r=Math.min(5,s-1)),e>=s-2&&(a=Math.max(2,s-4)),a>2&&t.push("ellipsis-start");for(let e=a;e<=r;e++)t.push(e);return r<s-1&&t.push("ellipsis-end"),t.push(s),t})().map(a=>"string"==typeof a?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},a):(0,t.jsx)("button",{onClick:()=>i(a),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===a?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${a}`,"aria-current":e===a?"page":void 0,children:a},a))}),(0,t.jsxs)("button",{onClick:()=>i(e+1),disabled:e===s,className:l(e===s),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(r.ChevronRight,{className:"w-4 h-4"})]})]})}])},34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let a=Math.round(e/1e3);if(a<3600){let e=Math.floor(a/60);return`${e}m ${a%60}s`}let r=Math.round(e/6e4),s=Math.floor(r/60);return`${s}h ${r%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},24071,e=>{"use strict";var t=e.i(56420);let a={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]};a.node;let r=(0,t.default)(a);e.s(["ChevronLeft",0,r],24071)},67927,e=>{"use strict";var t=e.i(56420);let a={name:"chevron-right",size:24,node:[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]};a.node;let r=(0,t.default)(a);e.s(["ChevronRight",0,r],67927)},16306,e=>{"use strict";var t=e.i(56420);let a={name:"shield-alert",size:24,node:[["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",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]};a.node;let r=(0,t.default)(a);e.s(["ShieldAlert",0,r],16306)},84026,29407,e=>{"use strict";var t=e.i(56420);let a={name:"shield-check",size:24,node:[["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",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]};a.node;let r=(0,t.default)(a);e.s(["ShieldCheck",0,r],84026);let s={name:"shield-x",size:24,node:[["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",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]],aliases:["shield-close"]};s.node;let i=(0,t.default)(s);e.s(["ShieldX",0,i],29407)},82954,e=>{"use strict";var t=e.i(56420);let a={name:"shield",size:24,node:[["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",key:"oel41y"}]]};a.node;let r=(0,t.default)(a);e.s(["Shield",0,r],82954)}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,68166,e=>{"use strict";var t=e.i(95187);let a=(0,t.createServerReference)("604274cf2520d92ced15f4e2c8ded45d484e5745fc",t.callServer,void 0,t.findSourceMapURL,"searchHookActivityAction");e.s(["searchHookActivityAction",0,a])},73520,e=>{"use strict";var t=e.i(43476),a=e.i(24071),r=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:l,onPageChange:o}){if(l<=1)return null;let s=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>o(e-1),disabled:1===e,className:s(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(a.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(l<=7)return Array.from({length:l},(e,t)=>t+1);let t=[1],a=Math.max(2,e-1),r=Math.min(l-1,e+1);e<=3&&(r=Math.min(5,l-1)),e>=l-2&&(a=Math.max(2,l-4)),a>2&&t.push("ellipsis-start");for(let e=a;e<=r;e++)t.push(e);return r<l-1&&t.push("ellipsis-end"),t.push(l),t})().map(a=>"string"==typeof a?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},a):(0,t.jsx)("button",{onClick:()=>o(a),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===a?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${a}`,"aria-current":e===a?"page":void 0,children:a},a))}),(0,t.jsxs)("button",{onClick:()=>o(e+1),disabled:e===l,className:s(e===l),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(r.ChevronRight,{className:"w-4 h-4"})]})]})}])},24578,e=>{"use strict";let t={claude:{id:"claude",label:"Claude Code",badgeClasses:"bg-orange-500/10 text-orange-400 border-orange-500/20"},codex:{id:"codex",label:"OpenAI Codex",badgeClasses:"bg-purple-500/10 text-purple-400 border-purple-500/20"},copilot:{id:"copilot",label:"GitHub Copilot",badgeClasses:"bg-blue-500/10 text-blue-400 border-blue-500/20"},cursor:{id:"cursor",label:"Cursor Agent",badgeClasses:"bg-emerald-500/10 text-emerald-400 border-emerald-500/20"},opencode:{id:"opencode",label:"OpenCode",badgeClasses:"bg-amber-500/10 text-amber-400 border-amber-500/20"},pi:{id:"pi",label:"Pi",badgeClasses:"bg-pink-500/10 text-pink-400 border-pink-500/20"},hermes:{id:"hermes",label:"Hermes",badgeClasses:"bg-indigo-500/10 text-indigo-400 border-indigo-500/20"},openclaw:{id:"openclaw",label:"OpenClaw",badgeClasses:"bg-teal-500/10 text-teal-400 border-teal-500/20"},factory:{id:"factory",label:"Factory Droid",badgeClasses:"bg-rose-500/10 text-rose-400 border-rose-500/20"},devin:{id:"devin",label:"Devin CLI",badgeClasses:"bg-violet-500/10 text-violet-400 border-violet-500/20"},antigravity:{id:"antigravity",label:"Antigravity CLI",badgeClasses:"bg-cyan-500/10 text-cyan-400 border-cyan-500/20"},goose:{id:"goose",label:"Goose",badgeClasses:"bg-lime-500/10 text-lime-400 border-lime-500/20"}};e.s(["KNOWN_CLI_IDS",0,["claude","codex","copilot","cursor","opencode","pi","hermes","openclaw","factory","devin","antigravity","goose"],"getCliBadgeClasses",0,function(e){return t[e]?.badgeClasses??t.claude.badgeClasses},"getCliLabel",0,function(e){return t[e]?.label??e},"isKnownCli",0,function(e){return"string"==typeof e&&Object.prototype.hasOwnProperty.call(t,e)}])},34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let a=Math.round(e/1e3);if(a<3600){let e=Math.floor(a/60);return`${e}m ${a%60}s`}let r=Math.round(e/6e4),l=Math.floor(r/60);return`${l}h ${r%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},80060,2711,e=>{"use strict";var t=e.i(18566),a=e.i(71645);function r(e){let t=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0");return`${t}-${a}-${r}`}function l(e){var t;if(!e||(t=e,!/^\d{4}-\d{2}-\d{2}$/.test(t)||isNaN(Date.parse(t))))return null;let[a,r,l]=e.split("-").map(Number);return new Date(a,r-1,l,12,0,0)}e.s(["useUrlParams",0,function(){let e=(0,t.useSearchParams)(),r=(0,t.useRouter)(),l=(0,t.usePathname)(),o=(0,a.useRef)(null),s=(0,a.useCallback)(t=>e.get(t),[e]),i=(0,a.useCallback)(()=>new URLSearchParams(e.toString()),[e]),n=(0,a.useCallback)(t=>{o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{let a=new URLSearchParams(e.toString());for(let[e,r]of Object.entries(t))void 0===r||""===r?a.delete(e):a.set(e,r);let o=a.toString(),s=o?`${l}?${o}`:l;r.replace(s,{scroll:!1})},150)},[e,l,r]);return(0,a.useEffect)(()=>()=>{o.current&&clearTimeout(o.current)},[]),{get:s,getAll:i,setAll:n}}],80060),e.s(["dateRangeToParams",0,function(e){let t={};return e.from&&(t.from=r(e.from)),e.to&&(t.to=r(e.to)),t},"keywordsToParam",0,function(e){if(0!==e.length)return e.map(e=>encodeURIComponent(e)).join(",")},"pageToParam",0,function(e){return e<=1?void 0:String(e)},"paramToKeywords",0,function(e){return e?e.split(",").map(e=>decodeURIComponent(e.trim())).filter(e=>e.length>0):[]},"paramToPage",0,function(e){if(!e)return 1;let t=parseInt(e,10);return Number.isFinite(t)&&t>=1?t:1},"paramToPreset",0,function(e){return e&&["all","last-hour","today","last-7-days","last-30-days","custom"].includes(e)?e:"all"},"paramsToDateRange",0,function(e,t){return{from:l(e),to:l(t)}},"presetToParam",0,function(e){return"all"===e?void 0:e}],2711)},89664,e=>{"use strict";var t=e.i(56420);let a={name:"check",size:24,node:[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]};a.node;let r=(0,t.default)(a);e.s(["Check",0,r],89664)},24071,e=>{"use strict";var t=e.i(56420);let a={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]};a.node;let r=(0,t.default)(a);e.s(["ChevronLeft",0,r],24071)},67927,e=>{"use strict";var t=e.i(56420);let a={name:"chevron-right",size:24,node:[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]};a.node;let r=(0,t.default)(a);e.s(["ChevronRight",0,r],67927)},8734,e=>{"use strict";var t=e.i(56420);let a={name:"copy",size:24,node:[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]};a.node;let r=(0,t.default)(a);e.s(["Copy",0,r],8734)},16306,e=>{"use strict";var t=e.i(56420);let a={name:"shield-alert",size:24,node:[["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",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]};a.node;let r=(0,t.default)(a);e.s(["ShieldAlert",0,r],16306)},84026,29407,e=>{"use strict";var t=e.i(56420);let a={name:"shield-check",size:24,node:[["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",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]};a.node;let r=(0,t.default)(a);e.s(["ShieldCheck",0,r],84026);let l={name:"shield-x",size:24,node:[["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",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]],aliases:["shield-close"]};l.node;let o=(0,t.default)(l);e.s(["ShieldX",0,o],29407)},82954,e=>{"use strict";var t=e.i(56420);let a={name:"shield",size:24,node:[["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",key:"oel41y"}]]};a.node;let r=(0,t.default)(a);e.s(["Shield",0,r],82954)},63676,e=>{"use strict";var t=e.i(56420);let a={name:"x",size:24,node:[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]};a.node;let r=(0,t.default)(a);e.s(["X",0,r],63676)}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/1c6aptmytnu6q.js","static/chunks/2yuzx8716maf0.js","static/chunks/3i8rg2fv9nd6e.js","static/chunks/
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/1c6aptmytnu6q.js","static/chunks/2yuzx8716maf0.js","static/chunks/3i8rg2fv9nd6e.js","static/chunks/06jxjnw8bfczc.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;var t,r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=((t=n||{})[t.Runtime=0]="Runtime",t[t.Parent=1]="Parent",t[t.Update=2]="Update",t);let o=new WeakMap;function l(e,t){this.m=e,this.e=t}let i=l.prototype,u=Object.prototype.hasOwnProperty,s="u">typeof Symbol&&Symbol.toStringTag;function c(e,t,r){u.call(e,t)||Object.defineProperty(e,t,r)}function a(e,t){let r=e[t];return r||(r=f(t),e[t]=r),r}function f(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function p(e,t,r){c(e,"__esModule",{value:!0}),s&&c(e,s,{value:"Module"});let n=0;for(;n<t.length;){let r=t[n++],o=t[n++];if("number"==typeof o)if(0===o)c(e,r,{value:t[n++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[n]?c(e,r,{get:o,set:t[n++],enumerable:!0}):c(e,r,{get:o,enumerable:!0})}r||Object.seal(e)}function h(e,t){(null!=t?a(this.c,t):this.m).exports=e}i.s=function(e,t,r){let n,o;null!=t?o=(n=a(this.c,t)).exports:(n=this.m,o=this.e),n.namespaceObject=o,p(o,e,r)},i.j=function(e,t){let r,n;null!=t?n=(r=a(this.c,t)).exports:(r=this.m,n=this.e);let l=function(e,t){let r=o.get(e);if(!r){o.set(e,r=[]);let n=e=>{if("default"!==e){for(let t of r)if(u.call(t,e))return t}};e.exports=e.namespaceObject=new Proxy(t,{get(e,t){if(u.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);let r=n(t);return r&&Reflect.get(r,t)},set:()=>!1,defineProperty:()=>!1,deleteProperty:()=>!1,has:(e,t)=>!!Reflect.has(e,t)||"default"!==t&&"__esModule"!==t&&void 0!==n(t),ownKeys(e){let t=Reflect.ownKeys(e);for(let e of r)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t},getOwnPropertyDescriptor(e,t){let r=Reflect.getOwnPropertyDescriptor(e,t);if(r||"default"===t||"__esModule"===t)return r;let o=n(t);if(o)return{enumerable:!0,configurable:!0,get:()=>Reflect.get(o,t)}}})}return r}(r,n);"object"==typeof e&&null!==e&&l.push(e)},i.v=h,i.n=function(e,t){let r;(r=null!=t?a(this.c,t):this.m).exports=r.namespaceObject=e};let d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,m=[null,d({}),d([]),d(d)];function y(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!m.includes(t);t=d(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),p(t,n),t}function g(e){let t=K(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=y(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function b(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}i.i=g,i.A=function(e){return this.r(e)(g.bind(this))},i.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},i.r=function(e){return K(e,this.m).exports},i.f=function(e){function t(t){if(t=b(t),u.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=b(t),u.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let O=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function w(e,t){throw Error(`Invariant: ${t(e)}`)}O.prototype=URL.prototype,i.U=O,i.z=function(e){throw Error("dynamic usage of require is not supported")},i.g=globalThis;let R=l.prototype,k="string"==typeof TURBOPACK_CHUNK_BASE_PATH?TURBOPACK_CHUNK_BASE_PATH:"/_next/",U=new Map;i.M=U;let v=new Map,_=new Map,P=new Map;async function j(e,t,r){let n;if("string"==typeof r)return function(e,t,r){return A(e,t,r)}(e,t,E(r));let o=r.included||[],l=o.map(e=>!!U.has(e)||v.get(e));if(l.length>0&&l.every(e=>e))return void await Promise.all(l);for(let l of(n=A(e,t,E(r.path)),o))v.has(l)||v.set(l,n);await n}R.l=function(e){return j(n.Parent,this.m.id,e)};let C=Promise.resolve(void 0),$=new WeakMap;function A(t,r,o){let l=e.loadChunkCached(t,o),i=$.get(l);if(void 0===i){let e=$.set.bind($,l,C);i=l.then(e).catch(e=>{let l;switch(t){case n.Runtime:l=`as a runtime dependency of chunk ${r}`;break;case n.Parent:l=`from module ${r}`;break;case n.Update:l="from an HMR update";break;default:w(t,e=>`Unknown source type: ${e}`)}let i=Error(`Failed to load chunk ${o} ${l}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw i.name="ChunkLoadError",i}),$.set(l,i)}return i}R.L=function(e){var t,r;return t=n.Parent,r=this.m.id,A(t,r,e)};R.R=function(e){let t=this.r(e);return t?.default??t},R.P=function(e){return`/ROOT/${e??""}`},R.F=function(e){return e?`file:///ROOT/${e.split("/").map(encodeURIComponent).join("/")}`:"file:///ROOT/"},R.q=function(e,t){h.call(this,`${e}${r}`,t)};let T=/[^A-Za-z0-9\-_.!~*'()/]/;function E(e,t=k){let n=T.test(e)?e.split("/").map(encodeURIComponent).join("/"):e;return`${t}${n}${r}`}function S(e,t){let r,n=e.indexOf("?");if(-1!==n)r=n;else{let t=e.indexOf("#");r=-1!==t?t:e.length}return r>=t.length&&e.startsWith(t,r-t.length)}R.b=k,R.X=r,R.h=E;function x(e){return S(e,".css")}let M={};i.c=M;let K=(e,t)=>{let r=M[e];if(r){if(r.error)throw r.error;return r}return N(e,n.Parent,t.id)};function N(e,t,r){let n=U.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:w(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=f(e),i=o.exports;M[e]=o;let u=new l(o,i);try{n(u,o,i)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&y(o.exports,o.namespaceObject),o}function B(t){let r;if(!Array.isArray(t))return e.registerChunk(void 0,t);let n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let l=e[o];for(let l=r;l<o;l++){let r=e[l],o=t.get(r);if(o){n=o;break}}let i=n??l,u=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(u||(i===l&&Object.defineProperty(l,"name",{value:"module evaluation"}),u=!0),t.set(r,i))}r=o+1}}(t,U)),e.registerChunk(n,r)}let L=new Map;function I(e){let t=L.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,retryAttempts:0,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},L.set(e,t)}return t}function q(e,t,r,n,o){!(null==n||n instanceof DOMException&&"NetworkError"===n.name)||r.retryAttempts>=1||L.get(t)!==r?(L.get(t)===r&&L.delete(t),r.reject(n)):(r.retryAttempts++,setTimeout(()=>{r.resolved||L.get(t)!==r||(o?o():(r.loadingStarted=!1,H(e,t)))},200+Math.floor(401*Math.random())))}function H(e,t){let r=I(t);if(r.loadingStarted)return r.promise;if(e===n.Runtime)return r.loadingStarted=!0,x(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(x(t));else if(S(t,".js")){self.TURBOPACK_NEXT_CHUNK_URLS.push(t);try{importScripts(t)}catch(n){q(e,t,r,n)}}else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let n=decodeURI(t);if(x(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${n}"],link[rel=stylesheet][href^="${n}?"]`).length>0)r.resolve();else{let n=()=>{let o=document.createElement("link");return o.rel="stylesheet",o.crossOrigin=null,o.href=t,o.onerror=()=>{let l=document.createComment("");o.replaceWith(l),q(e,t,r,void 0,()=>l.replaceWith(n()))},o.onload=()=>{r.resolve()},o};document.head.appendChild(n())}else if(S(t,".js")){let o=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${n}"],script[src^="${n}?"]`);if(o.length>0)for(let n of Array.from(o))n.addEventListener("error",()=>{n.remove(),q(e,t,r)},{once:!0});else{let n=document.createElement("script");n.crossOrigin=null,n.src=t,n.onerror=()=>{n.remove(),q(e,t,r)},document.head.appendChild(n)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise}e={async registerChunk(e,t){let r;if(null!=e&&(r=function(e){if("string"==typeof e)return e;let t=decodeURIComponent(e.src.replace(/[?#].*$/,""));return t.startsWith(k)?t.slice(k.length):t}(e),I("string"==typeof e?E(e):e.src).resolve()),null!=t){for(let e of t.otherChunks)I(E("string"==typeof e?e:e.path));if(await Promise.all(t.otherChunks.map(e=>{var t;return t=r,j(n.Runtime,t,e)})),t.runtimeModuleIds.length>0)for(let e of t.runtimeModuleIds)!function(e,t){let r=M[t];if(r){if(r.error)throw r.error;return}N(t,n.Runtime,e)}(r,e)}},loadChunkCached:(e,t)=>H(e,t)};var F=globalThis.TURBOPACK;globalThis.TURBOPACK={push:B},F.forEach(B)})();
|
|
@@ -372,7 +372,7 @@ wheels = [
|
|
|
372
372
|
|
|
373
373
|
[[package]]
|
|
374
374
|
name = "posthog"
|
|
375
|
-
version = "7.
|
|
375
|
+
version = "7.53.0"
|
|
376
376
|
source = { registry = "https://pypi.org/simple" }
|
|
377
377
|
dependencies = [
|
|
378
378
|
{ name = "backoff" },
|
|
@@ -380,9 +380,9 @@ dependencies = [
|
|
|
380
380
|
{ name = "requests" },
|
|
381
381
|
{ name = "typing-extensions" },
|
|
382
382
|
]
|
|
383
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
383
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f2/c4/17a2a764a63e061f768a56d50c245e3012da536b5a15ed2521616b8869b7/posthog-7.53.0.tar.gz", hash = "sha256:38223a8769b9db7ab906d32f5b87c4cde534cc91b30f1dcfa4443577819e068c", size = 565313, upload-time = "2026-09-11T17:51:16.199Z" }
|
|
384
384
|
wheels = [
|
|
385
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
385
|
+
{ url = "https://files.pythonhosted.org/packages/03/9d/4af58450b986666c810dc1fbae04e41cdec62ab31ae1e0e51bb5a4b75f71/posthog-7.53.0-py3-none-any.whl", hash = "sha256:ca9176334cf0c7799fe5518f7b9dc02d3f2f709a859da4332f14b3586b9d4554", size = 662783, upload-time = "2026-09-11T17:51:14.275Z" },
|
|
386
386
|
]
|
|
387
387
|
|
|
388
388
|
[[package]]
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# FailproofAI for Hermes
|
|
2
|
+
|
|
3
|
+
This directory is the native Hermes adapter shipped inside the `failproofai`
|
|
4
|
+
npm package. It keeps policy evaluation in FailproofAI's TypeScript worker and
|
|
5
|
+
translates structured verdicts into Hermes-native hook behavior.
|
|
6
|
+
|
|
7
|
+
Validated contract: Hermes 0.21.3 at
|
|
8
|
+
`4d55ca91656ac5f83e1506679b7f81e0238e5e16`. The plugin uses only documented
|
|
9
|
+
manifest v2 fields, `PluginContext` methods/state, and keyword hook payloads.
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
Hermes policy evaluation requires a configured, healthy local `failproofaid`
|
|
14
|
+
daemon. If this machine has not been configured yet, run `failproofai config`
|
|
15
|
+
first. The standalone installer refuses to enable the fail-closed plugin until
|
|
16
|
+
the daemon answers an end-to-end health probe.
|
|
17
|
+
|
|
18
|
+
Then run:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
failproofai policies --install --cli hermes --scope user
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
FailproofAI copies this directory to every discovered profile at
|
|
25
|
+
`<HERMES_HOME>/plugins/failproofai/` and adds `failproofai` to
|
|
26
|
+
`plugins.enabled` in that profile's `config.yaml`. Reinstall replaces only a
|
|
27
|
+
directory carrying `.failproofai-managed`; an unrelated plugin with the same
|
|
28
|
+
directory name is never overwritten.
|
|
29
|
+
|
|
30
|
+
Legacy FailproofAI shell hooks are removed during migration. Operator-owned
|
|
31
|
+
hooks and unrelated plugin settings are preserved. No dashboard deployment or
|
|
32
|
+
backtest is part of installation.
|
|
33
|
+
|
|
34
|
+
## Runtime path
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
Hermes pre_tool_call
|
|
38
|
+
-> native Python plugin
|
|
39
|
+
-> owner-only failproofaid Unix socket
|
|
40
|
+
-> warm TypeScript policy worker
|
|
41
|
+
-> structured allow | deny | instruct verdict
|
|
42
|
+
-> Hermes-native return value
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
There is no cloud request and no new CLI process in the tool-call path.
|
|
46
|
+
|
|
47
|
+
## Decision behavior
|
|
48
|
+
|
|
49
|
+
- `allow`: return no directive; Hermes runs the tool.
|
|
50
|
+
- `deny`: always return `{"action":"block","message":"..."}`.
|
|
51
|
+
- `instruct`: persist delivery state, block the first attempt with a
|
|
52
|
+
model-visible `FAILPROOF INSTRUCTION`, keep the same API request blocked, then
|
|
53
|
+
allow a later API iteration for the same instruction scope.
|
|
54
|
+
|
|
55
|
+
The default instruction scope is profile + session + task + turn + policy
|
|
56
|
+
fingerprint + canonical tool. The persistent SQLite ledger lives below Hermes'
|
|
57
|
+
profile-scoped plugin data directory. Two distinct instruction interruptions
|
|
58
|
+
are allowed per turn by default; after that, advisory instructions fail open so
|
|
59
|
+
they cannot create an infinite retry loop. A real deny is never bypassed by the
|
|
60
|
+
ledger.
|
|
61
|
+
|
|
62
|
+
## Configuration
|
|
63
|
+
|
|
64
|
+
Settings live under `plugins.entries.failproofai.settings`:
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
plugins:
|
|
68
|
+
enabled:
|
|
69
|
+
- failproofai
|
|
70
|
+
entries:
|
|
71
|
+
failproofai:
|
|
72
|
+
settings:
|
|
73
|
+
failure_mode: deny
|
|
74
|
+
connect_timeout_ms: 250
|
|
75
|
+
evaluation_timeout_ms: 12000
|
|
76
|
+
instruction_ttl_seconds: 3600
|
|
77
|
+
max_instruction_rounds: 2
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`failure_mode` controls evaluator/protocol failures only. `deny` is the safe
|
|
81
|
+
default. `allow` favors availability when the local daemon cannot return a
|
|
82
|
+
trusted verdict. Ledger failures always allow only the advisory `instruct`
|
|
83
|
+
decision, because otherwise corrupted retry state could block a turn forever.
|
|
84
|
+
|
|
85
|
+
## Local protocol
|
|
86
|
+
|
|
87
|
+
Requests and responses use the existing length-prefixed failproofaid Unix
|
|
88
|
+
socket protocol, version 1.
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"type": "policyEvaluation",
|
|
93
|
+
"protocolVersion": 1,
|
|
94
|
+
"integration": "hermes",
|
|
95
|
+
"event": "pre_tool_call",
|
|
96
|
+
"payload": {},
|
|
97
|
+
"cwd": "/workspace/project"
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"type": "policyResult",
|
|
104
|
+
"protocolVersion": 1,
|
|
105
|
+
"decision": "instruct",
|
|
106
|
+
"policyNames": ["custom/approved-write-route"],
|
|
107
|
+
"reason": "Use the approved write route.",
|
|
108
|
+
"matchedPolicies": ["custom/approved-write-route"],
|
|
109
|
+
"durationMs": 3,
|
|
110
|
+
"toolName": "Write"
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Requests are limited to 1 MiB and responses to 16 MiB. Invalid JSON, unknown
|
|
115
|
+
message types, version mismatch, timeout, and socket failure are treated as
|
|
116
|
+
untrusted evaluation failures.
|
|
117
|
+
|
|
118
|
+
## Diagnostics and rollback
|
|
119
|
+
|
|
120
|
+
`failproofai config --status` reports each existing Hermes profile as healthy,
|
|
121
|
+
disabled, incomplete, or duplicated with a legacy shell hook. Hermes-side load
|
|
122
|
+
errors are available through:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
HERMES_PLUGINS_DEBUG=1 hermes plugins list
|
|
126
|
+
hermes plugins doctor ~/.hermes/plugins/failproofai --ci
|
|
127
|
+
hermes logs --level WARNING
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Use a temporary `HERMES_HOME` for development and compatibility tests. Remove
|
|
131
|
+
the integration with:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
failproofai policies --uninstall --cli hermes --scope user
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Uninstall removes the config registration and only the plugin directory marked
|
|
138
|
+
as FailproofAI-managed.
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"""Native Hermes bridge for FailproofAI policy enforcement."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Mapping
|
|
9
|
+
|
|
10
|
+
from .client import PolicyVerdict, evaluate_policy
|
|
11
|
+
from .ledger import InstructionLedger, LedgerError
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
_PROTOCOL_CONTEXT = (
|
|
16
|
+
"When a tool result starts with FAILPROOF INSTRUCTION, treat it as policy guidance. "
|
|
17
|
+
"Reconsider the attempted action before retrying. Do not evade or ignore the instruction; "
|
|
18
|
+
"change tools, arguments, targets, or side effects only when the instruction requires it. "
|
|
19
|
+
"If you cannot follow the instruction, stop and explain why."
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _bounded_int(value: object, default: int, minimum: int, maximum: int) -> int:
|
|
24
|
+
try:
|
|
25
|
+
parsed = int(value)
|
|
26
|
+
except (TypeError, ValueError):
|
|
27
|
+
return default
|
|
28
|
+
return min(max(parsed, minimum), maximum)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _profile_name() -> str:
|
|
32
|
+
explicit = os.environ.get("HERMES_PROFILE", "").strip()
|
|
33
|
+
if explicit:
|
|
34
|
+
return explicit
|
|
35
|
+
configured_home = os.environ.get("HERMES_HOME", "").strip()
|
|
36
|
+
home = Path(configured_home).expanduser() if configured_home else Path.home() / ".hermes"
|
|
37
|
+
if home.parent.name == "profiles":
|
|
38
|
+
return home.name
|
|
39
|
+
return "default"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _string(value: object) -> str:
|
|
43
|
+
return value if isinstance(value, str) else ""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class FailproofAIPlugin:
|
|
47
|
+
def __init__(self, ctx: Any) -> None:
|
|
48
|
+
self.ctx = ctx
|
|
49
|
+
self.profile = _profile_name()
|
|
50
|
+
self.failure_mode = str(ctx.get_config("failure_mode", "deny")).strip().lower()
|
|
51
|
+
self.connect_timeout_ms = _bounded_int(
|
|
52
|
+
ctx.get_config("connect_timeout_ms", 250), 250, 25, 5_000
|
|
53
|
+
)
|
|
54
|
+
self.evaluation_timeout_ms = _bounded_int(
|
|
55
|
+
ctx.get_config("evaluation_timeout_ms", 12_000), 12_000, 100, 29_000
|
|
56
|
+
)
|
|
57
|
+
ttl_seconds = _bounded_int(
|
|
58
|
+
ctx.get_config("instruction_ttl_seconds", 3_600), 3_600, 60, 86_400
|
|
59
|
+
)
|
|
60
|
+
max_rounds = _bounded_int(
|
|
61
|
+
ctx.get_config("max_instruction_rounds", 2), 2, 0, 10
|
|
62
|
+
)
|
|
63
|
+
self.ledger = InstructionLedger(
|
|
64
|
+
Path(ctx.state.data_dir) / "instructions.db",
|
|
65
|
+
ttl_seconds=ttl_seconds,
|
|
66
|
+
max_rounds=max_rounds,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def _fallback(self, error: Exception) -> dict[str, str] | None:
|
|
70
|
+
logger.error("FailproofAI evaluator unavailable: %s", error)
|
|
71
|
+
if self.failure_mode == "allow":
|
|
72
|
+
return None
|
|
73
|
+
return {
|
|
74
|
+
"action": "block",
|
|
75
|
+
"message": (
|
|
76
|
+
"FailproofAI could not verify this tool call because the local policy "
|
|
77
|
+
"evaluator is unavailable. Check `failproofai status` before retrying."
|
|
78
|
+
),
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
def _evaluate(self, event: str, payload: Mapping[str, Any]) -> PolicyVerdict:
|
|
82
|
+
cwd = _string(payload.get("cwd")) or os.getcwd()
|
|
83
|
+
return evaluate_policy(
|
|
84
|
+
event=event,
|
|
85
|
+
payload=payload,
|
|
86
|
+
cwd=cwd,
|
|
87
|
+
connect_timeout_ms=self.connect_timeout_ms,
|
|
88
|
+
evaluation_timeout_ms=self.evaluation_timeout_ms,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
def pre_tool_call(
|
|
92
|
+
self,
|
|
93
|
+
tool_name: str = "",
|
|
94
|
+
args: Mapping[str, Any] | None = None,
|
|
95
|
+
session_id: str = "",
|
|
96
|
+
task_id: str = "",
|
|
97
|
+
tool_call_id: str = "",
|
|
98
|
+
turn_id: str = "",
|
|
99
|
+
api_request_id: str = "",
|
|
100
|
+
**kwargs: Any,
|
|
101
|
+
) -> dict[str, str] | None:
|
|
102
|
+
payload = {
|
|
103
|
+
"hook_event_name": "pre_tool_call",
|
|
104
|
+
"tool_name": tool_name,
|
|
105
|
+
"tool_input": dict(args or {}),
|
|
106
|
+
"session_id": session_id,
|
|
107
|
+
"cwd": _string(kwargs.get("cwd")) or os.getcwd(),
|
|
108
|
+
"hermes": {
|
|
109
|
+
"profile": self.profile,
|
|
110
|
+
"task_id": task_id,
|
|
111
|
+
"tool_call_id": tool_call_id,
|
|
112
|
+
"turn_id": turn_id,
|
|
113
|
+
"api_request_id": api_request_id,
|
|
114
|
+
},
|
|
115
|
+
}
|
|
116
|
+
try:
|
|
117
|
+
verdict = self._evaluate("pre_tool_call", payload)
|
|
118
|
+
except Exception as exc:
|
|
119
|
+
return self._fallback(exc)
|
|
120
|
+
|
|
121
|
+
if verdict.decision == "allow":
|
|
122
|
+
return None
|
|
123
|
+
if verdict.decision == "deny":
|
|
124
|
+
return {
|
|
125
|
+
"action": "block",
|
|
126
|
+
"message": verdict.reason or "Blocked by FailproofAI policy.",
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
reason = verdict.reason or "Reconsider this tool call before retrying."
|
|
130
|
+
try:
|
|
131
|
+
action = self.ledger.decide(
|
|
132
|
+
profile=self.profile,
|
|
133
|
+
session_id=session_id,
|
|
134
|
+
task_id=task_id,
|
|
135
|
+
turn_id=turn_id,
|
|
136
|
+
api_request_id=api_request_id,
|
|
137
|
+
policy_names=verdict.policy_names,
|
|
138
|
+
reason=reason,
|
|
139
|
+
scope_key=verdict.tool_name or tool_name or "unknown-tool",
|
|
140
|
+
)
|
|
141
|
+
except LedgerError as exc:
|
|
142
|
+
# An advisory instruction must never become an indefinite denial
|
|
143
|
+
# because its local retry state is unavailable.
|
|
144
|
+
logger.error("FailproofAI instruction state unavailable; allowing: %s", exc)
|
|
145
|
+
return None
|
|
146
|
+
|
|
147
|
+
if not action.block:
|
|
148
|
+
if action.status in {"missing-correlation-id", "turn-cap"}:
|
|
149
|
+
logger.warning("FailproofAI instruction allowed in degraded state: %s", action.status)
|
|
150
|
+
return None
|
|
151
|
+
|
|
152
|
+
policies = ", ".join(verdict.policy_names) or "unknown policy"
|
|
153
|
+
return {
|
|
154
|
+
"action": "block",
|
|
155
|
+
"message": (
|
|
156
|
+
f"FAILPROOF INSTRUCTION ({policies})\n\n{reason}\n\n"
|
|
157
|
+
"Reconsider the attempted action, then make a corrected tool call. "
|
|
158
|
+
"Do not route around this instruction with an equivalent ungoverned action."
|
|
159
|
+
),
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
def _observe(self, event: str, payload: Mapping[str, Any]) -> None:
|
|
163
|
+
try:
|
|
164
|
+
self._evaluate(event, payload)
|
|
165
|
+
except Exception as exc:
|
|
166
|
+
logger.warning("FailproofAI observation failed for %s: %s", event, exc)
|
|
167
|
+
|
|
168
|
+
def post_tool_call(
|
|
169
|
+
self,
|
|
170
|
+
tool_name: str = "",
|
|
171
|
+
args: Mapping[str, Any] | None = None,
|
|
172
|
+
result: Any = None,
|
|
173
|
+
session_id: str = "",
|
|
174
|
+
**kwargs: Any,
|
|
175
|
+
) -> None:
|
|
176
|
+
self._observe(
|
|
177
|
+
"post_tool_call",
|
|
178
|
+
{
|
|
179
|
+
"hook_event_name": "post_tool_call",
|
|
180
|
+
"tool_name": tool_name,
|
|
181
|
+
"tool_input": dict(args or {}),
|
|
182
|
+
"tool_response": result,
|
|
183
|
+
"session_id": session_id,
|
|
184
|
+
"cwd": _string(kwargs.get("cwd")) or os.getcwd(),
|
|
185
|
+
"hermes": {"profile": self.profile, **kwargs},
|
|
186
|
+
},
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
def on_session_start(self, session_id: str = "", **kwargs: Any) -> None:
|
|
190
|
+
self._observe(
|
|
191
|
+
"on_session_start",
|
|
192
|
+
{
|
|
193
|
+
"hook_event_name": "on_session_start",
|
|
194
|
+
"session_id": session_id,
|
|
195
|
+
"cwd": _string(kwargs.get("cwd")) or os.getcwd(),
|
|
196
|
+
"hermes": {"profile": self.profile, **kwargs},
|
|
197
|
+
},
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
def on_session_end(self, session_id: str = "", **kwargs: Any) -> None:
|
|
201
|
+
self._observe(
|
|
202
|
+
"on_session_end",
|
|
203
|
+
{
|
|
204
|
+
"hook_event_name": "on_session_end",
|
|
205
|
+
"session_id": session_id,
|
|
206
|
+
"cwd": _string(kwargs.get("cwd")) or os.getcwd(),
|
|
207
|
+
"hermes": {"profile": self.profile, **kwargs},
|
|
208
|
+
},
|
|
209
|
+
)
|
|
210
|
+
self._clear_session(session_id)
|
|
211
|
+
|
|
212
|
+
def subagent_stop(self, session_id: str = "", **kwargs: Any) -> None:
|
|
213
|
+
self._observe(
|
|
214
|
+
"subagent_stop",
|
|
215
|
+
{
|
|
216
|
+
"hook_event_name": "subagent_stop",
|
|
217
|
+
"session_id": session_id,
|
|
218
|
+
"cwd": _string(kwargs.get("cwd")) or os.getcwd(),
|
|
219
|
+
"hermes": {"profile": self.profile, **kwargs},
|
|
220
|
+
},
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
def pre_llm_call(self, **kwargs: Any) -> dict[str, str]:
|
|
224
|
+
return {"context": _PROTOCOL_CONTEXT}
|
|
225
|
+
|
|
226
|
+
def on_session_reset(self, session_id: str = "", **kwargs: Any) -> None:
|
|
227
|
+
self._clear_session(session_id)
|
|
228
|
+
|
|
229
|
+
def on_session_finalize(self, session_id: str = "", **kwargs: Any) -> None:
|
|
230
|
+
self._clear_session(session_id)
|
|
231
|
+
|
|
232
|
+
def _clear_session(self, session_id: str) -> None:
|
|
233
|
+
try:
|
|
234
|
+
self.ledger.clear_session(session_id)
|
|
235
|
+
except LedgerError as exc:
|
|
236
|
+
logger.warning("FailproofAI instruction cleanup failed: %s", exc)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def register(ctx: Any) -> None:
|
|
240
|
+
plugin = FailproofAIPlugin(ctx)
|
|
241
|
+
ctx.register_hook("pre_tool_call", plugin.pre_tool_call)
|
|
242
|
+
ctx.register_hook("post_tool_call", plugin.post_tool_call)
|
|
243
|
+
ctx.register_hook("pre_llm_call", plugin.pre_llm_call)
|
|
244
|
+
ctx.register_hook("on_session_start", plugin.on_session_start)
|
|
245
|
+
ctx.register_hook("on_session_end", plugin.on_session_end)
|
|
246
|
+
ctx.register_hook("on_session_reset", plugin.on_session_reset)
|
|
247
|
+
ctx.register_hook("on_session_finalize", plugin.on_session_finalize)
|
|
248
|
+
ctx.register_hook("subagent_stop", plugin.subagent_stop)
|