failproofai 1.0.12-beta.2 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +4 -4
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +2 -2
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  30. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/index.html +1 -1
  33. package/.next/standalone/.next/server/app/index.rsc +3 -3
  34. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  35. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  38. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  41. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  44. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  47. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  48. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  51. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  54. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/chunks/_0tovk6q0miud6._.js +1 -1
  57. package/.next/standalone/.next/server/chunks/_0trp3ycqv17cl._.js +1 -1
  58. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4vkpxxu7._.js +1 -1
  59. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08ch3staq3ejw._.js +1 -1
  60. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0bigvy9xmv2ka._.js +1 -1
  61. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h86bl2qf0k_o._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pia5h3p8re4c._.js +1 -1
  63. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pwj2h2efe5f-._.js +1 -1
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-ey9fgesfbc0._.js +1 -1
  65. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__15usvs-ms-0hf._.js +1 -1
  66. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__00l2u6j86cb8y._.js → [root-of-the-server]__167mipqmjprq5._.js} +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16gb3_92zvk5x._.js +1 -1
  68. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1avi2kypusyb_._.js +1 -1
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1r7drlqli-ado._.js +1 -1
  70. package/.next/standalone/.next/server/chunks/ssr/_0bseae9u7g98r._.js +1 -1
  71. package/.next/standalone/.next/server/chunks/ssr/_0eoura3_9gjb-._.js +1 -1
  72. package/.next/standalone/.next/server/chunks/ssr/_0mouhaflye1ro._.js +1 -1
  73. package/.next/standalone/.next/server/chunks/ssr/_0pedwblqdoh58._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/ssr/{_1fw0_nzkae5ao._.js → _1d98fyfrcaqhy._.js} +2 -2
  75. package/.next/standalone/.next/server/chunks/ssr/_1djqs9i27e4kg._.js +1 -1
  76. package/.next/standalone/.next/server/chunks/ssr/_20hn4gn87nsjc._.js +1 -1
  77. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo5_vm5f.js +2 -2
  78. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9snixb5fd-._.js +1 -1
  79. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47q0xq5w._.js +1 -1
  80. package/.next/standalone/.next/server/chunks/ssr/app_components_project-list_tsx_1ke6anr0vt64h._.js +1 -1
  81. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x33jqb6._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpcz0uxur._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h47jmhhd._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_1fv03uigni8s5.js → node_modules_html-to-image_es_index_0tqc05n832v7a.js} +1 -1
  85. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0janj0i6dqko7._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/ssr/package_json_[json]_cjs_013tntikdft59._.js +1 -1
  87. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  88. package/.next/standalone/.next/server/pages/404.html +1 -1
  89. package/.next/standalone/.next/server/pages/500.html +1 -1
  90. package/.next/standalone/.next/server/preview-props.json +3 -3
  91. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/server-reference-manifest.json +23 -23
  93. package/.next/standalone/.next/static/chunks/{1c_jf6g5wnslk.js → 0el9n3h9_zp5m.js} +1 -1
  94. package/.next/standalone/.next/static/chunks/0k7g_8x3o6gd-.js +1 -0
  95. package/.next/standalone/.next/static/chunks/{2o6d37j425uci.js → 0umzct31duk5g.js} +1 -1
  96. package/.next/standalone/.next/static/chunks/{42xptz88mtq3x.js → 0wobqgosirs8p.js} +1 -1
  97. package/.next/standalone/.next/static/chunks/12rug3jilwqzs.js +1 -0
  98. package/.next/standalone/.next/static/chunks/{0ay__-d2h1xb5.js → 1kduj74-715jh.js} +1 -1
  99. package/.next/standalone/.next/static/chunks/{40oworn_-x12p.js → 2701amhrbsbot.js} +1 -1
  100. package/.next/standalone/.next/static/chunks/{0tbm3vjm62h-2.js → 27cavoc8paelg.js} +1 -1
  101. package/.next/standalone/.next/static/chunks/{1my3-5p47t7r-.js → 2ve23a7keupjw.js} +1 -1
  102. package/.next/standalone/.next/static/chunks/{21hckpmsc4g70.js → 3bv6xaoitjpnh.js} +2 -2
  103. package/.next/standalone/fp-cloud-cli/CHANGELOG.md +19 -0
  104. package/.next/standalone/fp-cloud-cli/README.md +120 -0
  105. package/.next/standalone/fp-cloud-cli/fp_cli/app.py +15 -1
  106. package/.next/standalone/fp-cloud-cli/fp_cli/client.py +198 -7
  107. package/.next/standalone/fp-cloud-cli/fp_cli/cloud_output.py +523 -0
  108. package/.next/standalone/fp-cloud-cli/fp_cli/commands/_cloud.py +45 -0
  109. package/.next/standalone/fp-cloud-cli/fp_cli/commands/_write.py +3 -1
  110. package/.next/standalone/fp-cloud-cli/fp_cli/commands/account_cmds.py +171 -0
  111. package/.next/standalone/fp-cloud-cli/fp_cli/commands/agent_cmds.py +80 -7
  112. package/.next/standalone/fp-cloud-cli/fp_cli/commands/alerts_cmds.py +23 -0
  113. package/.next/standalone/fp-cloud-cli/fp_cli/commands/audits_cmds.py +2 -0
  114. package/.next/standalone/fp-cloud-cli/fp_cli/commands/contracts_cmds.py +67 -0
  115. package/.next/standalone/fp-cloud-cli/fp_cli/commands/dashboards_cmds.py +159 -0
  116. package/.next/standalone/fp-cloud-cli/fp_cli/commands/evaluators_cmds.py +380 -0
  117. package/.next/standalone/fp-cloud-cli/fp_cli/commands/events_cmds.py +14 -1
  118. package/.next/standalone/fp-cloud-cli/fp_cli/commands/incidents_cmds.py +82 -6
  119. package/.next/standalone/fp-cloud-cli/fp_cli/commands/list_cmds.py +4 -1
  120. package/.next/standalone/fp-cloud-cli/fp_cli/commands/orgs_cmds.py +17 -0
  121. package/.next/standalone/fp-cloud-cli/fp_cli/commands/policies_cmds.py +143 -1
  122. package/.next/standalone/fp-cloud-cli/fp_cli/commands/queries_cmds.py +70 -0
  123. package/.next/standalone/fp-cloud-cli/fp_cli/commands/sentiment_cmds.py +49 -0
  124. package/.next/standalone/fp-cloud-cli/fp_cli/commands/sessions_cmds.py +95 -1
  125. package/.next/standalone/fp-cloud-cli/fp_cli/commands/settings_cmds.py +2 -0
  126. package/.next/standalone/fp-cloud-cli/fp_cli/commands/usage_cmds.py +21 -1
  127. package/.next/standalone/fp-cloud-cli/fp_cli/commands/users_cmds.py +14 -0
  128. package/.next/standalone/fp-cloud-cli/fp_cli/errors.py +3 -0
  129. package/.next/standalone/fp-cloud-cli/fp_cli/evaluator_spec.py +266 -0
  130. package/.next/standalone/fp-cloud-cli/fp_cli/output.py +187 -81
  131. package/.next/standalone/fp-cloud-cli/fp_cli/theme.py +21 -24
  132. package/.next/standalone/fp-cloud-cli/skill/SKILL.md +124 -23
  133. package/.next/standalone/fp-cloud-cli/skill/agents/openai.yaml +2 -1
  134. package/.next/standalone/fp-cloud-cli/skill/references/commands.md +168 -16
  135. package/.next/standalone/fp-cloud-cli/tests/fake_cloud_smoke.py +312 -0
  136. package/.next/standalone/fp-cloud-cli/tests/test_cloud_account.py +125 -0
  137. package/.next/standalone/fp-cloud-cli/tests/test_cloud_agent.py +253 -0
  138. package/.next/standalone/fp-cloud-cli/tests/test_cloud_human_views.py +287 -0
  139. package/.next/standalone/fp-cloud-cli/tests/test_cloud_observability.py +116 -0
  140. package/.next/standalone/fp-cloud-cli/tests/test_cloud_transport.py +141 -0
  141. package/.next/standalone/fp-cloud-cli/tests/test_commands.py +3 -3
  142. package/.next/standalone/fp-cloud-cli/tests/test_dashboards_agent.py +3 -3
  143. package/.next/standalone/fp-cloud-cli/tests/test_evaluator_authoring.py +449 -0
  144. package/.next/standalone/fp-cloud-cli/tests/test_facets.py +1 -1
  145. package/.next/standalone/fp-cloud-cli/tests/test_help_table_coverage.py +15 -0
  146. package/.next/standalone/fp-cloud-cli/tests/test_operator.py +1 -1
  147. package/.next/standalone/fp-cloud-cli/tests/test_orgs.py +1 -1
  148. package/.next/standalone/fp-cloud-cli/tests/test_output.py +37 -37
  149. package/.next/standalone/fp-cloud-cli/tests/test_round4_behaviour.py +144 -0
  150. package/.next/standalone/fp-cloud-cli/tests/test_screen_language.py +80 -0
  151. package/.next/standalone/fp-cloud-cli/tests/test_session_reevaluate.py +33 -0
  152. package/.next/standalone/fp-cloud-cli/tests/test_staging_parity.py +198 -0
  153. package/.next/standalone/fp-cloud-cli/tests/test_whoami.py +1 -1
  154. package/.next/standalone/hermes-plugin/plugin.yaml +1 -1
  155. package/.next/standalone/package.json +9 -9
  156. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +68 -176
  157. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +2 -2
  158. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +4 -4
  159. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +1 -1
  160. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +7 -7
  161. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +1 -1
  162. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +7 -7
  163. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +1 -1
  164. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +98 -115
  165. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +3 -3
  166. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +4 -4
  167. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +1 -1
  168. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +4 -4
  169. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +1 -1
  170. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +149 -171
  171. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +2 -2
  172. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +4 -4
  173. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +1 -1
  174. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +25 -25
  175. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +1 -1
  176. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +7 -7
  177. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +1 -1
  178. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +10 -10
  179. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +1 -1
  180. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +7 -7
  181. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +1 -1
  182. package/.next/standalone/server.js +1 -1
  183. package/dist/cli.mjs +85 -37
  184. package/dist/worker.mjs +73 -28
  185. package/hermes-plugin/plugin.yaml +1 -1
  186. package/package.json +9 -9
  187. package/src/hooks/agent-skill.ts +3 -0
  188. package/src/hooks/fp-home.ts +1 -1
  189. package/src/hooks/handler.ts +22 -3
  190. package/src/hooks/semantic/intent.ts +127 -24
  191. package/src/hooks/semantic/jev-review.ts +21 -2
  192. package/.next/standalone/.next/static/chunks/20py8k1gd_i1m.js +0 -1
  193. package/.next/standalone/.next/static/chunks/2hmex93ppj1ke.js +0 -1
  194. /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → D7LY1YSrw96ZxKSpxxrFw}/_buildManifest.js +0 -0
  195. /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → D7LY1YSrw96ZxKSpxxrFw}/_clientMiddlewareManifest.js +0 -0
  196. /package/.next/standalone/.next/static/{LHCtFxVG0mdvd4lsXAOFC → D7LY1YSrw96ZxKSpxxrFw}/_ssgManifest.js +0 -0
