failproofai 1.0.3 → 1.0.4-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/.grok/hooks/failproofai.json +172 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +4 -4
- 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 +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.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 +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 +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- 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 +1 -1
- 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 +3 -3
- 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 +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.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]__0u3wrvq._.js → [externals]__0_gzk8q._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0-9ti7z._.js → [externals]__1zndo1i._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07hor7h._.js +5 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08dchfu._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cuho4x._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0elsuli._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gnj_qa._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljuzm_._.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]__0w23bpg._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x5c7sh._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yik9_w._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1adacul._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1jg6s9m._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1s6qci9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xfm05z._.js +3 -0
- package/.next/standalone/.next/server/chunks/_09dz7xv._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0tdy_6l._.js +3 -0
- 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/_1ek68ln._.js +21 -14
- package/.next/standalone/.next/server/chunks/lib_grok-projects_ts_1i2epl_._.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_qwen-projects_ts_0wu_a8e._.js +3 -0
- 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/src_hooks_0iu54mz._.js +1 -1
- 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]__0_4gcz8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0d--wmy._.js +3 -0
- 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]__0oa1lav._.js +1 -1
- 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]__0qqrlf_._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s11fx1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0n_lxhg._.js → [root-of-the-server]__0wvusu0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1b5jzxr._.js → [root-of-the-server]__16gamwq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1bbk-si._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1c3ybxr._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1izi7zn._.js +3 -0
- 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]__1qapotl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1zl_r0t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__21bj7uw._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0-yi74u._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0v8eebd._.js → _00z5uuq._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1if9ixi._.js → _08f0jd2._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0wso5d3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0j6gd_k._.js → _1byck5v._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1es2j7i._.js +155 -1
- 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 +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_cline-projects_ts_13_hbdd._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_grok-projects_ts_0rc-d0o._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_ori-projects_ts_04tofqo._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/lib_qwen-projects_ts_0w3i9o7._.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/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
- 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/{0ollg-nnu3t3e.js → 00gv0v91mycm-.js} +1 -1
- package/.next/standalone/.next/static/chunks/{354-n7p7labpn.js → 01hvwwrhvbzyh.js} +1 -1
- package/.next/standalone/.next/static/chunks/0hzmxwb2pvk5p.js +6 -0
- package/.next/standalone/.next/static/chunks/{0nm11ysn0153h.js → 0j884dwnwtyrt.js} +1 -1
- package/.next/standalone/.next/static/chunks/0mr9dg3bnloa1.js +1 -0
- package/.next/standalone/.next/static/chunks/0qn9khv0oo9ex.js +1 -0
- package/.next/standalone/.next/static/chunks/{2xm5mj1d21b4n.js → 1_2jsatfuthrw.js} +1 -1
- package/.next/standalone/.next/static/chunks/1_bxotmf9qngs.js +1 -0
- package/.next/standalone/.next/static/chunks/1eyl7fzkmnkf_.js +1 -0
- package/.next/standalone/.next/static/chunks/{42yfkhekx440s.js → 1po3lirgk2riw.js} +1 -1
- package/.next/standalone/.next/static/chunks/{40lpt2o2b283e.js → 2bnf_4pgyk1rq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1a6u7l3giejch.js → 2bvwsyu6x__ia.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3l36d73kj18zw.js → 3_--3ibia6ba1.js} +1 -1
- package/.next/standalone/.next/static/chunks/3gf1jg-5m-u1t.css +2 -0
- package/.next/standalone/.next/static/chunks/{3pibxnbhjza7n.js → 3ws7eljkq25wg.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-2x-o099q64i8h.js → turbopack-18qf4jodtft6b.js} +1 -1
- package/.next/standalone/.qwen/settings.json +251 -0
- package/.next/standalone/app/project/[name]/page.tsx +24 -4
- package/.next/standalone/assets/logos/cline.png +0 -0
- package/.next/standalone/assets/logos/grok-dark.svg +1 -0
- package/.next/standalone/assets/logos/grok-light.svg +1 -0
- package/.next/standalone/assets/logos/ori-dark.svg +1 -0
- package/.next/standalone/assets/logos/ori-light.svg +1 -0
- package/.next/standalone/assets/logos/qwen.svg +1 -0
- package/.next/standalone/lib/cli-registry.ts +33 -1
- package/.next/standalone/lib/cline-projects.ts +155 -0
- package/.next/standalone/lib/cline-sessions.ts +268 -0
- package/.next/standalone/lib/download-session.ts +37 -0
- package/.next/standalone/lib/grok-projects.ts +123 -0
- package/.next/standalone/lib/grok-sessions.ts +355 -0
- package/.next/standalone/lib/ori-projects.ts +141 -0
- package/.next/standalone/lib/ori-sessions.ts +221 -0
- package/.next/standalone/lib/projects.ts +27 -3
- package/.next/standalone/lib/qwen-projects.ts +106 -0
- package/.next/standalone/lib/qwen-sessions.ts +313 -0
- 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/compiled/next-server/app-route-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +5 -5
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- 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 +2 -2
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/incremental-cache/file-system-cache.js +17 -4
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/escape-path-delimiters.js +1 -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/package.json +11 -11
- package/.next/standalone/sdk/python/uv.lock +29 -29
- package/.next/standalone/server.js +1 -1
- package/README.md +38 -7
- package/bin/failproofai.mjs +24 -7
- package/dist/cli.mjs +20313 -17756
- package/dist/worker.mjs +8521 -6768
- package/lib/cli-registry.ts +33 -1
- package/lib/cline-projects.ts +155 -0
- package/lib/cline-sessions.ts +268 -0
- package/lib/download-session.ts +37 -0
- package/lib/grok-projects.ts +123 -0
- package/lib/grok-sessions.ts +355 -0
- package/lib/ori-projects.ts +141 -0
- package/lib/ori-sessions.ts +221 -0
- package/lib/projects.ts +27 -3
- package/lib/qwen-projects.ts +106 -0
- package/lib/qwen-sessions.ts +313 -0
- package/package.json +11 -11
- package/src/audit/cli-adapters/cline.ts +50 -0
- package/src/audit/cli-adapters/grok.ts +70 -0
- package/src/audit/cli-adapters/index.ts +24 -0
- package/src/audit/cli-adapters/ori.ts +55 -0
- package/src/audit/cli-adapters/qwen.ts +71 -0
- package/src/hooks/batch-expand.ts +380 -0
- package/src/hooks/batch-fanout.ts +142 -0
- package/src/hooks/builtin-policies.ts +6 -4
- package/src/hooks/enforcement-capability.ts +97 -0
- package/src/hooks/handler.ts +61 -5
- package/src/hooks/harness-cli.ts +3 -1
- package/src/hooks/integrations.ts +756 -2
- package/src/hooks/normalize-cli-payload.ts +126 -0
- package/src/hooks/policy-evaluator.ts +297 -6
- package/src/hooks/resolve-transcript-path.ts +10 -0
- package/src/hooks/risk-patterns.ts +26 -0
- package/src/hooks/tool-name-canonicalize.ts +64 -0
- package/src/hooks/types.ts +533 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1le9jqc._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1p-qi2t._.js +0 -5
- package/.next/standalone/.next/server/chunks/_1-akg6w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00-s7h8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__190won8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1sc84bb._.js +0 -3
- package/.next/standalone/.next/static/chunks/03slu0c8_71y7.js +0 -1
- package/.next/standalone/.next/static/chunks/1-_zkmnm-jwei.js +0 -1
- package/.next/standalone/.next/static/chunks/1r9676mkvihto.js +0 -1
- package/.next/standalone/.next/static/chunks/30pct5s734jua.js +0 -6
- package/.next/standalone/.next/static/chunks/40nr6ehj4p3cw.css +0 -2
- package/.next/standalone/.next/static/chunks/41b5ptaocvi_l.js +0 -1
- /package/.next/standalone/.next/static/{JBYgkXkA1PS48m9P_hKNw → qJx3mbOQV-5ElrcRb4Sp7}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{JBYgkXkA1PS48m9P_hKNw → qJx3mbOQV-5ElrcRb4Sp7}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{JBYgkXkA1PS48m9P_hKNw → qJx3mbOQV-5ElrcRb4Sp7}/_ssgManifest.js +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "failproofai",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Observability and enforcement for AI agent harnesses. 39 built-in policies hooked into
|
|
3
|
+
"version": "1.0.4-beta.1",
|
|
4
|
+
"description": "Observability and enforcement for AI agent harnesses. 39 built-in policies hooked into 16 of them — Claude Code, Codex, Cursor, Hermes, OpenClaw and more — blocking the tool call before it runs. Local dashboard included, no account needed.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"failproofai": "./dist/cli.mjs",
|
|
7
7
|
"failproofaid": "./bin/failproofaid-shim.mjs"
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"@testing-library/jest-dom": "^7.0.0",
|
|
88
88
|
"@testing-library/react": "^16.3.2",
|
|
89
89
|
"@testing-library/user-event": "^14.6.5",
|
|
90
|
-
"@types/node": "26.
|
|
90
|
+
"@types/node": "26.4.0",
|
|
91
91
|
"@types/react": "19.2.18",
|
|
92
92
|
"@types/react-dom": "^19.2.3",
|
|
93
93
|
"@vitejs/plugin-react": "^6.1.0",
|
|
@@ -120,15 +120,15 @@
|
|
|
120
120
|
"sharp": "0.35.0"
|
|
121
121
|
},
|
|
122
122
|
"optionalDependencies": {
|
|
123
|
-
"@failproofai/failproofaid-linux-x64": "1.0.
|
|
124
|
-
"@failproofai/failproofaid-linux-arm64": "1.0.
|
|
125
|
-
"@failproofai/failproofaid-darwin-x64": "1.0.
|
|
126
|
-
"@failproofai/failproofaid-darwin-arm64": "1.0.
|
|
123
|
+
"@failproofai/failproofaid-linux-x64": "1.0.4-beta.1",
|
|
124
|
+
"@failproofai/failproofaid-linux-arm64": "1.0.4-beta.1",
|
|
125
|
+
"@failproofai/failproofaid-darwin-x64": "1.0.4-beta.1",
|
|
126
|
+
"@failproofai/failproofaid-darwin-arm64": "1.0.4-beta.1"
|
|
127
127
|
},
|
|
128
128
|
"failproofaidBinaries": {
|
|
129
|
-
"linux-x64": "
|
|
130
|
-
"linux-arm64": "
|
|
131
|
-
"darwin-x64": "
|
|
132
|
-
"darwin-arm64": "
|
|
129
|
+
"linux-x64": "bda0aa2ff38779c247161c8928a6b5ca7dd846ae3ce5c6a6efd8b9509f67fca7",
|
|
130
|
+
"linux-arm64": "557699a24bec7a970839b952ee139b679e2feb0a505f5652a0e770e295ae148a",
|
|
131
|
+
"darwin-x64": "f23ff6e57f45ac51c0f3c7f5b876041100c119d7a3b81105a0df00018a2e2cc1",
|
|
132
|
+
"darwin-arm64": "7bc433a08d26fc148c21bc5471679440bf50300e47f1a2af505465476ca3352e"
|
|
133
133
|
}
|
|
134
134
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cline transcript adapter — AUDIT-ONLY (Pillar 2).
|
|
3
|
+
*
|
|
4
|
+
* The thinnest adapter we have, because cline already stores Claude's own
|
|
5
|
+
* content blocks: lib/cline-projects.ts enumerates the per-session directories
|
|
6
|
+
* (each carrying a real `cwd`, so `audit --project <cwd>` filters work as they
|
|
7
|
+
* do for Devin, Goose and ori), lib/cline-sessions.ts pairs tool_result back
|
|
8
|
+
* onto tool_use, and `logEntriesToEvents` does the rest unchanged.
|
|
9
|
+
*/
|
|
10
|
+
import { getClineSessions } from "../../../lib/cline-projects";
|
|
11
|
+
import { getClineSessionLog } from "../../../lib/cline-sessions";
|
|
12
|
+
import type { NormalizedToolEvent, TranscriptMetadata } from "../types";
|
|
13
|
+
import type { ListOpts } from "./claude";
|
|
14
|
+
import { logEntriesToEvents } from "./shared";
|
|
15
|
+
|
|
16
|
+
export async function listClineTranscriptMetadata(
|
|
17
|
+
opts: ListOpts = {},
|
|
18
|
+
): Promise<TranscriptMetadata[]> {
|
|
19
|
+
const projectFilter = opts.projects ? new Set(opts.projects) : null;
|
|
20
|
+
const sinceMs = opts.sinceMs ?? 0;
|
|
21
|
+
const sessions = await getClineSessions();
|
|
22
|
+
const out: TranscriptMetadata[] = [];
|
|
23
|
+
for (const s of sessions) {
|
|
24
|
+
if (s.mtimeMs < sinceMs) continue;
|
|
25
|
+
if (projectFilter && (!s.cwd || !projectFilter.has(s.cwd))) continue;
|
|
26
|
+
out.push({
|
|
27
|
+
cli: "cline",
|
|
28
|
+
projectName: s.projectName,
|
|
29
|
+
sessionId: s.sessionId,
|
|
30
|
+
transcriptPath: `cline-session://${s.sessionId}`,
|
|
31
|
+
mtimeMs: s.mtimeMs,
|
|
32
|
+
// ended_at/started_at advance per session, so (mtime) is a real cache key.
|
|
33
|
+
sizeBytes: 0,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function streamClineEvents(
|
|
40
|
+
meta: TranscriptMetadata,
|
|
41
|
+
): Promise<NormalizedToolEvent[]> {
|
|
42
|
+
const log = await getClineSessionLog(meta.sessionId);
|
|
43
|
+
if (!log) return [];
|
|
44
|
+
return logEntriesToEvents(log.entries, {
|
|
45
|
+
cli: "cline",
|
|
46
|
+
sessionId: meta.sessionId,
|
|
47
|
+
transcriptPath: meta.transcriptPath,
|
|
48
|
+
cwd: log.cwd ?? "",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* grok CLI transcript adapter — AUDIT (Pillar 2).
|
|
3
|
+
*
|
|
4
|
+
* grok writes one session DIRECTORY at
|
|
5
|
+
* `~/.grok/sessions/<percent-encoded-cwd>/<sessionId>/`, whose
|
|
6
|
+
* `chat_history.jsonl` holds the turns (verified live against grok 1.0.3).
|
|
7
|
+
* lib/grok-sessions.ts enumerates and parses them.
|
|
8
|
+
*
|
|
9
|
+
* `chat_history.jsonl` has no per-message timestamps, so the parser anchors a
|
|
10
|
+
* synthesized timeline on the session's `created_at` (from summary.json) —
|
|
11
|
+
* `listGrokTranscripts` already resolved that, so it is passed straight
|
|
12
|
+
* through here rather than re-read.
|
|
13
|
+
*/
|
|
14
|
+
import { readFile } from "node:fs/promises";
|
|
15
|
+
import { listGrokTranscripts, grokLinesToLogEntries } from "../../../lib/grok-sessions";
|
|
16
|
+
import { parseRawLines } from "../../../lib/log-entries";
|
|
17
|
+
import type { NormalizedToolEvent, TranscriptMetadata } from "../types";
|
|
18
|
+
import type { ListOpts } from "./claude";
|
|
19
|
+
import { logEntriesToEvents } from "./shared";
|
|
20
|
+
|
|
21
|
+
export async function listGrokTranscriptMetadata(
|
|
22
|
+
opts: ListOpts = {},
|
|
23
|
+
): Promise<TranscriptMetadata[]> {
|
|
24
|
+
const projectFilter = opts.projects ? new Set(opts.projects) : null;
|
|
25
|
+
const sinceMs = opts.sinceMs ?? 0;
|
|
26
|
+
const out: TranscriptMetadata[] = [];
|
|
27
|
+
|
|
28
|
+
for (const t of listGrokTranscripts()) {
|
|
29
|
+
if (t.mtimeMs < sinceMs) continue;
|
|
30
|
+
// `audit --project <cwd>` filters on the real cwd (summary.json's info.cwd
|
|
31
|
+
// when present, else the percent-decoded folder name).
|
|
32
|
+
if (projectFilter && !projectFilter.has(t.cwd)) continue;
|
|
33
|
+
out.push({
|
|
34
|
+
cli: "grok",
|
|
35
|
+
projectName: t.projectName,
|
|
36
|
+
sessionId: t.sessionId,
|
|
37
|
+
transcriptPath: t.transcriptPath,
|
|
38
|
+
mtimeMs: t.mtimeMs,
|
|
39
|
+
sizeBytes: t.sizeBytes,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function streamGrokEvents(meta: TranscriptMetadata): Promise<NormalizedToolEvent[]> {
|
|
46
|
+
let content: string;
|
|
47
|
+
try {
|
|
48
|
+
content = await readFile(meta.transcriptPath, "utf-8");
|
|
49
|
+
} catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Recover this session's cwd + created_at from the enumeration (both come
|
|
54
|
+
// from summary.json, which streamEvents is not otherwise given).
|
|
55
|
+
const known = listGrokTranscripts().find((t) => t.sessionId === meta.sessionId);
|
|
56
|
+
|
|
57
|
+
const rawLines = parseRawLines(content, "session");
|
|
58
|
+
const entries = grokLinesToLogEntries(
|
|
59
|
+
rawLines,
|
|
60
|
+
known?.createdAtMs ?? meta.mtimeMs,
|
|
61
|
+
"session",
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
return logEntriesToEvents(entries, {
|
|
65
|
+
cli: "grok",
|
|
66
|
+
sessionId: meta.sessionId,
|
|
67
|
+
transcriptPath: meta.transcriptPath,
|
|
68
|
+
cwd: known?.cwd ?? "",
|
|
69
|
+
});
|
|
70
|
+
}
|
|
@@ -23,6 +23,10 @@ import { listFactoryTranscriptMetadata, streamFactoryEvents } from "./factory";
|
|
|
23
23
|
import { listAntigravityTranscriptMetadata, streamAntigravityEvents } from "./antigravity";
|
|
24
24
|
import { listDevinTranscriptMetadata, streamDevinEvents } from "./devin";
|
|
25
25
|
import { listGooseTranscriptMetadata, streamGooseEvents } from "./goose";
|
|
26
|
+
import { listGrokTranscriptMetadata, streamGrokEvents } from "./grok";
|
|
27
|
+
import { listQwenTranscriptMetadata, streamQwenEvents } from "./qwen";
|
|
28
|
+
import { listOriTranscriptMetadata, streamOriEvents } from "./ori";
|
|
29
|
+
import { listClineTranscriptMetadata, streamClineEvents } from "./cline";
|
|
26
30
|
|
|
27
31
|
export type { ListOpts };
|
|
28
32
|
|
|
@@ -123,6 +127,26 @@ export const ADAPTERS: Record<IntegrationType, CliAdapter> = {
|
|
|
123
127
|
listTranscripts: listGooseTranscriptMetadata,
|
|
124
128
|
streamEvents: streamGooseEvents,
|
|
125
129
|
},
|
|
130
|
+
grok: {
|
|
131
|
+
cli: "grok",
|
|
132
|
+
listTranscripts: listGrokTranscriptMetadata,
|
|
133
|
+
streamEvents: streamGrokEvents,
|
|
134
|
+
},
|
|
135
|
+
qwen: {
|
|
136
|
+
cli: "qwen",
|
|
137
|
+
listTranscripts: listQwenTranscriptMetadata,
|
|
138
|
+
streamEvents: streamQwenEvents,
|
|
139
|
+
},
|
|
140
|
+
ori: {
|
|
141
|
+
cli: "ori",
|
|
142
|
+
listTranscripts: listOriTranscriptMetadata,
|
|
143
|
+
streamEvents: streamOriEvents,
|
|
144
|
+
},
|
|
145
|
+
cline: {
|
|
146
|
+
cli: "cline",
|
|
147
|
+
listTranscripts: listClineTranscriptMetadata,
|
|
148
|
+
streamEvents: streamClineEvents,
|
|
149
|
+
},
|
|
126
150
|
};
|
|
127
151
|
|
|
128
152
|
export function getAdapter(cli: IntegrationType): CliAdapter {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ori (OpenRouter's ori) transcript adapter — AUDIT-ONLY (Pillar 2).
|
|
3
|
+
*
|
|
4
|
+
* Covers ori's OWN agent (bare `ori` / `ori code`). Sessions launched through
|
|
5
|
+
* ori's LAUNCHER (`ori claude`, `ori codex`, …) are recorded by the launched
|
|
6
|
+
* CLI in its own store and are picked up by that CLI's adapter, not this one.
|
|
7
|
+
*
|
|
8
|
+
* ori keeps the whole conversation in one SQLite DB in its global workspace —
|
|
9
|
+
* lib/ori-projects.ts enumerates `ori_agent_loop_sessions`, lib/ori-sessions.ts
|
|
10
|
+
* parses each session's serialized message array — producing the same
|
|
11
|
+
* LogEntry[] shape the other adapters do, so `logEntriesToEvents` handles the
|
|
12
|
+
* rest. Each session carries a real `cwd`, so `audit --project <cwd>` filters
|
|
13
|
+
* work as they do for Devin and Goose.
|
|
14
|
+
*/
|
|
15
|
+
import { getOriSessions } from "../../../lib/ori-projects";
|
|
16
|
+
import { getOriSessionLog } from "../../../lib/ori-sessions";
|
|
17
|
+
import type { NormalizedToolEvent, TranscriptMetadata } from "../types";
|
|
18
|
+
import type { ListOpts } from "./claude";
|
|
19
|
+
import { logEntriesToEvents } from "./shared";
|
|
20
|
+
|
|
21
|
+
export async function listOriTranscriptMetadata(
|
|
22
|
+
opts: ListOpts = {},
|
|
23
|
+
): Promise<TranscriptMetadata[]> {
|
|
24
|
+
const projectFilter = opts.projects ? new Set(opts.projects) : null;
|
|
25
|
+
const sinceMs = opts.sinceMs ?? 0;
|
|
26
|
+
const sessions = await getOriSessions();
|
|
27
|
+
const out: TranscriptMetadata[] = [];
|
|
28
|
+
for (const s of sessions) {
|
|
29
|
+
if (s.mtimeMs < sinceMs) continue;
|
|
30
|
+
if (projectFilter && (!s.cwd || !projectFilter.has(s.cwd))) continue;
|
|
31
|
+
out.push({
|
|
32
|
+
cli: "ori",
|
|
33
|
+
projectName: s.projectName,
|
|
34
|
+
sessionId: s.sessionId,
|
|
35
|
+
transcriptPath: `ori-db://${s.sessionId}`,
|
|
36
|
+
mtimeMs: s.mtimeMs,
|
|
37
|
+
// updated_at advances on each turn, so (mtime) forms a real cache key.
|
|
38
|
+
sizeBytes: 0,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export async function streamOriEvents(
|
|
45
|
+
meta: TranscriptMetadata,
|
|
46
|
+
): Promise<NormalizedToolEvent[]> {
|
|
47
|
+
const log = await getOriSessionLog(meta.sessionId);
|
|
48
|
+
if (!log) return [];
|
|
49
|
+
return logEntriesToEvents(log.entries, {
|
|
50
|
+
cli: "ori",
|
|
51
|
+
sessionId: meta.sessionId,
|
|
52
|
+
transcriptPath: meta.transcriptPath,
|
|
53
|
+
cwd: log.cwd ?? "",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qwen Code transcript adapter — AUDIT (Pillar 2).
|
|
3
|
+
*
|
|
4
|
+
* qwen writes real JSONL transcripts at
|
|
5
|
+
* `~/.qwen/projects/<encoded-cwd>/chats/<sessionId>.jsonl` (Claude-style
|
|
6
|
+
* encoded-cwd folders, one level deeper than Claude's; verified live against
|
|
7
|
+
* qwen-code 0.21.12). lib/qwen-sessions.ts enumerates and parses them — the
|
|
8
|
+
* message bodies are Gemini-shaped `parts[]`, not Claude content blocks — into
|
|
9
|
+
* the shared LogEntry[] shape, so `logEntriesToEvents` handles the rest.
|
|
10
|
+
*/
|
|
11
|
+
import { readFile } from "node:fs/promises";
|
|
12
|
+
import { listQwenTranscripts, qwenLinesToLogEntries } from "../../../lib/qwen-sessions";
|
|
13
|
+
import { parseRawLines } from "../../../lib/log-entries";
|
|
14
|
+
import type { NormalizedToolEvent, TranscriptMetadata } from "../types";
|
|
15
|
+
import type { ListOpts } from "./claude";
|
|
16
|
+
import { logEntriesToEvents } from "./shared";
|
|
17
|
+
|
|
18
|
+
export async function listQwenTranscriptMetadata(
|
|
19
|
+
opts: ListOpts = {},
|
|
20
|
+
): Promise<TranscriptMetadata[]> {
|
|
21
|
+
const projectFilter = opts.projects ? new Set(opts.projects) : null;
|
|
22
|
+
const sinceMs = opts.sinceMs ?? 0;
|
|
23
|
+
const out: TranscriptMetadata[] = [];
|
|
24
|
+
|
|
25
|
+
for (const t of listQwenTranscripts()) {
|
|
26
|
+
if (t.mtimeMs < sinceMs) continue;
|
|
27
|
+
// `audit --project <cwd>` filters on the decoded working directory.
|
|
28
|
+
if (projectFilter && !projectFilter.has(t.cwd)) continue;
|
|
29
|
+
out.push({
|
|
30
|
+
cli: "qwen",
|
|
31
|
+
projectName: t.projectName,
|
|
32
|
+
sessionId: t.sessionId,
|
|
33
|
+
transcriptPath: t.transcriptPath,
|
|
34
|
+
mtimeMs: t.mtimeMs,
|
|
35
|
+
sizeBytes: t.sizeBytes,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function streamQwenEvents(meta: TranscriptMetadata): Promise<NormalizedToolEvent[]> {
|
|
42
|
+
let content: string;
|
|
43
|
+
try {
|
|
44
|
+
content = await readFile(meta.transcriptPath, "utf-8");
|
|
45
|
+
} catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const rawLines = parseRawLines(content, "session");
|
|
50
|
+
const entries = qwenLinesToLogEntries(rawLines, "session");
|
|
51
|
+
|
|
52
|
+
// Every qwen line carries the real cwd — take the first rather than
|
|
53
|
+
// re-decoding the (lossy) folder name.
|
|
54
|
+
let cwd = "";
|
|
55
|
+
for (const line of rawLines) {
|
|
56
|
+
if (line && typeof line === "object") {
|
|
57
|
+
const c = (line as Record<string, unknown>).cwd;
|
|
58
|
+
if (typeof c === "string" && c.length > 0) {
|
|
59
|
+
cwd = c;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return logEntriesToEvents(entries, {
|
|
66
|
+
cli: "qwen",
|
|
67
|
+
sessionId: meta.sessionId,
|
|
68
|
+
transcriptPath: meta.transcriptPath,
|
|
69
|
+
cwd,
|
|
70
|
+
});
|
|
71
|
+
}
|