failproofai 1.0.7-beta.1 → 1.0.7

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 (429) 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 +4 -4
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page.js +4 -4
  16. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  20. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/audit/run/route.js +7 -8
  25. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  33. package/.next/standalone/.next/server/app/audit/page.js +5 -7
  34. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/index.html +1 -1
  37. package/.next/standalone/.next/server/app/index.rsc +15 -15
  38. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  39. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  40. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  42. package/.next/standalone/.next/server/app/page.js +6 -6
  43. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  46. package/.next/standalone/.next/server/app/policies/page.js +11 -13
  47. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  50. package/.next/standalone/.next/server/app/project/[name]/page.js +7 -8
  51. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  54. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  55. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +7 -7
  56. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  59. package/.next/standalone/.next/server/app/projects/page.js +6 -7
  60. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +8 -41
  63. package/.next/standalone/.next/server/app/settings/page.js +9 -12
  64. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/chunks/{[externals]__1j-zsg5._.js → [externals]__1_bftcl._.js} +1 -1
  67. package/.next/standalone/.next/server/chunks/{[externals]__19_pzeq._.js → [externals]__1msfs-h._.js} +1 -1
  68. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  69. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1bf34x4._.js → [root-of-the-server]__1_r2rbg._.js} +7 -5
  70. package/.next/standalone/.next/server/chunks/_09dz7xv._.js +21 -21
  71. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
  72. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
  73. package/.next/standalone/.next/server/chunks/{_1q5i8mb._.js → _1c3k-8x._.js} +2 -2
  74. package/.next/standalone/.next/server/chunks/_1ek68ln._.js +16 -16
  75. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +1 -1
  76. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  77. package/.next/standalone/.next/server/chunks/src_hooks_0iu54mz._.js +3 -0
  78. package/.next/standalone/.next/server/chunks/src_hooks_custom-hooks-loader_ts_0lnb3n3._.js +2 -4
  79. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-_ki57._.js +4 -0
  80. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +4 -0
  81. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +4 -0
  82. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +4 -0
  83. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0yxwl6j._.js → [root-of-the-server]__0bd3mje._.js} +2 -2
  84. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cg-bgc._.js +5 -0
  85. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cpu_mj._.js +3 -0
  86. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1mf3zp6._.js → [root-of-the-server]__0cxe_2_._.js} +3 -3
  87. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +4 -0
  88. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +4 -0
  89. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +4 -0
  90. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u3w0ll._.js +22 -0
  91. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17d_ffl._.js +3 -0
  92. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19d9tgz._.js +5 -0
  93. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jiwfsj._.js +3 -0
  95. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +4 -0
  96. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1phc187._.js +3 -0
  97. package/.next/standalone/.next/server/chunks/ssr/_06imw3p._.js +5 -0
  98. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  99. package/.next/standalone/.next/server/chunks/ssr/{_1w_5l7t._.js → _0h_douw._.js} +1 -1
  100. package/.next/standalone/.next/server/chunks/ssr/{_214wgrp._.js → _1-i_gzc._.js} +2 -2
  101. package/.next/standalone/.next/server/chunks/ssr/{_0bn2oo8._.js → _166t73i._.js} +1 -1
  102. package/.next/standalone/.next/server/chunks/ssr/{_1q46vxx._.js → _1_qswah._.js} +2 -2
  103. package/.next/standalone/.next/server/chunks/ssr/{_1gb0ifp._.js → _1es2j7i._.js} +5 -5
  104. package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +3 -0
  105. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  106. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
  107. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  108. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  109. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +3 -0
  111. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_18_d8l1._.js → node_modules_next_dist_0drixxt._.js} +4 -4
  112. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1cv9_c4._.js +10 -0
  113. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  114. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
  115. package/.next/standalone/.next/server/chunks/ssr/src_hooks_pack-cli_ts_0t7me65._.js +1 -1
  116. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  117. package/.next/standalone/.next/server/pages/404.html +1 -1
  118. package/.next/standalone/.next/server/pages/500.html +1 -1
  119. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/server-reference-manifest.json +23 -56
  121. package/.next/standalone/.next/static/chunks/094xgi4owxaqf.js +1 -0
  122. package/.next/standalone/.next/static/chunks/0__8a7m868fvf.js +1 -0
  123. package/.next/standalone/.next/static/chunks/{12tvm75t5ffui.js → 0o6qlkgubtoex.js} +1 -1
  124. package/.next/standalone/.next/static/chunks/13i7-9is-vhys.js +1 -0
  125. package/.next/standalone/.next/static/chunks/1rz20_pz828f3.js +6 -0
  126. package/.next/standalone/.next/static/chunks/2k9f4tyv04809.css +1 -0
  127. package/.next/standalone/.next/static/chunks/{0vmd180qfntfb.js → 2klitrtzpaoe0.js} +1 -1
  128. package/.next/standalone/.next/static/chunks/{258668t68du6b.js → 2mdh397ghgnvv.js} +1 -1
  129. package/.next/standalone/.next/static/chunks/2rshywgeqsyzk.css +2 -0
  130. package/.next/standalone/.next/static/chunks/3pzx4chkhko9k.js +1 -0
  131. package/.next/standalone/.next/static/chunks/{0qrbdkv9qmvli.js → 3rh5o7e16irrm.js} +1 -1
  132. package/.next/standalone/.next/static/chunks/{29fql3nbnfc9q.js → 43ufqrz8qo3h-.js} +1 -1
  133. package/.next/standalone/SECURITY.md +53 -0
  134. package/.next/standalone/app/actions/pack-actions.ts +0 -12
  135. package/.next/standalone/app/policies/hooks-client.tsx +0 -9
  136. package/.next/standalone/app/settings/page.tsx +1 -20
  137. package/.next/standalone/app/settings/settings-client.tsx +1 -27
  138. package/.next/standalone/app/settings/settings.css +0 -79
  139. package/.next/standalone/package.json +9 -9
  140. package/.next/standalone/sdk/python/skill/SKILL.md +60 -14
  141. package/.next/standalone/sdk/python/skill/agents/openai.yaml +2 -1
  142. package/.next/standalone/sdk/python/skill/references/evaluator.md +255 -0
  143. package/.next/standalone/sdk/python/skill/references/events.md +17 -8
  144. package/.next/standalone/sdk/python/skill/references/frameworks.md +3 -0
  145. package/.next/standalone/sdk/python/skill/references/install.md +3 -0
  146. package/.next/standalone/sdk/python/skill/references/integration.md +6 -2
  147. package/.next/standalone/sdk/python/skill/references/typescript.md +568 -0
  148. package/.next/standalone/sdk/typescript/CHANGELOG.md +133 -0
  149. package/.next/standalone/sdk/typescript/LICENSE +42 -0
  150. package/.next/standalone/sdk/typescript/README.md +552 -0
  151. package/.next/standalone/sdk/typescript/eslint.config.mjs +59 -0
  152. package/.next/standalone/sdk/typescript/examples/research-agent.ts +197 -0
  153. package/.next/standalone/sdk/typescript/integration/ai.test.ts +920 -0
  154. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/agent.ts +337 -0
  155. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +261 -0
  156. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +16 -0
  157. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/surfaces.ts +605 -0
  158. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.json +12 -0
  159. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.surfaces.json +4 -0
  160. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/agent.ts +342 -0
  161. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +156 -0
  162. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +16 -0
  163. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/surfaces.ts +628 -0
  164. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.json +12 -0
  165. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.surfaces.json +4 -0
  166. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/agent.ts +346 -0
  167. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +156 -0
  168. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +13 -0
  169. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/surfaces.ts +651 -0
  170. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.json +12 -0
  171. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.surfaces.json +4 -0
  172. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/agent.ts +350 -0
  173. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +153 -0
  174. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +13 -0
  175. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/surfaces.ts +651 -0
  176. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.json +12 -0
  177. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.surfaces.json +4 -0
  178. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/agent.ts +623 -0
  179. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +344 -0
  180. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +19 -0
  181. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/tsconfig.json +12 -0
  182. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent-v1.ts +99 -0
  183. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent.ts +623 -0
  184. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +336 -0
  185. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +15 -0
  186. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/tsconfig.json +12 -0
  187. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/agent.ts +96 -0
  188. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +441 -0
  189. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +19 -0
  190. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/tsconfig.json +12 -0
  191. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.cjs +53 -0
  192. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.mjs +55 -0
  193. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/package.json +18 -0
  194. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/agent.ts +659 -0
  195. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +635 -0
  196. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +15 -0
  197. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/tsconfig.json +12 -0
  198. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/agent.ts +659 -0
  199. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +553 -0
  200. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +15 -0
  201. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/tsconfig.json +12 -0
  202. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/agent.ts +877 -0
  203. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/mcp-server.mjs +66 -0
  204. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +6797 -0
  205. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +24 -0
  206. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/tsconfig.json +12 -0
  207. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/agent.ts +872 -0
  208. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/mcp-server.mjs +66 -0
  209. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +2540 -0
  210. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +15 -0
  211. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/tsconfig.json +12 -0
  212. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/actions.ts +18 -0
  213. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/ai/route.ts +42 -0
  214. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/edge/route.ts +29 -0
  215. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/langgraph/route.ts +21 -0
  216. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/llamaindex/route.ts +11 -0
  217. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/mastra/route.ts +19 -0
  218. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/status/route.ts +7 -0
  219. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/layout.tsx +9 -0
  220. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/page.tsx +15 -0
  221. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/instrumentation.ts +15 -0
  222. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/ai.ts +61 -0
  223. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/langgraph.ts +68 -0
  224. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/llamaindex.ts +98 -0
  225. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/mastra.ts +90 -0
  226. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/next.config.ts +52 -0
  227. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +4343 -0
  228. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +28 -0
  229. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/agent.ts +51 -0
  230. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +76 -0
  231. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +484 -0
  232. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +15 -0
  233. package/.next/standalone/sdk/typescript/integration/fixtures/types/agent.ts +79 -0
  234. package/.next/standalone/sdk/typescript/integration/fixtures/types/package-lock.json +740 -0
  235. package/.next/standalone/sdk/typescript/integration/fixtures/types/package.json +11 -0
  236. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/agent.ts +197 -0
  237. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package-lock.json +70 -0
  238. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package.json +12 -0
  239. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/tsconfig.json +12 -0
  240. package/.next/standalone/sdk/typescript/integration/global-setup.ts +29 -0
  241. package/.next/standalone/sdk/typescript/integration/harness.ts +451 -0
  242. package/.next/standalone/sdk/typescript/integration/langchain.test.ts +682 -0
  243. package/.next/standalone/sdk/typescript/integration/llamaindex.test.ts +709 -0
  244. package/.next/standalone/sdk/typescript/integration/mastra-coverage.test.ts +386 -0
  245. package/.next/standalone/sdk/typescript/integration/mastra.test.ts +311 -0
  246. package/.next/standalone/sdk/typescript/integration/nextjs.test.ts +341 -0
  247. package/.next/standalone/sdk/typescript/integration/runtime-parity.ts +180 -0
  248. package/.next/standalone/sdk/typescript/integration/runtimes.bun.test.ts +15 -0
  249. package/.next/standalone/sdk/typescript/integration/runtimes.core.test.ts +113 -0
  250. package/.next/standalone/sdk/typescript/integration/runtimes.deno.test.ts +19 -0
  251. package/.next/standalone/sdk/typescript/integration/types.test.ts +141 -0
  252. package/.next/standalone/sdk/typescript/integration/vanilla.test.ts +255 -0
  253. package/.next/standalone/sdk/typescript/package-lock.json +2640 -0
  254. package/.next/standalone/sdk/typescript/package.json +401 -0
  255. package/.next/standalone/sdk/typescript/scripts/finalize-build.mjs +123 -0
  256. package/.next/standalone/sdk/typescript/scripts/release.mjs +177 -0
  257. package/.next/standalone/sdk/typescript/src/clock.ts +58 -0
  258. package/.next/standalone/sdk/typescript/src/context.ts +214 -0
  259. package/.next/standalone/sdk/typescript/src/edge/adapter.ts +18 -0
  260. package/.next/standalone/sdk/typescript/src/edge/ai.ts +116 -0
  261. package/.next/standalone/sdk/typescript/src/edge/index.ts +238 -0
  262. package/.next/standalone/sdk/typescript/src/edge/langchain.ts +18 -0
  263. package/.next/standalone/sdk/typescript/src/edge/llamaindex.ts +12 -0
  264. package/.next/standalone/sdk/typescript/src/edge/mastra.ts +17 -0
  265. package/.next/standalone/sdk/typescript/src/edge/notice.ts +33 -0
  266. package/.next/standalone/sdk/typescript/src/environment.ts +75 -0
  267. package/.next/standalone/sdk/typescript/src/evaluator/authoring.ts +480 -0
  268. package/.next/standalone/sdk/typescript/src/evaluator/cli.ts +96 -0
  269. package/.next/standalone/sdk/typescript/src/evaluator/client.ts +421 -0
  270. package/.next/standalone/sdk/typescript/src/evaluator/expression.ts +1292 -0
  271. package/.next/standalone/sdk/typescript/src/evaluator/index.ts +144 -0
  272. package/.next/standalone/sdk/typescript/src/evaluator/protocol.ts +747 -0
  273. package/.next/standalone/sdk/typescript/src/evaluator/runtime.ts +930 -0
  274. package/.next/standalone/sdk/typescript/src/evaluator/sandbox-worker.ts +171 -0
  275. package/.next/standalone/sdk/typescript/src/evaluator/source-limits.ts +27 -0
  276. package/.next/standalone/sdk/typescript/src/evaluator/source.ts +509 -0
  277. package/.next/standalone/sdk/typescript/src/events.ts +879 -0
  278. package/.next/standalone/sdk/typescript/src/exit.ts +117 -0
  279. package/.next/standalone/sdk/typescript/src/index.ts +186 -0
  280. package/.next/standalone/sdk/typescript/src/integrations/ai.ts +1566 -0
  281. package/.next/standalone/sdk/typescript/src/integrations/compat.ts +322 -0
  282. package/.next/standalone/sdk/typescript/src/integrations/core.ts +1321 -0
  283. package/.next/standalone/sdk/typescript/src/integrations/index.ts +355 -0
  284. package/.next/standalone/sdk/typescript/src/integrations/langchain.ts +2340 -0
  285. package/.next/standalone/sdk/typescript/src/integrations/llamaindex.ts +2111 -0
  286. package/.next/standalone/sdk/typescript/src/integrations/mastra.ts +1802 -0
  287. package/.next/standalone/sdk/typescript/src/logger.ts +98 -0
  288. package/.next/standalone/sdk/typescript/src/next.ts +115 -0
  289. package/.next/standalone/sdk/typescript/src/node-require.ts +446 -0
  290. package/.next/standalone/sdk/typescript/src/redact.ts +305 -0
  291. package/.next/standalone/sdk/typescript/src/resolver.ts +120 -0
  292. package/.next/standalone/sdk/typescript/src/runtime.ts +29 -0
  293. package/.next/standalone/sdk/typescript/src/schema.ts +410 -0
  294. package/.next/standalone/sdk/typescript/src/scopes.ts +701 -0
  295. package/.next/standalone/sdk/typescript/src/shared.ts +33 -0
  296. package/.next/standalone/sdk/typescript/src/version.ts +5 -0
  297. package/.next/standalone/sdk/typescript/src/writer.ts +934 -0
  298. package/.next/standalone/sdk/typescript/test/adapters.test.ts +397 -0
  299. package/.next/standalone/sdk/typescript/test/ai.test.ts +1076 -0
  300. package/.next/standalone/sdk/typescript/test/copies.test.ts +204 -0
  301. package/.next/standalone/sdk/typescript/test/edge.test.ts +183 -0
  302. package/.next/standalone/sdk/typescript/test/evaluator-client.test.ts +234 -0
  303. package/.next/standalone/sdk/typescript/test/evaluator-protocol.test.ts +225 -0
  304. package/.next/standalone/sdk/typescript/test/events.test.ts +193 -0
  305. package/.next/standalone/sdk/typescript/test/expression.test.ts +181 -0
  306. package/.next/standalone/sdk/typescript/test/global-setup.ts +26 -0
  307. package/.next/standalone/sdk/typescript/test/helpers.ts +130 -0
  308. package/.next/standalone/sdk/typescript/test/integrations.test.ts +369 -0
  309. package/.next/standalone/sdk/typescript/test/langchain-copies.test.ts +204 -0
  310. package/.next/standalone/sdk/typescript/test/langchain.test.ts +999 -0
  311. package/.next/standalone/sdk/typescript/test/llamaindex.test.ts +1760 -0
  312. package/.next/standalone/sdk/typescript/test/mastra-coverage.test.ts +501 -0
  313. package/.next/standalone/sdk/typescript/test/mastra-lifecycle.test.ts +479 -0
  314. package/.next/standalone/sdk/typescript/test/mastra.test.ts +285 -0
  315. package/.next/standalone/sdk/typescript/test/next.test.ts +109 -0
  316. package/.next/standalone/sdk/typescript/test/packaging.test.ts +312 -0
  317. package/.next/standalone/sdk/typescript/test/redaction.test.ts +171 -0
  318. package/.next/standalone/sdk/typescript/test/runtimes.test.ts +101 -0
  319. package/.next/standalone/sdk/typescript/test/sandbox.test.ts +189 -0
  320. package/.next/standalone/sdk/typescript/test/scopes.test.ts +271 -0
  321. package/.next/standalone/sdk/typescript/test/setup.ts +19 -0
  322. package/.next/standalone/sdk/typescript/test/skill-snippets.test.ts +73 -0
  323. package/.next/standalone/sdk/typescript/test/spool-contract.test.ts +124 -0
  324. package/.next/standalone/sdk/typescript/test/tracker-bounds.test.ts +191 -0
  325. package/.next/standalone/sdk/typescript/test/wire-format.test.ts +214 -0
  326. package/.next/standalone/sdk/typescript/test/writer.test.ts +407 -0
  327. package/.next/standalone/sdk/typescript/tsconfig.build.json +15 -0
  328. package/.next/standalone/sdk/typescript/tsconfig.cjs.json +19 -0
  329. package/.next/standalone/sdk/typescript/tsconfig.json +28 -0
  330. package/.next/standalone/sdk/typescript/vitest.config.ts +33 -0
  331. package/.next/standalone/sdk/typescript/vitest.integration.config.ts +23 -0
  332. package/.next/standalone/server.js +1 -1
  333. package/bin/failproofai.mjs +2 -115
  334. package/dist/cli.mjs +6538 -13686
  335. package/dist/index.js +1 -19
  336. package/dist/worker.mjs +2085 -8012
  337. package/package.json +9 -9
  338. package/pi-extension/index.ts +0 -11
  339. package/scripts/build-policy-pack.mjs +2 -39
  340. package/src/hooks/builtin-policies.ts +3 -21
  341. package/src/hooks/cloud-enrollment-cli.ts +1 -1
  342. package/src/hooks/cloud-managed-policies.ts +0 -22
  343. package/src/hooks/custom-hooks-loader.ts +7 -45
  344. package/src/hooks/custom-hooks-registry.ts +1 -45
  345. package/src/hooks/first-run-gate.ts +0 -5
  346. package/src/hooks/fp-home.ts +0 -23
  347. package/src/hooks/handler.ts +6 -265
  348. package/src/hooks/hook-activity-store.ts +1 -105
  349. package/src/hooks/hook-telemetry.ts +0 -41
  350. package/src/hooks/loader-utils.ts +0 -6
  351. package/src/hooks/pack-cli.ts +17 -278
  352. package/src/hooks/pack-manifest.ts +7 -479
  353. package/src/hooks/pack-store.ts +10 -156
  354. package/src/hooks/policy-catalog.ts +0 -65
  355. package/src/hooks/policy-evaluator.ts +796 -940
  356. package/src/hooks/policy-registry.ts +0 -25
  357. package/src/hooks/policy-types.ts +0 -126
  358. package/src/hooks/worker-server.ts +26 -119
  359. package/src/index.ts +0 -6
  360. package/.next/standalone/.next/server/chunks/src_hooks_01frwmb._.js +0 -5
  361. package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +0 -3
  362. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01bmjsj._.js +0 -3
  363. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +0 -4
  364. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +0 -4
  365. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__059yza8._.js +0 -3
  366. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0eip4_k._.js +0 -22
  367. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +0 -4
  368. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qcb0mg._.js +0 -3
  369. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qxnccm._.js +0 -5
  370. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +0 -4
  371. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +0 -4
  372. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0soxz2z._.js +0 -3
  373. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yrsbd_._.js +0 -3
  374. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +0 -4
  375. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__13d-wb6._.js +0 -3
  376. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1dinjii._.js +0 -3
  377. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +0 -4
  378. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +0 -4
  379. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qiz0e4._.js +0 -3
  380. package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +0 -3
  381. package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +0 -3
  382. package/.next/standalone/.next/server/chunks/ssr/_0uyu3jf._.js +0 -3
  383. package/.next/standalone/.next/server/chunks/ssr/_1feuvhb._.js +0 -5
  384. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +0 -3
  385. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +0 -3
  386. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0w6mzq5._.js +0 -151
  387. package/.next/standalone/.next/server/chunks/ssr/src_hooks_095a_79._.js +0 -5
  388. package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +0 -3
  389. package/.next/standalone/.next/server/chunks/ssr/src_hooks_18k8rl0._.js +0 -12
  390. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +0 -3
  391. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +0 -3
  392. package/.next/standalone/.next/static/chunks/0cd-_8-c-m1ea.js +0 -6
  393. package/.next/standalone/.next/static/chunks/0uldbut9y2-e8.js +0 -1
  394. package/.next/standalone/.next/static/chunks/1u5zsejmgrir_.js +0 -1
  395. package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
  396. package/.next/standalone/.next/static/chunks/2qv4hshejedtx.css +0 -1
  397. package/.next/standalone/.next/static/chunks/2vkvu9-opa_1z.js +0 -1
  398. package/.next/standalone/.next/static/chunks/37lhv7wa3ywt6.js +0 -1
  399. package/.next/standalone/app/actions/get-jev-config.ts +0 -409
  400. package/.next/standalone/app/actions/update-jev-config.ts +0 -420
  401. package/.next/standalone/app/components/jev-notices.tsx +0 -96
  402. package/.next/standalone/app/settings/jev-panel.tsx +0 -469
  403. package/src/hooks/effective-reviewers.ts +0 -79
  404. package/src/hooks/jev-activity.ts +0 -385
  405. package/src/hooks/jev-cli.ts +0 -1193
  406. package/src/hooks/policy-authority.ts +0 -333
  407. package/src/hooks/policy-reviewability.ts +0 -229
  408. package/src/hooks/semantic/combine.ts +0 -541
  409. package/src/hooks/semantic/compile.ts +0 -176
  410. package/src/hooks/semantic/decide.ts +0 -392
  411. package/src/hooks/semantic/envelope.ts +0 -1296
  412. package/src/hooks/semantic/evaluator.ts +0 -547
  413. package/src/hooks/semantic/facts.ts +0 -292
  414. package/src/hooks/semantic/intent.ts +0 -1190
  415. package/src/hooks/semantic/jev-client.ts +0 -643
  416. package/src/hooks/semantic/jev-config.ts +0 -594
  417. package/src/hooks/semantic/jev-review.ts +0 -374
  418. package/src/hooks/semantic/jev-stats.ts +0 -289
  419. package/src/hooks/semantic/jev-throttle.ts +0 -421
  420. package/src/hooks/semantic/pack-policies.ts +0 -251
  421. package/src/hooks/semantic/policies.ts +0 -596
  422. package/src/hooks/semantic/precondition-names.ts +0 -60
  423. package/src/hooks/semantic/preconditions.ts +0 -58
  424. package/src/hooks/semantic/redact.ts +0 -2910
  425. package/src/hooks/semantic/types.ts +0 -145
  426. package/src/hooks/semver-precedence.ts +0 -128
  427. /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → PgeWCHmyVbjRznv2VO7KF}/_buildManifest.js +0 -0
  428. /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → PgeWCHmyVbjRznv2VO7KF}/_clientMiddlewareManifest.js +0 -0
  429. /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → PgeWCHmyVbjRznv2VO7KF}/_ssgManifest.js +0 -0