@@ -0,0 +1,198 @@
1
+ """Commands aligned with the FailproofAI Cloud staging API after the #885 port:
2
+ every-kind policy backtests, Jev/both authoring, issue board filters and facets,
3
+ evaluation facets, session import and judge/Jev backfill."""
4
+
5
+ import gzip
6
+ import json
7
+
8
+ import pytest
9
+ import respx
10
+
11
+ from fp_cli.app import app
12
+
13
+ BASE = "http://dash.test"
14
+ CHECKS = [{"name": "prod-db", "question": "Does this touch the production database?"}]
15
+
16
+
17
+ def sse(events):
18
+ return "".join(f"data: {json.dumps(e)}\n\n" for e in events)
19
+
20
+
21
+ def test_backtest_regex_file_keeps_the_module_route(logged_in, runner, tmp_path):
22
+ src = tmp_path / "p.mjs"
23
+ src.write_text("export default {}")
24
+ with respx.mock as mock:
25
+ route = mock.post(f"{BASE}/api/agent/policy-backtest").respond(200, json={"matched": 0})
26
+ result = runner.invoke(app, ["--json", "policies", "backtest", str(src), "--agent-id", "a1", "--hours", "24"])
27
+ assert result.exit_code == 0, result.output
28
+ assert json.loads(route.calls[0].request.content) == {"source": "export default {}", "agentId": "a1", "hours": 24}
29
+
30
+
31
+ def test_backtest_published_jev_policy_uses_backtest_all_estimate(logged_in, runner):
32
+ with respx.mock as mock:
33
+ mock.get(f"{BASE}/api/enforcement/policies").respond(200, json=[
34
+ {"id": "p1", "version": 1, "kind": "jev", "semantic": CHECKS},
35
+ ])
36
+ route = mock.post(f"{BASE}/api/agent/policy-backtest-all").respond(200, json={"kind": "jev", "mode": "estimate"})
37
+ result = runner.invoke(app, ["--json", "policies", "backtest", "p1"])
38
+ assert result.exit_code == 0, result.output
39
+ assert json.loads(route.calls[0].request.content) == {
40
+ "kind": "jev", "semantic": CHECKS, "hours": 168, "mode": "estimate",
41
+ }
42
+
43
+
44
+ def test_backtest_both_from_files_with_run(logged_in, runner, tmp_path):
45
+ src, sem = tmp_path / "p.mjs", tmp_path / "checks.json"
46
+ src.write_text("export default {}")
47
+ sem.write_text(json.dumps(CHECKS))
48
+ with respx.mock as mock:
49
+ route = mock.post(f"{BASE}/api/agent/policy-backtest-all").respond(200, json={"kind": "both"})
50
+ result = runner.invoke(app, ["--json", "policies", "backtest", str(src), "--semantic", str(sem),
51
+ "--run", "--sample", "10"])
52
+ assert result.exit_code == 0, result.output
53
+ body = json.loads(route.calls[0].request.content)
54
+ assert body["kind"] == "both" and body["mode"] == "run" and body["sample"] == 10
55
+ assert body["source"] == "export default {}" and body["semantic"] == CHECKS
56
+
57
+
58
+ @pytest.mark.parametrize("argv", [
59
+ ["policies", "backtest"],
60
+ ["policies", "backtest", "--kind", "jev", "--semantic", "missing.json"],
61
+ ["policies", "backtest", "x.mjs", "--kind", "nope"],
62
+ ["policies", "backtest", "x.mjs", "--sample", "99"],
63
+ ])
64
+ def test_backtest_usage_errors(logged_in, runner, argv):
65
+ with respx.mock(assert_all_called=False):
66
+ result = runner.invoke(app, ["--json", *argv])
67
+ assert result.exit_code == 2, result.output
68
+
69
+
70
+ @pytest.mark.parametrize("kind,sent", [(None, None), ("regex", None), ("jev", "jev"), ("both", "both")])
71
+ def test_author_kind(logged_in, runner, kind, sent):
72
+ with respx.mock as mock:
73
+ route = mock.post(f"{BASE}/api/agent/policy-author").respond(
74
+ 200, text=sse([{"type": "done", "result": {"source": "x"}}]))
75
+ result = runner.invoke(app, ["--json", "policies", "author", "No prod DB",
76
+ *(["--kind", kind] if kind else [])])
77
+ assert result.exit_code == 0, result.output
78
+ assert json.loads(route.calls[0].request.content).get("kind") == sent
79
+
80
+
81
+ @pytest.mark.parametrize("key_mode", [False, True])
82
+ def test_issue_list_filters(logged_in, runner, key_mode):
83
+ prefix = "/v1" if key_mode else "/api"
84
+ with respx.mock as mock:
85
+ route = mock.get(f"{BASE}{prefix}/issues").respond(200, json=[])
86
+ result = runner.invoke(app, ["--json", *(["--api-key", "k"] if key_mode else []), "issues", "list",
87
+ "--agent-id", "a1,a2", "--source", "audit", "--assignee", "me",
88
+ "--archived", "all", "--search", "timeout"])
89
+ assert result.exit_code == 0, result.output
90
+ params = route.calls[0].request.url.params
91
+ assert params["agent"] == "a1,a2" and params["source"] == "audit"
92
+ assert params["assignee"] == "me" and params["archived"] == "all" and params["q"] == "timeout"
93
+ assert json.loads(result.stdout) == {"issues": []}
94
+
95
+
96
+ def test_issue_list_alert_id_alone_keeps_the_alert_route(logged_in, runner):
97
+ with respx.mock as mock:
98
+ route = mock.get(f"{BASE}/api/alerts/al1/issues").respond(200, json=[])
99
+ result = runner.invoke(app, ["--json", "issues", "list", "--alert-id", "al1"])
100
+ assert result.exit_code == 0, result.output
101
+ assert route.called
102
+
103
+
104
+ def test_issue_count_and_facets(logged_in, runner):
105
+ with respx.mock as mock:
106
+ count = mock.get(f"{BASE}/api/issues/count").respond(200, json={"count": 3})
107
+ facets = mock.get(f"{BASE}/api/issues/facets").respond(200, json={"agents": [{"value": "a1", "count": 3}]})
108
+ r1 = runner.invoke(app, ["--json", "issues", "count", "--env", "prod"])
109
+ r2 = runner.invoke(app, ["--json", "issues", "facets", "--state", "firing"])
110
+ assert r1.exit_code == 0 and json.loads(r1.stdout) == {"count": 3}
111
+ assert count.calls[0].request.url.params["environment"] == "prod"
112
+ assert r2.exit_code == 0, r2.output
113
+ assert facets.calls[0].request.url.params["state"] == "firing"
114
+
115
+
116
+ def test_issue_filter_validation(logged_in, runner):
117
+ with respx.mock(assert_all_called=False):
118
+ assert runner.invoke(app, ["issues", "list", "--archived", "maybe"]).exit_code == 2
119
+ assert runner.invoke(app, ["issues", "list", "--source", "slack"]).exit_code == 2
120
+
121
+
122
+ @pytest.mark.parametrize("name,path,v1,body,values", [
123
+ ("trigger_events", "/api/events/trigger_events", "/v1/events/trigger_events", ["PreToolUse"], ["PreToolUse"]),
124
+ ("eval_envs", "/api/evaluations/environments", "/v1/evaluations/environments", ["prod"], ["prod"]),
125
+ ("metric_keys", "/api/evaluations/metric-keys", "/v1/evaluations/metric_keys",
126
+ [{"name": "latency_ms", "unit": "ms", "count": 4}], ["latency_ms"]),
127
+ ])
128
+ @pytest.mark.parametrize("key_mode", [False, True])
129
+ def test_new_list_facets(logged_in, runner, name, path, v1, body, values, key_mode):
130
+ with respx.mock as mock:
131
+ mock.get(f"{BASE}{v1 if key_mode else path}").respond(200, json=body)
132
+ result = runner.invoke(app, ["--json", *(["--api-key", "k"] if key_mode else []), "list", name])
133
+ assert result.exit_code == 0, result.output
134
+ assert json.loads(result.stdout) == {"kind": name, "values": values}
135
+
136
+
137
+ def test_sessions_import_gzips_and_shares_one_cutoff(logged_in, runner, tmp_path):
138
+ first, second = tmp_path / "proj" / "s1.jsonl", tmp_path / "proj" / "s2.jsonl.gz"
139
+ first.parent.mkdir()
140
+ first.write_text('{"type":"user"}\n')
141
+ second.write_bytes(gzip.compress(b'{"type":"user"}\n'))
142
+ with respx.mock as mock:
143
+ route = mock.post(f"{BASE}/api/events/import").respond(200, json={"sessions": 1})
144
+ result = runner.invoke(app, ["--json", "sessions", "import", str(first), str(second),
145
+ "--format", "claude", "--env", "dev", "--dry-run"])
146
+ assert result.exit_code == 0, result.output
147
+ assert len(route.calls) == 2
148
+ a, b = (c.request for c in route.calls)
149
+ assert gzip.decompress(a.content) == b'{"type":"user"}\n'
150
+ assert gzip.decompress(b.content) == b'{"type":"user"}\n'
151
+ assert a.headers["content-type"] == "application/octet-stream"
152
+ assert a.url.params["path"] == "proj/s1.jsonl" and a.url.params["format"] == "claude"
153
+ assert a.url.params["dry_run"] == "true" and a.url.params["environment"] == "dev"
154
+ assert a.url.params["existing_before"] == b.url.params["existing_before"]
155
+ out = json.loads(result.stdout)
156
+ assert [f["file"] for f in out["files"]] == [str(first), str(second)]
157
+
158
+
159
+ def test_sessions_import_bad_format_and_missing_file(logged_in, runner, tmp_path):
160
+ with respx.mock(assert_all_called=False):
161
+ assert runner.invoke(app, ["sessions", "import", "x", "--format", "zip"]).exit_code == 2
162
+ assert runner.invoke(app, ["sessions", "import", str(tmp_path / "none.jsonl")]).exit_code == 2
163
+
164
+
165
+ def test_sessions_list_still_works_as_a_group_callback(logged_in, runner):
166
+ with respx.mock as mock:
167
+ mock.get(f"{BASE}/api/sessions").respond(200, json={"sessions": [], "next_cursor": None})
168
+ result = runner.invoke(app, ["--json", "sessions", "--limit", "5"])
169
+ assert result.exit_code == 0, result.output
170
+
171
+
172
+ def test_deploy_backfill_allows_judge(logged_in, runner):
173
+ with respx.mock as mock:
174
+ mock.get(f"{BASE}/api/evaluator-definitions").respond(200, json=[])
175
+ mock.post(f"{BASE}/api/evaluator-definitions").respond(201, json={"id": "d1"})
176
+ backfill = mock.post(f"{BASE}/api/evaluations/backfill").respond(200, json={"enqueued": 2})
177
+ result = runner.invoke(app, ["--json", "evaluators", "deploy", "relevance", "--judge",
178
+ "--criteria", "Grade relevance", "--threshold", "0.7", "--backfill", "7d"])
179
+ assert result.exit_code == 0, result.output
180
+ assert json.loads(backfill.calls[0].request.content)["eval_key"] == "relevance"
181
+ assert "model budget" in result.stderr
182
+
183
+
184
+ def test_usage_windows_needs_a_key(logged_in, runner):
185
+ with respx.mock as mock:
186
+ result = runner.invoke(app, ["--json", "usage", "windows"])
187
+ assert not mock.calls
188
+ assert result.exit_code == 2
189
+
190
+
191
+ def test_sessions_import_public_format_name_maps_to_the_wire_name(logged_in, runner, tmp_path):
192
+ f = tmp_path / "events.jsonl"
193
+ f.write_text('{"event_type":"agent_start"}\n')
194
+ with respx.mock as mock:
195
+ route = mock.post(f"{BASE}/api/events/import").respond(200, json={})
196
+ result = runner.invoke(app, ["--json", "sessions", "import", str(f), "--format", "failproofai"])
197
+ assert result.exit_code == 0, result.output
198
+ assert route.calls[0].request.url.params["format"] == "agenteye"
@@ -66,7 +66,7 @@ def test_whoami_human_renders_header_and_panels(logged_in, runner):
66
66
  assert "62230791-4811-4f04-b388-ae57bdcb422e" in out
67
67
  assert "instance admin" in out
68
68
  # permissions panel
69
- assert "permissions" in out
69
+ assert "PERMISSIONS" in out
70
70
  assert "dashboards" in out and "read" in out and "write" in out and "delete" in out
71
71
  # orgs panel + switch hint to the non-active org
72
72
  assert "your orgs" in out
@@ -1,5 +1,5 @@
1
1
  name: failproofai
2
- version: 1.0.12-beta.2
2
+ version: 1.0.12
3
3
  description: Real-time FailproofAI policy enforcement for Hermes
4
4
  manifest_version: 2
5
5
  api_version: 1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "failproofai",
3
- "version": "1.0.12-beta.2",
3
+ "version": "1.0.12",
4
4
  "description": "Observability and enforcement for AI agent harnesses. 40 built-in policies hooked into 12 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",
@@ -126,15 +126,15 @@
126
126
  "browserslist": "4.28.8"
127
127
  },
128
128
  "optionalDependencies": {
129
- "@failproofai/failproofaid-linux-x64": "1.0.12-beta.2",
130
- "@failproofai/failproofaid-linux-arm64": "1.0.12-beta.2",
131
- "@failproofai/failproofaid-darwin-x64": "1.0.12-beta.2",
132
- "@failproofai/failproofaid-darwin-arm64": "1.0.12-beta.2"
129
+ "@failproofai/failproofaid-linux-x64": "1.0.12",
130
+ "@failproofai/failproofaid-linux-arm64": "1.0.12",
131
+ "@failproofai/failproofaid-darwin-x64": "1.0.12",
132
+ "@failproofai/failproofaid-darwin-arm64": "1.0.12"
133
133
  },