@@ -0,0 +1,130 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, mkdtempSync, readFileSync, readdirSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath, pathToFileURL } from "node:url";
6
+
7
+ import { setBaseDir } from "../src/resolver.js";
8
+ import { runtime } from "../src/runtime.js";
9
+
10
+ export interface Spool {
11
+ dir: string;
12
+ /** Every event written so far, oldest batch first. */
13
+ events(): Array<Record<string, unknown>>;
14
+ /** The raw lines, for tests that care about bytes rather than values. */
15
+ lines(): string[];
16
+ files(): string[];
17
+ /**
18
+ * Drain the writer into THIS spool, then remove it.
19
+ *
20
+ * Draining first is not tidiness. The writer is process-wide and its queue
21
+ * outlives a test, so a test that left events buffered would have them
22
+ * flushed by the NEXT test — into that test's assertions, and, in the window
23
+ * where no base directory is set, into the developer's real
24
+ * `~/.failproofai/custom-agents`, where a running daemon would collect them.
25
+ */
26
+ cleanup(): Promise<void>;
27
+ }
28
+
29
+ /**
30
+ * A throwaway spool root with the writer pointed at it.
31
+ *
32
+ * Every test that emits anything needs this: without it they would write into
33
+ * the developer's real `~/.failproofai/custom-agents`, where a daemon would
34
+ * happily collect the fixtures and ship them.
35
+ */
36
+ export function useSpool(): Spool {
37
+ const dir = mkdtempSync(join(tmpdir(), "failproofai-sdk-test-"));
38
+ setBaseDir(dir);
39
+ const eventsDir = join(dir, "events");
40
+ return {
41
+ dir,
42
+ files(): string[] {
43
+ try {
44
+ return readdirSync(eventsDir)
45
+ .filter((name) => name.endsWith(".jsonl"))
46
+ .sort();
47
+ } catch {
48
+ return [];
49
+ }
50
+ },
51
+ lines(): string[] {
52
+ return this.files().flatMap((name) =>
53
+ readFileSync(join(eventsDir, name), "utf8").split("\n").filter(Boolean),
54
+ );
55
+ },
56
+ events(): Array<Record<string, unknown>> {
57
+ return this.lines().map((line) => JSON.parse(line) as Record<string, unknown>);
58
+ },
59
+ async cleanup(): Promise<void> {
60
+ await runtime.writer.flushNow();
61
+ setBaseDir(null);
62
+ rmSync(dir, { recursive: true, force: true });
63
+ },
64
+ };
65
+ }
66
+
67
+ /** Flush the process-wide writer and read back what landed. */
68
+ export async function flushed(spool: Spool): Promise<Array<Record<string, unknown>>> {
69
+ await runtime.writer.flushNow();
70
+ return spool.events();
71
+ }
72
+
73
+ /** The built ESM entry, as a URL a child process can import. */
74
+ export function indexUrl(): string {
75
+ const root = dirname(dirname(fileURLToPath(import.meta.url)));
76
+ const entry = join(root, "dist/esm/index.js");
77
+ if (!existsSync(entry)) {
78
+ throw new Error(`dist/esm/index.js is not built. Run \`npm run build\` (\`npm test\` does it).`);
79
+ }
80
+ return pathToFileURL(entry).href;
81
+ }
82
+
83
+ /**
84
+ * Run `source` in a FRESH Node process and collect its output.
85
+ *
86
+ * Some of this SDK's guarantees are about process lifetime — the flush interval
87
+ * must not keep the loop alive, and the exit hook must write what is buffered.
88
+ * Neither can be observed from inside a test runner, which holds the loop open
89
+ * by itself and never exits.
90
+ */
91
+ export async function runNode(
92
+ source: string,
93
+ ): Promise<{ code: number | null; stdout: string; stderr: string }> {
94
+ return await new Promise((resolve, reject) => {
95
+ const child = spawn(process.execPath, ["--input-type=module", "--eval", source], {
96
+ stdio: ["ignore", "pipe", "pipe"],
97
+ });
98
+ let stdout = "";
99
+ let stderr = "";
100
+ child.stdout.on("data", (chunk: Buffer) => (stdout += chunk.toString()));
101
+ child.stderr.on("data", (chunk: Buffer) => (stderr += chunk.toString()));
102
+ child.on("error", reject);
103
+ child.on("close", (code) => {
104
+ resolve({ code, stdout, stderr });
105
+ });
106
+ });
107
+ }
108
+
109
+ /** A minimal transcript for the evaluator tests. */
110
+ export function transcriptWire(
111
+ events: Array<{ type: string; payload?: Record<string, unknown> }> = [],
112
+ ): Record<string, unknown> {
113
+ return {
114
+ schema_version: "2",
115
+ assignment_id: "assignment-1",
116
+ session_id: "session-1",
117
+ session_revision_id: "revision-1",
118
+ agent_id: "main",
119
+ environment: "dev",
120
+ started_at: "2026-01-01T00:00:00.000000Z",
121
+ ended_at: "2026-01-01T00:05:00.000000Z",
122
+ event_count: events.length,
123
+ events: events.map((event, index) => ({
124
+ id: `e${index}`,
125
+ ts: "2026-01-01T00:00:01.000000Z",
126
+ event_type: event.type,
127
+ payload: event.payload ?? {},
128
+ })),
129
+ };
130
+ }
@@ -0,0 +1,369 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ import { agent, session } from "../src/scopes.js";
4
+ import { setLogger } from "../src/logger.js";
5
+ import * as core from "../src/integrations/core.js";
6
+ import { parseVersion } from "../src/integrations/compat.js";
7
+ import { activeFrameworks, available, instrument, uninstrument } from "../src/integrations/index.js";
8
+ import { flushed, useSpool } from "./helpers.js";
9
+ import type { Spool } from "./helpers.js";
10
+
11
+ let spool: Spool;
12
+
13
+ beforeEach(() => {
14
+ spool = useSpool();
15
+ core.setStrict(false);
16
+ core.resetFailures();
17
+ });
18
+ afterEach(async () => {
19
+ uninstrument();
20
+ await spool.cleanup();
21
+ core.setStrict(null);
22
+ setLogger(null);
23
+ });
24
+
25
+ describe("failure policy", () => {
26
+ it("swallows a throwing hook and degrades the call site after repeated failures", () => {
27
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
28
+ const boom = (): never => {
29
+ throw new Error("hook is broken");
30
+ };
31
+ const wrapped = core.safe("test", boom);
32
+ for (let i = 0; i < 3; i += 1) expect(() => wrapped()).not.toThrow();
33
+ // A broken adapter costs one log line, not 40% of the process.
34
+ expect(core.isDegraded("test.boom")).toBe(true);
35
+ });
36
+
37
+ it("catches a REJECTED PROMISE, not just a synchronous throw", async () => {
38
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
39
+ // Half of every framework's callback surface is async. A bare try/catch
40
+ // sees nothing when the body rejects; the rejection lands as an unhandled
41
+ // rejection, which Node terminates the process for.
42
+ const wrapped = core.safe("test", async () => {
43
+ throw new Error("async hook is broken");
44
+ });
45
+ await expect(wrapped()).resolves.toBeUndefined();
46
+ });
47
+
48
+ it("re-throws under FAILPROOFAI_SDK_STRICT", () => {
49
+ core.setStrict(true);
50
+ const wrapped = core.safe("test", () => {
51
+ throw new Error("visible");
52
+ });
53
+ expect(() => wrapped()).toThrow("visible");
54
+ });
55
+ });
56
+
57
+ describe("wrapCallable", () => {
58
+ it("returns the original value and re-throws the original error, identity intact", async () => {
59
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
60
+ const failure = new Error("from the framework");
61
+ const throwing = core.wrapCallable(
62
+ () => {
63
+ throw failure;
64
+ },
65
+ {
66
+ before: () => {
67
+ throw new Error("before is broken");
68
+ },
69
+ after: () => {
70
+ throw new Error("after is broken");
71
+ },
72
+ onError: () => {
73
+ throw new Error("onError is broken");
74
+ },
75
+ },
76
+ );
77
+ // Every one of our hooks throws, and the caller still sees exactly theirs.
78
+ expect(() => throwing()).toThrow(failure);
79
+
80
+ const resolving = core.wrapCallable(async () => "value", {
81
+ after: () => {
82
+ throw new Error("after is broken");
83
+ },
84
+ });
85
+ await expect(resolving()).resolves.toBe("value");
86
+ });
87
+
88
+ it("settles our hooks on the PROMISE, not on the call", async () => {
89
+ const seen: string[] = [];
90
+ const wrapped = core.wrapCallable(async () => "v", {
91
+ after: () => seen.push("after"),
92
+ });
93
+ const pending = wrapped();
94
+ expect(seen).toEqual([]);
95
+ await pending;
96
+ expect(seen).toEqual(["after"]);
97
+ });
98
+ });
99
+
100
+ describe("Patcher", () => {
101
+ it("restores exactly what it replaced", () => {
102
+ const target = { method: (): string => "original" };
103
+ const original = target.method;
104
+ const patcher = new core.Patcher();
105
+ patcher.patch(target, "method", () => "patched");
106
+ expect(target.method()).toBe("patched");
107
+ patcher.restoreAll();
108
+ expect(target.method).toBe(original);
109
+ });
110
+
111
+ it("leaves a third party's patch alone rather than deleting it", () => {
112
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
113
+ const target = { method: (): string => "original" };
114
+ const patcher = new core.Patcher();
115
+ patcher.patch(target, "method", () => "ours");
116
+ const theirs = (): string => "theirs";
117
+ target.method = theirs;
118
+ patcher.restoreAll();
119
+ // Restoring here would delete their patch. Two instrumentation libraries
120
+ // un-patching each other is how both silently stop recording.
121
+ expect(target.method).toBe(theirs);
122
+ });
123
+
124
+ it("reports rather than pretends when a target refuses assignment", () => {
125
+ const frozen = Object.freeze({ method: (): string => "original" });
126
+ const patcher = new core.Patcher();
127
+ expect(patcher.patch(frozen, "method", () => "ours")).toBe(false);
128
+ expect(patcher.size).toBe(0);
129
+ });
130
+ });
131
+
132
+ describe("payload discipline", () => {
133
+ it("truncates a long string and says so", () => {
134
+ const out = core.payload({ fw_prompt: "x".repeat(20_000) });
135
+ expect((out.fw_prompt as string).length).toBeLessThanOrEqual(core.FIELD_LIMIT);
136
+ expect(out.fw_truncated).toBe(true);
137
+ });
138
+
139
+ it("keeps the SMALL fields when the budget runs out, not the first ones", () => {
140
+ // The adapters put the big payload before the metadata, so insertion order
141
+ // would drop `fw_run_id` — the field that says which run the payload
142
+ // belongs to — and keep the oversized blob.
143
+ const out = core.payload({
144
+ fw_inputs: "x".repeat(core.EVENT_BUDGET * 2),
145
+ fw_run_id: "run-1",
146
+ fw_node: "retrieve",
147
+ });
148
+ expect(out.fw_run_id).toBe("run-1");
149
+ expect(out.fw_node).toBe("retrieve");
150
+ expect(out.fw_truncated).toBe(true);
151
+ });
152
+
153
+ it("caps list and depth growth", () => {
154
+ const deep = core.truncate({ a: { b: { c: { d: { e: { f: { g: 1 } } } } } } });
155
+ expect(JSON.stringify(deep)).not.toContain('"g"');
156
+ const wide = core.truncate(Array.from({ length: 300 }, (_, i) => i)) as unknown[];
157
+ expect(wide.length).toBeLessThanOrEqual(101);
158
+ expect(String(wide.at(-1))).toContain("more items truncated");
159
+ });
160
+
161
+ it("renders a class instance as data rather than as a repr string", () => {
162
+ class Weather {
163
+ constructor(
164
+ readonly city: string,
165
+ readonly celsius: number,
166
+ ) {}
167
+ }
168
+ expect(core.truncate(new Weather("Faro", 21))).toEqual({ city: "Faro", celsius: 21 });
169
+ });
170
+
171
+ it("does not run a throwing getter into the caller's face", () => {
172
+ const hostile = {
173
+ get boom(): never {
174
+ throw new Error("lazy attribute");
175
+ },
176
+ };
177
+ expect(() => core.truncate(hostile)).not.toThrow();
178
+ });
179
+ });
180
+
181
+ describe("extras namespacing", () => {
182
+ it("prefixes fw_ and drops nullish values", () => {
183
+ expect(core.fwFields({ run_id: "r", node: "n", tags: null, missing: undefined })).toEqual({
184
+ fw_run_id: "r",
185
+ fw_node: "n",
186
+ });
187
+ });
188
+
189
+ it("leaves the deliberate top-level names alone", () => {
190
+ expect(core.fwFields({ duration_ms: 12, usage: { a: 1 }, request_id: "r" })).toEqual({
191
+ duration_ms: 12,
192
+ usage: { a: 1 },
193
+ request_id: "r",
194
+ });
195
+ });
196
+
197
+ it("refuses an extra that would overwrite a declared field", () => {
198
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
199
+ // The schema merges extras LAST, so this would silently change a promoted
200
+ // column and every test would still pass.
201
+ expect(core.guardExtras({ tool_name: "hijacked", fw_ok: 1 })).toEqual({ fw_ok: 1 });
202
+ core.setStrict(true);
203
+ expect(() => core.guardExtras({ outcome: "hijacked" })).toThrow(/would overwrite/);
204
+ });
205
+ });
206
+
207
+ describe("agent id normalization", () => {
208
+ it("replaces a bare id, which would poison a LowCardinality facet", () => {
209
+ expect(core.normalizeAgentId("3f9a1c2b-0000-4000-8000-000000000000")).toBe("main");
210
+ expect(core.normalizeAgentId("a".repeat(32))).toBe("main");
211
+ });
212
+
213
+ it("strips a per-run id from a readable prefix rather than discarding the name", () => {
214
+ expect(core.normalizeAgentId("agent-3f9a1c2b-0000-4000-8000-000000000000")).toBe("agent");
215
+ expect(core.normalizeAgentId("crew_" + "a".repeat(32))).toBe("crew");
216
+ });
217
+
218
+ it("leaves an ordinary name untouched, separators and all", () => {
219
+ expect(core.normalizeAgentId("node_a_b")).toBe("node_a_b");
220
+ expect(core.normalizeAgentId("agent-v2")).toBe("agent-v2");
221
+ expect(core.normalizeAgentId("step-3")).toBe("step-3");
222
+ });
223
+
224
+ it("bounds the length and falls back on nothing", () => {
225
+ expect(core.normalizeAgentId("x".repeat(200)).length).toBe(64);
226
+ expect(core.normalizeAgentId(null)).toBe("main");
227
+ expect(core.normalizeAgentId(" ")).toBe("main");
228
+ });
229
+ });
230
+
231
+ describe("RunTracker", () => {
232
+ it("emits against a framework's own run ids", async () => {
233
+ const tracker = new core.RunTracker("test");
234
+ tracker.startAgent("run-1", { agentId: "planner", sessionId: "s1", goal: "g" });
235
+ tracker.emit("toolUse", "tool-1", {
236
+ parentKey: "run-1",
237
+ toolName: "search",
238
+ toolCallId: "tool-1",
239
+ });
240
+ tracker.endAgent("run-1", { outcome: "success" });
241
+
242
+ const events = await flushed(spool);
243
+ expect(events.map((event) => event.type)).toEqual(["agent_start", "tool_use", "agent_end"]);
244
+ expect(events.every((event) => event.session_id === "s1")).toBe(true);
245
+ expect(events[1]!.agent_id).toBe("planner");
246
+ });
247
+
248
+ it("walks the parent chain more than one hop", async () => {
249
+ const tracker = new core.RunTracker("test");
250
+ tracker.startAgent("root", { agentId: "planner", sessionId: "s1" });
251
+ // An intermediate framework run is a link, not a span.
252
+ tracker.link("middle", "root");
253
+ tracker.emit("toolUse", "leaf", { parentKey: "middle", toolName: "t", toolCallId: "leaf" });
254
+ const toolUse = (await flushed(spool)).find((event) => event.type === "tool_use")!;
255
+ expect(toolUse.agent_id).toBe("planner");
256
+ });
257
+
258
+ it("joins a hand-written scope, producing ONE tree rather than two", async () => {
259
+ const tracker = new core.RunTracker("test");
260
+ await agent("planner", { sessionId: "s1" }, () => {
261
+ tracker.startAgent("run-1", { agentId: "retriever" });
262
+ });
263
+ const starts = (await flushed(spool)).filter((event) => event.type === "agent_start");
264
+ const nested = starts.find((event) => event.agent_id === "retriever")!;
265
+ expect(nested.session_id).toBe("s1");
266
+ expect(nested.parent_id).toBe("planner");
267
+ });
268
+
269
+ it("does NOT claim a parent inside a bare session, which would render as a forever-ongoing span", async () => {
270
+ const tracker = new core.RunTracker("test");
271
+ await session({ sessionId: "s1" }, () => {
272
+ tracker.startAgent("run-1", { agentId: "retriever" });
273
+ });
274
+ const start = (await flushed(spool)).find((event) => event.type === "agent_start")!;
275
+ expect(start.parent_id).toBeUndefined();
276
+ });
277
+
278
+ it("drops an unresolvable event with ONE warning rather than inventing a session", async () => {
279
+ const warn = vi.fn();
280
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn, error: vi.fn() });
281
+ const tracker = new core.RunTracker("test");
282
+ tracker.emit("toolUse", "orphan", { toolName: "t", toolCallId: "orphan" });
283
+ tracker.emit("toolUse", "orphan2", { toolName: "t", toolCallId: "orphan2" });
284
+ // A synthesized session id splits one run into many.
285
+ expect(await flushed(spool)).toEqual([]);
286
+ expect(warn).toHaveBeenCalledTimes(1);
287
+ });
288
+
289
+ it("closes what it opened, so a dead session does not render as ongoing forever", async () => {
290
+ const tracker = new core.RunTracker("test");
291
+ tracker.startAgent("a", { agentId: "one", sessionId: "s1" });
292
+ tracker.startAgent("b", { agentId: "two", sessionId: "s1" });
293
+ tracker.closeOpenAgents();
294
+ const ends = (await flushed(spool)).filter((event) => event.type === "agent_end");
295
+ expect(ends.map((event) => event.agent_id)).toEqual(["two", "one"]);
296
+ expect(ends.every((event) => event.outcome === "cancelled")).toBe(true);
297
+ });
298
+
299
+ it("evicts oldest-first rather than growing unboundedly", () => {
300
+ const tracker = new core.RunTracker("test", { maxOpen: 4 });
301
+ for (let i = 0; i < 20; i += 1) {
302
+ tracker.startAgent(`run-${i}`, { agentId: "a", sessionId: "s1" });
303
+ }
304
+ expect(tracker.openAgents().length).toBeLessThanOrEqual(4);
305
+ });
306
+
307
+ it("truncates the declared fields as well as the extras, under ONE truncation flag", async () => {
308
+ const tracker = new core.RunTracker("test", { fieldLimit: 64 });
309
+ tracker.startAgent("run-1", { agentId: "a", sessionId: "s1" });
310
+ tracker.emit("toolResult", "t1", {
311
+ parentKey: "run-1",
312
+ toolName: "search",
313
+ toolCallId: "t1",
314
+ output: "y".repeat(500),
315
+ });
316
+ const result = (await flushed(spool)).find((event) => event.type === "tool_result")!;
317
+ expect((result.output as string).length).toBeLessThanOrEqual(64 + "…[truncated]".length);
318
+ // `fw_truncated` has to mean "this event lost data" — `output` is cut on
319
+ // essentially every real tool loop, and it is the field an operator filters
320
+ // on to find where.
321
+ expect(result.fw_truncated).toBe(true);
322
+ });
323
+ });
324
+
325
+ describe("the registry", () => {
326
+ it("lists the frameworks it can instrument", () => {
327
+ expect(available()).toEqual(["ai", "langchain", "llamaindex", "mastra"]);
328
+ });
329
+
330
+ it("throws on an unknown name, listing the valid ones", async () => {
331
+ // A typo that silently records nothing is the worst outcome available.
332
+ await expect(instrument("langchian")).rejects.toThrow(/unknown framework/);
333
+ });
334
+
335
+ it("accepts the spellings people actually type", async () => {
336
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
337
+ // LangGraph is served by the LangChain adapter; neither is installed here,
338
+ // so the install fails and is skipped — which is itself the contract.
339
+ await expect(instrument("langgraph")).resolves.toEqual([]);
340
+ expect(activeFrameworks()).toEqual([]);
341
+ });
342
+
343
+ it("does not throw when a framework is absent — it logs and moves on", async () => {
344
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
345
+ await expect(instrument("mastra")).resolves.toEqual([]);
346
+ });
347
+
348
+ it("uninstrumenting an unknown name is a no-op, not a throw", () => {
349
+ setLogger({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() });
350
+ expect(uninstrument("nonsense")).toEqual([]);
351
+ });
352
+ });
353
+
354
+ describe("version parsing", () => {
355
+ it("reads the leading numeric components only", () => {
356
+ expect(parseVersion("1.5.2")).toEqual([1, 5, 2]);
357
+ expect(parseVersion("2.0.0-beta.1")).toEqual([2, 0, 0]);
358
+ expect(parseVersion("0.14.23+build")).toEqual([0, 14, 23]);
359
+ expect(parseVersion("next")).toEqual([]);
360
+ });
361
+ });
362
+
363
+ describe("duration rounding", () => {
364
+ it("returns a whole non-negative integer, because the server drops anything else", () => {
365
+ expect(core.ms(12.7)).toBe(13);
366
+ expect(core.ms(-5)).toBe(0);
367
+ expect(Number.isInteger(core.ms(0.4))).toBe(true);
368
+ });
369
+ });