134
134
  "failproofaidBinaries": {
135
- "linux-x64": "4c09117fdb80d87792d1d2b77d9359cdbd0c522b5a6222ab7b927659130ddf54",
136
- "linux-arm64": "dd390d76561267fc519ceb96fb90be340044e2f564bef36a44e284f227d93f29",
137
- "darwin-x64": "62381f7ffe21d02289c36c4b205166b2867dbde986444d1ea185241b94fd04ef",
138
- "darwin-arm64": "9ad798817d3048a5126e80dc71883538d37c1b6b6443e9c19389dc2583c8f675"
135
+ "linux-x64": "3b379ce2b03dd8a74393daed2c3120309f591fe6433e0c939d70c7b20da55be7",
136
+ "linux-arm64": "bd77d7fee68dc2723fb57cc9c7fcf957b7e939c797e61b099c412263880aa16e",
137
+ "darwin-x64": "fce3faab9406b1c2267955f0e07d04ef7a2b7a0b007e12ecd144fcfef563ebc8",
138
+ "darwin-arm64": "765732f8f64aa3d3dbd98e93b1aba71fc02956f65baeb73b08447b37fac3a17b"
139
139
  }
140
140
  }
@@ -6,97 +6,66 @@
6
6
  "": {
7
7
  "name": "failproofai-it-ai-4",
8
8
  "dependencies": {
9
- "ai": "4.3.19",
10
- "zod": "3.25.76"
9
+ "ai": "7.0.152",
10
+ "zod": "4.6.7"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "22.20.4"
14
14
  }
15
15
  },
16
- "node_modules/@ai-sdk/provider": {
17
- "version": "1.1.3",
18
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz",
19
- "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==",
16
+ "node_modules/@ai-sdk/gateway": {
17
+ "version": "4.0.125",
18
+ "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-4.0.125.tgz",
19
+ "integrity": "sha512-9raNdkENebDxVl4piGntpQgOBHB62K1rC87KceV8kkGOc/g7s6lwbxN7C6QTqXYJaM+h1Lnm64MDgnHAmzUApg==",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "json-schema": "^0.4.0"
22
+ "@ai-sdk/provider": "4.0.33",
23
+ "@ai-sdk/provider-utils": "5.0.67",
24
+ "@vercel/oidc": "3.2.0"
23
25
  },
24
26
  "engines": {
25
- "node": ">=18"
26
- }
27
- },
28
- "node_modules/@ai-sdk/provider-utils": {
29
- "version": "2.2.8",
30
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz",
31
- "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==",
32
- "license": "Apache-2.0",
33
- "dependencies": {
34
- "@ai-sdk/provider": "1.1.3",
35
- "nanoid": "^3.3.8",
36
- "secure-json-parse": "^2.7.0"
37
- },
38
- "engines": {
39
- "node": ">=18"
27
+ "node": ">=22"
40
28
  },
41
29
  "peerDependencies": {
42
- "zod": "^3.23.8"
30
+ "zod": "^3.25.76 || ^4.1.8"
43
31
  }
44
32
  },
45
- "node_modules/@ai-sdk/react": {
46
- "version": "1.2.12",
47
- "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz",
48
- "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==",
33
+ "node_modules/@ai-sdk/provider": {
34
+ "version": "4.0.33",
35
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-4.0.33.tgz",
36
+ "integrity": "sha512-C6ylMuAXjgqKJllp6ODIJwUltK/tm3ZmIj4V2fqENP3Y8gif2DyeJSsTcDwFrXppgEKcrBisi/BWx2tYeoeCAw==",
49
37
  "license": "Apache-2.0",
50
38
  "dependencies": {
51
- "@ai-sdk/provider-utils": "2.2.8",
52
- "@ai-sdk/ui-utils": "1.2.11",
53
- "swr": "^2.2.5",
54
- "throttleit": "2.1.0"
39
+ "json-schema": "^0.4.0"
55
40
  },
56
41
  "engines": {
57
- "node": ">=18"
58
- },
59
- "peerDependencies": {
60
- "react": "^18 || ^19 || ^19.0.0-rc",
61
- "zod": "^3.23.8"
62
- },
63
- "peerDependenciesMeta": {
64
- "zod": {
65
- "optional": true
66
- }
42
+ "node": ">=22"
67
43
  }
68
44
  },
69
- "node_modules/@ai-sdk/ui-utils": {
70
- "version": "1.2.11",
71
- "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz",
72
- "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==",
45
+ "node_modules/@ai-sdk/provider-utils": {
46
+ "version": "5.0.67",
47
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-5.0.67.tgz",
48
+ "integrity": "sha512-EUzV6GXutGcesWKOY8tRKgijfuv1LUBpqAquMh5k0n74NCjDbca5d5ZG12qhVtM2X5UwM4B2ZMP2XpnAwZlA8Q==",
73
49
  "license": "Apache-2.0",
74
50
  "dependencies": {
75
- "@ai-sdk/provider": "1.1.3",
76
- "@ai-sdk/provider-utils": "2.2.8",
77
- "zod-to-json-schema": "^3.24.1"
51
+ "@ai-sdk/provider": "4.0.33",
52
+ "@standard-schema/spec": "^1.1.0",
53
+ "@workflow/serde": "4.1.0",
54
+ "eventsource-parser": "^3.0.8",
55
+ "undici": "^7.29.0"
78
56
  },
79
57
  "engines": {
80
- "node": ">=18"
58
+ "node": ">=22"
81
59
  },
82
60
  "peerDependencies": {
83
- "zod": "^3.23.8"
61
+ "zod": "^3.25.76 || ^4.1.8"
84
62
  }
85
63
  },
86
- "node_modules/@dmsnell/diff-match-patch": {
64
+ "node_modules/@standard-schema/spec": {
87
65
  "version": "1.1.0",
88
- "resolved": "https://registry.npmjs.org/@dmsnell/diff-match-patch/-/diff-match-patch-1.1.0.tgz",
89
- "integrity": "sha512-yejLPmM5pjsGvxS9gXablUSbInW7H976c/FJ4iQxWIm7/38xBySRemTPDe34lhg1gVLbJntX0+sH0jYfU+PN9A==",
90
- "license": "Apache-2.0"
91
- },
92
- "node_modules/@opentelemetry/api": {
93
- "version": "1.9.0",
94
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
95
- "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
96
- "license": "Apache-2.0",
97
- "engines": {
98
- "node": ">=8.0.0"
99
- }
66
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
67
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
68
+ "license": "MIT"
100
69
  },
101
70
  "node_modules/@types/node": {
102
71
  "version": "22.20.4",
@@ -108,39 +77,45 @@
108
77
  "undici-types": "~6.21.0"
109
78
  }
110
79
  },
80
+ "node_modules/@vercel/oidc": {
81
+ "version": "3.2.0",
82
+ "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz",
83
+ "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==",
84
+ "license": "Apache-2.0",
85
+ "engines": {
86
+ "node": ">= 20"
87
+ }
88
+ },
89
+ "node_modules/@workflow/serde": {
90
+ "version": "4.1.0",
91
+ "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0.tgz",
92
+ "integrity": "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==",
93
+ "license": "Apache-2.0"
94
+ },
111
95
  "node_modules/ai": {
112
- "version": "4.3.19",
113
- "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz",
114
- "integrity": "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==",
96
+ "version": "7.0.152",
97
+ "resolved": "https://registry.npmjs.org/ai/-/ai-7.0.152.tgz",
98
+ "integrity": "sha512-cxQaE/17qhgqJcLCespbnyaN3c4IkGuNUtBXKSX1yTvlSsQ7ERV2ygFADMG7d+IWCUuvi7R8DrqAy9DGj0cgkg==",
115
99
  "license": "Apache-2.0",
116
100
  "dependencies": {
117
- "@ai-sdk/provider": "1.1.3",
118
- "@ai-sdk/provider-utils": "2.2.8",
119
- "@ai-sdk/react": "1.2.12",
120
- "@ai-sdk/ui-utils": "1.2.11",
121
- "@opentelemetry/api": "1.9.0",
122
- "jsondiffpatch": "0.6.0"
101
+ "@ai-sdk/gateway": "4.0.125",
102
+ "@ai-sdk/provider": "4.0.33",
103
+ "@ai-sdk/provider-utils": "5.0.67"
123
104
  },
124
105
  "engines": {
125
- "node": ">=18"
106
+ "node": ">=22"
126
107
  },
127
108
  "peerDependencies": {
128
- "react": "^18 || ^19 || ^19.0.0-rc",
129
- "zod": "^3.23.8"
130
- },
131
- "peerDependenciesMeta": {
132
- "react": {
133
- "optional": true
134
- }
109
+ "zod": "^3.25.76 || ^4.1.8"
135
110
  }
136
111
  },
137
- "node_modules/dequal": {
138
- "version": "2.0.3",
139
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
140
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
112
+ "node_modules/eventsource-parser": {
113
+ "version": "3.1.1",
114
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz",
115
+ "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==",
141
116
  "license": "MIT",
142
117
  "engines": {
143
- "node": ">=6"
118
+ "node": ">=18.0.0"
144
119
  }
145
120
  },
146
121
  "node_modules/json-schema": {
@@ -149,78 +124,13 @@
149
124
  "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
150
125
  "license": "(AFL-2.1 OR BSD-3-Clause)"
151
126
  },
152
- "node_modules/jsondiffpatch": {
153
- "version": "0.7.6",
154
- "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.7.6.tgz",
155
- "integrity": "sha512-zE9+AXFq+MkTolDor2Cw1nJzLC0aleqPkYf52Kb4Kn4mJcka/gFHpGI2JBVEJCfWOvBl0OoxZS+wuLdislQcqg==",
156
- "license": "MIT",
157
- "dependencies": {
158
- "@dmsnell/diff-match-patch": "^1.1.0"
159
- },
160
- "bin": {
161
- "jsondiffpatch": "bin/jsondiffpatch.js"
162
- },
163
- "engines": {
164
- "node": "^18.0.0 || >=20.0.0"
165
- }
166
- },
167
- "node_modules/nanoid": {
168
- "version": "3.3.19",
169
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
170
- "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
171
- "funding": [
172
- {
173
- "type": "github",
174
- "url": "https://github.com/sponsors/ai"
175
- }
176
- ],
177
- "license": "MIT",
178
- "bin": {
179
- "nanoid": "bin/nanoid.cjs"
180
- },
181
- "engines": {
182
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
183
- }
184
- },
185
- "node_modules/react": {
186
- "version": "19.3.0",
187
- "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz",
188
- "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==",
189
- "license": "MIT",
190
- "peer": true,
191
- "engines": {
192
- "node": ">=0.10.0"
193
- }
194
- },
195
- "node_modules/secure-json-parse": {
196
- "version": "2.7.0",
197
- "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz",
198
- "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==",
199
- "license": "BSD-3-Clause"
200
- },
201
- "node_modules/swr": {
202
- "version": "2.5.1",
203
- "resolved": "https://registry.npmjs.org/swr/-/swr-2.5.1.tgz",
204
- "integrity": "sha512-BRw55e8r0B7SpDN20CAzoQAHl7y1yP7/Zt7oqUjMv0vSt2u2Xnkm88Ws+VypbV9BXHQVuSuyVq7zMjO16wSExw==",
205
- "license": "MIT",
206
- "dependencies": {
207
- "dequal": "^2.0.3",
208
- "use-sync-external-store": "^1.6.0"
209
- },
210
- "peerDependencies": {
211
- "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
212
- }
213
- },
214
- "node_modules/throttleit": {
215
- "version": "2.1.0",
216
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz",
217
- "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==",
127
+ "node_modules/undici": {
128
+ "version": "7.30.1",
129
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz",
130
+ "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==",
218
131
  "license": "MIT",
219
132
  "engines": {
220
- "node": ">=18"
221
- },
222
- "funding": {
223
- "url": "https://github.com/sponsors/sindresorhus"
133
+ "node": ">=20.18.1"
224
134
  }
225
135
  },
226
136
  "node_modules/undici-types": {
@@ -230,32 +140,14 @@
230
140
  "dev": true,
231
141
  "license": "MIT"
232
142
  },
233
- "node_modules/use-sync-external-store": {
234
- "version": "1.7.0",
235
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.7.0.tgz",
236
- "integrity": "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==",
237
- "license": "MIT",
238
- "peerDependencies": {
239
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
240
- }
241
- },
242
143
  "node_modules/zod": {
243
- "version": "3.25.76",
244
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
245
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
144
+ "version": "4.6.7",
145
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz",
146
+ "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==",
246
147
  "license": "MIT",
247
148
  "funding": {
248
149
  "url": "https://github.com/sponsors/colinhacks"
249
150
  }
250
- },
251
- "node_modules/zod-to-json-schema": {
252
- "version": "3.25.2",
253
- "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
254
- "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
255
- "license": "ISC",
256
- "peerDependencies": {
257
- "zod": "^3.25.28 || ^4"
258
- }
259
151
  }
260
152
  }
261
153
  }
@@ -4,8 +4,8 @@
4
4
  "type": "module",
5
5
  "description": "Integration fixture: Vercel AI SDK 4.x against the packed @failproofai/sdk.",
6
6
  "dependencies": {
7
- "ai": "4.3.19",
8
- "zod": "3.25.76"
7
+ "ai": "7.0.152",
8
+ "zod": "4.6.7"
9
9
  },
10
10
  "devDependencies": {
11
11
  "@types/node": "22.20.4"
@@ -7,7 +7,7 @@
7
7
  "name": "failproofai-it-ai-5",
8
8
  "dependencies": {
9
9
  "ai": "5.0.263",
10
- "zod": "4.6.5"
10
+ "zod": "4.6.7"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "22.20.4"
@@ -144,9 +144,9 @@
144
144
  "license": "MIT"
145
145
  },
146
146
  "node_modules/zod": {
147
- "version": "4.6.5",
148
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz",
149
- "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==",
147
+ "version": "4.6.7",
148
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz",
149
+ "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==",
150
150
  "license": "MIT",
151
151
  "funding": {
152
152
  "url": "https://github.com/sponsors/colinhacks"
@@ -5,7 +5,7 @@
5
5
  "description": "Integration fixture: Vercel AI SDK 5.x against the packed @failproofai/sdk.",
6
6
  "dependencies": {
7
7
  "ai": "5.0.263",
8
- "zod": "4.6.5"
8
+ "zod": "4.6.7"
9
9
  },
10
10
  "devDependencies": {
11
11
  "@types/node": "22.20.4"