failproofai 1.0.7-beta.0 → 1.0.7-beta.2

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 (320) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js.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 +7 -7
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  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 +15 -15
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  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 +15 -15
  34. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  35. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  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 +7 -7
  54. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  55. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
  58. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  59. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
  60. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
  61. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +1 -1
  63. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +2 -2
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1p28m0u._.js → [root-of-the-server]__0l44ual._.js} +2 -2
  66. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +2 -2
  68. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +2 -2
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +2 -2
  70. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +2 -2
  71. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +2 -2
  72. package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +1 -1
  73. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/ssr/{_0cf1olg._.js → _1mel6y1._.js} +2 -2
  76. package/.next/standalone/.next/server/chunks/ssr/{_135-c3y._.js → _1v-jvrv._.js} +1 -1
  77. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  78. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
  79. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +1 -1
  80. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  81. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +1 -1
  85. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +1 -1
  87. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  88. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  89. package/.next/standalone/.next/server/pages/404.html +1 -1
  90. package/.next/standalone/.next/server/pages/500.html +1 -1
  91. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/server-reference-manifest.json +22 -22
  93. package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +2 -0
  94. package/.next/standalone/.next/static/chunks/{0289oapk24zql.js → 0fqd7m_u81mi5.js} +1 -1
  95. package/.next/standalone/.next/static/chunks/{2tqszh84mp_2l.js → 129ag2bw93bdh.js} +1 -1
  96. package/.next/standalone/.next/static/chunks/{0pyy9m5cm8zku.js → 1qd741hzlmjbo.js} +1 -1
  97. package/.next/standalone/.next/static/chunks/{3vwnzfx9q80yl.js → 2_pltstd8-xgs.js} +1 -1
  98. package/.next/standalone/.next/static/chunks/{3vp7c3knkh8mr.js → 2c8j9l6j_b1ci.js} +1 -1
  99. package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +1 -0
  100. package/.next/standalone/.next/static/chunks/{3cdkxrukvlvul.js → 3brze37td_wnc.js} +1 -1
  101. package/.next/standalone/.next/static/chunks/{3dnd-_29uiaj3.js → 3otmypm6j_xfo.js} +2 -2
  102. package/.next/standalone/.next/static/chunks/{00i9thnpht4l1.js → 3ugmd_7dyn0id.js} +1 -1
  103. package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +69 -0
  104. package/.next/standalone/PROBE-FOLLOWUP.md +186 -0
  105. package/.next/standalone/app/actions/get-jev-config.ts +38 -23
  106. package/.next/standalone/app/actions/update-jev-config.ts +1 -1
  107. package/.next/standalone/app/settings/jev-panel.tsx +33 -29
  108. package/.next/standalone/package.json +10 -10
  109. package/.next/standalone/sdk/python/skill/SKILL.md +60 -14
  110. package/.next/standalone/sdk/python/skill/agents/openai.yaml +2 -1
  111. package/.next/standalone/sdk/python/skill/references/evaluator.md +255 -0
  112. package/.next/standalone/sdk/python/skill/references/events.md +17 -8
  113. package/.next/standalone/sdk/python/skill/references/frameworks.md +3 -0
  114. package/.next/standalone/sdk/python/skill/references/install.md +3 -0
  115. package/.next/standalone/sdk/python/skill/references/integration.md +6 -2
  116. package/.next/standalone/sdk/python/skill/references/typescript.md +568 -0
  117. package/.next/standalone/sdk/typescript/CHANGELOG.md +119 -0
  118. package/.next/standalone/sdk/typescript/LICENSE +42 -0
  119. package/.next/standalone/sdk/typescript/README.md +552 -0
  120. package/.next/standalone/sdk/typescript/eslint.config.mjs +59 -0
  121. package/.next/standalone/sdk/typescript/examples/research-agent.ts +197 -0
  122. package/.next/standalone/sdk/typescript/integration/ai.test.ts +920 -0
  123. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/agent.ts +337 -0
  124. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +281 -0
  125. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +13 -0
  126. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/surfaces.ts +605 -0
  127. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.json +12 -0
  128. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.surfaces.json +4 -0
  129. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/agent.ts +342 -0
  130. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +168 -0
  131. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +13 -0
  132. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/surfaces.ts +628 -0
  133. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.json +12 -0
  134. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.surfaces.json +4 -0
  135. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/agent.ts +346 -0
  136. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +156 -0
  137. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +13 -0
  138. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/surfaces.ts +651 -0
  139. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.json +12 -0
  140. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.surfaces.json +4 -0
  141. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/agent.ts +350 -0
  142. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +153 -0
  143. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +13 -0
  144. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/surfaces.ts +651 -0
  145. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.json +12 -0
  146. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.surfaces.json +4 -0
  147. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/agent.ts +623 -0
  148. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +463 -0
  149. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +15 -0
  150. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/tsconfig.json +12 -0
  151. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent-v1.ts +99 -0
  152. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent.ts +623 -0
  153. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +336 -0
  154. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +15 -0
  155. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/tsconfig.json +12 -0
  156. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/agent.ts +96 -0
  157. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +579 -0
  158. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +15 -0
  159. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/tsconfig.json +12 -0
  160. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.cjs +53 -0
  161. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.mjs +55 -0
  162. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/package.json +18 -0
  163. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/agent.ts +659 -0
  164. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +635 -0
  165. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +15 -0
  166. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/tsconfig.json +12 -0
  167. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/agent.ts +659 -0
  168. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +553 -0
  169. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +15 -0
  170. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/tsconfig.json +12 -0
  171. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/agent.ts +877 -0
  172. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/mcp-server.mjs +66 -0
  173. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +6417 -0
  174. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +15 -0
  175. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/tsconfig.json +12 -0
  176. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/agent.ts +872 -0
  177. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/mcp-server.mjs +66 -0
  178. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +2540 -0
  179. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +15 -0
  180. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/tsconfig.json +12 -0
  181. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/actions.ts +18 -0
  182. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/ai/route.ts +42 -0
  183. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/edge/route.ts +29 -0
  184. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/langgraph/route.ts +21 -0
  185. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/llamaindex/route.ts +11 -0
  186. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/mastra/route.ts +19 -0
  187. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/status/route.ts +7 -0
  188. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/layout.tsx +9 -0
  189. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/page.tsx +15 -0
  190. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/instrumentation.ts +15 -0
  191. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/ai.ts +61 -0
  192. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/langgraph.ts +68 -0
  193. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/llamaindex.ts +98 -0
  194. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/mastra.ts +90 -0
  195. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/next.config.ts +52 -0
  196. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +4343 -0
  197. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +28 -0
  198. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/agent.ts +51 -0
  199. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +76 -0
  200. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +484 -0
  201. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +15 -0
  202. package/.next/standalone/sdk/typescript/integration/fixtures/types/agent.ts +79 -0
  203. package/.next/standalone/sdk/typescript/integration/fixtures/types/package-lock.json +740 -0
  204. package/.next/standalone/sdk/typescript/integration/fixtures/types/package.json +11 -0
  205. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/agent.ts +197 -0
  206. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package-lock.json +70 -0
  207. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package.json +12 -0
  208. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/tsconfig.json +12 -0
  209. package/.next/standalone/sdk/typescript/integration/global-setup.ts +29 -0
  210. package/.next/standalone/sdk/typescript/integration/harness.ts +451 -0
  211. package/.next/standalone/sdk/typescript/integration/langchain.test.ts +682 -0
  212. package/.next/standalone/sdk/typescript/integration/llamaindex.test.ts +709 -0
  213. package/.next/standalone/sdk/typescript/integration/mastra-coverage.test.ts +386 -0
  214. package/.next/standalone/sdk/typescript/integration/mastra.test.ts +311 -0
  215. package/.next/standalone/sdk/typescript/integration/nextjs.test.ts +341 -0
  216. package/.next/standalone/sdk/typescript/integration/runtime-parity.ts +180 -0
  217. package/.next/standalone/sdk/typescript/integration/runtimes.bun.test.ts +15 -0
  218. package/.next/standalone/sdk/typescript/integration/runtimes.core.test.ts +113 -0
  219. package/.next/standalone/sdk/typescript/integration/runtimes.deno.test.ts +19 -0
  220. package/.next/standalone/sdk/typescript/integration/types.test.ts +141 -0
  221. package/.next/standalone/sdk/typescript/integration/vanilla.test.ts +255 -0
  222. package/.next/standalone/sdk/typescript/package-lock.json +2640 -0
  223. package/.next/standalone/sdk/typescript/package.json +401 -0
  224. package/.next/standalone/sdk/typescript/scripts/finalize-build.mjs +123 -0
  225. package/.next/standalone/sdk/typescript/scripts/release.mjs +177 -0
  226. package/.next/standalone/sdk/typescript/src/clock.ts +58 -0
  227. package/.next/standalone/sdk/typescript/src/context.ts +214 -0
  228. package/.next/standalone/sdk/typescript/src/edge/adapter.ts +18 -0
  229. package/.next/standalone/sdk/typescript/src/edge/ai.ts +116 -0
  230. package/.next/standalone/sdk/typescript/src/edge/index.ts +238 -0
  231. package/.next/standalone/sdk/typescript/src/edge/langchain.ts +18 -0
  232. package/.next/standalone/sdk/typescript/src/edge/llamaindex.ts +12 -0
  233. package/.next/standalone/sdk/typescript/src/edge/mastra.ts +17 -0
  234. package/.next/standalone/sdk/typescript/src/edge/notice.ts +33 -0
  235. package/.next/standalone/sdk/typescript/src/environment.ts +75 -0
  236. package/.next/standalone/sdk/typescript/src/evaluator/authoring.ts +480 -0
  237. package/.next/standalone/sdk/typescript/src/evaluator/cli.ts +96 -0
  238. package/.next/standalone/sdk/typescript/src/evaluator/client.ts +421 -0
  239. package/.next/standalone/sdk/typescript/src/evaluator/expression.ts +1292 -0
  240. package/.next/standalone/sdk/typescript/src/evaluator/index.ts +144 -0
  241. package/.next/standalone/sdk/typescript/src/evaluator/protocol.ts +747 -0
  242. package/.next/standalone/sdk/typescript/src/evaluator/runtime.ts +930 -0
  243. package/.next/standalone/sdk/typescript/src/evaluator/sandbox-worker.ts +171 -0
  244. package/.next/standalone/sdk/typescript/src/evaluator/source-limits.ts +27 -0
  245. package/.next/standalone/sdk/typescript/src/evaluator/source.ts +509 -0
  246. package/.next/standalone/sdk/typescript/src/events.ts +879 -0
  247. package/.next/standalone/sdk/typescript/src/exit.ts +117 -0
  248. package/.next/standalone/sdk/typescript/src/index.ts +186 -0
  249. package/.next/standalone/sdk/typescript/src/integrations/ai.ts +1566 -0
  250. package/.next/standalone/sdk/typescript/src/integrations/compat.ts +322 -0
  251. package/.next/standalone/sdk/typescript/src/integrations/core.ts +1321 -0
  252. package/.next/standalone/sdk/typescript/src/integrations/index.ts +355 -0
  253. package/.next/standalone/sdk/typescript/src/integrations/langchain.ts +2340 -0
  254. package/.next/standalone/sdk/typescript/src/integrations/llamaindex.ts +2111 -0
  255. package/.next/standalone/sdk/typescript/src/integrations/mastra.ts +1802 -0
  256. package/.next/standalone/sdk/typescript/src/logger.ts +98 -0
  257. package/.next/standalone/sdk/typescript/src/next.ts +115 -0
  258. package/.next/standalone/sdk/typescript/src/node-require.ts +446 -0
  259. package/.next/standalone/sdk/typescript/src/redact.ts +305 -0
  260. package/.next/standalone/sdk/typescript/src/resolver.ts +120 -0
  261. package/.next/standalone/sdk/typescript/src/runtime.ts +29 -0
  262. package/.next/standalone/sdk/typescript/src/schema.ts +410 -0
  263. package/.next/standalone/sdk/typescript/src/scopes.ts +701 -0
  264. package/.next/standalone/sdk/typescript/src/shared.ts +33 -0
  265. package/.next/standalone/sdk/typescript/src/version.ts +5 -0
  266. package/.next/standalone/sdk/typescript/src/writer.ts +934 -0
  267. package/.next/standalone/sdk/typescript/test/adapters.test.ts +397 -0
  268. package/.next/standalone/sdk/typescript/test/ai.test.ts +1076 -0
  269. package/.next/standalone/sdk/typescript/test/copies.test.ts +204 -0
  270. package/.next/standalone/sdk/typescript/test/edge.test.ts +183 -0
  271. package/.next/standalone/sdk/typescript/test/evaluator-client.test.ts +234 -0
  272. package/.next/standalone/sdk/typescript/test/evaluator-protocol.test.ts +225 -0
  273. package/.next/standalone/sdk/typescript/test/events.test.ts +193 -0
  274. package/.next/standalone/sdk/typescript/test/expression.test.ts +181 -0
  275. package/.next/standalone/sdk/typescript/test/global-setup.ts +26 -0
  276. package/.next/standalone/sdk/typescript/test/helpers.ts +130 -0
  277. package/.next/standalone/sdk/typescript/test/integrations.test.ts +369 -0
  278. package/.next/standalone/sdk/typescript/test/langchain-copies.test.ts +204 -0
  279. package/.next/standalone/sdk/typescript/test/langchain.test.ts +999 -0
  280. package/.next/standalone/sdk/typescript/test/llamaindex.test.ts +1760 -0
  281. package/.next/standalone/sdk/typescript/test/mastra-coverage.test.ts +501 -0
  282. package/.next/standalone/sdk/typescript/test/mastra-lifecycle.test.ts +479 -0
  283. package/.next/standalone/sdk/typescript/test/mastra.test.ts +285 -0
  284. package/.next/standalone/sdk/typescript/test/next.test.ts +109 -0
  285. package/.next/standalone/sdk/typescript/test/packaging.test.ts +312 -0
  286. package/.next/standalone/sdk/typescript/test/redaction.test.ts +171 -0
  287. package/.next/standalone/sdk/typescript/test/runtimes.test.ts +101 -0
  288. package/.next/standalone/sdk/typescript/test/sandbox.test.ts +189 -0
  289. package/.next/standalone/sdk/typescript/test/scopes.test.ts +271 -0
  290. package/.next/standalone/sdk/typescript/test/setup.ts +19 -0
  291. package/.next/standalone/sdk/typescript/test/skill-snippets.test.ts +73 -0
  292. package/.next/standalone/sdk/typescript/test/spool-contract.test.ts +124 -0
  293. package/.next/standalone/sdk/typescript/test/tracker-bounds.test.ts +191 -0
  294. package/.next/standalone/sdk/typescript/test/wire-format.test.ts +214 -0
  295. package/.next/standalone/sdk/typescript/test/writer.test.ts +407 -0
  296. package/.next/standalone/sdk/typescript/tsconfig.build.json +15 -0
  297. package/.next/standalone/sdk/typescript/tsconfig.cjs.json +19 -0
  298. package/.next/standalone/sdk/typescript/tsconfig.json +28 -0
  299. package/.next/standalone/sdk/typescript/vitest.config.ts +33 -0
  300. package/.next/standalone/sdk/typescript/vitest.integration.config.ts +23 -0
  301. package/.next/standalone/server.js +1 -1
  302. package/README.md +2 -2
  303. package/dist/cli.mjs +225 -30
  304. package/dist/worker.mjs +120 -14
  305. package/package.json +10 -10
  306. package/scripts/build-policy-pack.mjs +14 -0
  307. package/src/audit/features.ts +3 -2
  308. package/src/hooks/builtin-policies.ts +156 -5
  309. package/src/hooks/jev-cli.ts +57 -1
  310. package/src/hooks/manager.ts +1 -1
  311. package/src/hooks/pack-cli.ts +191 -24
  312. package/src/hooks/pack-store.ts +1 -1
  313. package/src/hooks/policy-catalog.ts +148 -9
  314. package/src/hooks/types.ts +1 -1
  315. package/.next/standalone/.next/static/chunks/15heikmy3yjzc.js +0 -1
  316. package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
  317. package/.next/standalone/.next/static/chunks/2plg9qae1yejv.js +0 -69
  318. /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_buildManifest.js +0 -0
  319. /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_clientMiddlewareManifest.js +0 -0
  320. /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_ssgManifest.js +0 -0
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Evaluator definition registry and typed author results.
3
+ *
4
+ * Every bound checked here is a bound the SERVER also checks, and rejects with
5
+ * a NON-RETRYABLE 422. Checking them at authoring time is what turns "a
6
+ * successful evaluation silently dead-lettered in production" into an error at
7
+ * the line that wrote it.
8
+ */
9
+
10
+ import { createHash } from "node:crypto";
11
+
12
+ import {
13
+ MAX_CATALOG_DEFINITIONS,
14
+ MAX_DESCRIPTION_BYTES,
15
+ MAX_DISPLAY_NAME_BYTES,
16
+ MAX_DISPLAY_VALUE_BYTES,
17
+ MAX_EVAL_KEY_BYTES,
18
+ MAX_LABEL_BYTES,
19
+ MAX_LABELS_PER_RESULT,
20
+ MAX_REASONING_BYTES,
21
+ MAX_RESULTS_PER_RUN,
22
+ MAX_SUMMARY_BYTES,
23
+ MAX_UNIT_BYTES,
24
+ MAX_VERSION_BYTES,
25
+ ResultKind,
26
+ catalogDefinitionToWire,
27
+ } from "./protocol.js";
28
+ import type { CatalogDefinition, ResultItem, SessionTranscript } from "./protocol.js";
29
+
30
+ const KEY_PATTERN = /^[a-z][a-z0-9_]*$/;
31
+
32
+ export type EvalFunction = (session: SessionTranscript) => EvalResult | Promise<EvalResult>;
33
+ export type ConditionFunction = (
34
+ session: SessionTranscript,
35
+ ) => boolean | ConditionResult | Promise<boolean | ConditionResult>;
36
+ export type CancellationFunction = (session: SessionTranscript) => unknown;
37
+
38
+ /**
39
+ * Compiles server-authored (sandboxed) source into something callable with a
40
+ * session. Signature mirrors `source.compileEvaluator`, which is the default.
41
+ *
42
+ * A host that serves managed definitions whose source is NOT a restricted
43
+ * expression — a declarative judge document, say — installs its own compiler
44
+ * here. The SDK stays agnostic: it never inspects the source, it just hands it
45
+ * to whoever compiles. Returning an async function is supported and is the
46
+ * right shape for a compiler whose work is IO-bound.
47
+ */
48
+ export type ManagedCompiler = (
49
+ source: string,
50
+ options: { timeoutSeconds?: number | null; evalKey?: string | null },
51
+ ) => EvalFunction;
52
+
53
+ function utf8Length(value: string): number {
54
+ return Buffer.byteLength(value, "utf8");
55
+ }
56
+
57
+ function bounded(value: unknown, fieldName: string, maximum: number): string {
58
+ if (typeof value !== "string") throw new TypeError(`${fieldName} must be a string`);
59
+ if (value === "") throw new Error(`${fieldName} must not be empty`);
60
+ const size = utf8Length(value);
61
+ if (size > maximum) throw new Error(`${fieldName} is ${size} bytes; maximum is ${maximum}`);
62
+ // Reject C0 control characters and DEL, matching the server's own check.
63
+ // Without this the SDK accepts a string — reasoning or a summary quoting
64
+ // transcript text that contains an ANSI escape or a NUL — that the server
65
+ // then rejects with a NON-RETRYABLE 422, so a successful evaluation is
66
+ // silently lost and its assignment dead-letters. TAB, LF and CR are kept
67
+ // because real multi-line reasoning uses them.
68
+ for (const char of value) {
69
+ const code = char.codePointAt(0)!;
70
+ if ((code < 0x20 && char !== "\t" && char !== "\n" && char !== "\r") || code === 0x7f) {
71
+ throw new Error(
72
+ `${fieldName} must not contain control characters (found U+${code
73
+ .toString(16)
74
+ .toUpperCase()
75
+ .padStart(4, "0")})`,
76
+ );
77
+ }
78
+ }
79
+ return value;
80
+ }
81
+
82
+ function finite(value: unknown, fieldName: string): number {
83
+ if (typeof value !== "number") throw new TypeError(`${fieldName} must be a number`);
84
+ if (!Number.isFinite(value)) throw new Error(`${fieldName} must be finite`);
85
+ return value;
86
+ }
87
+
88
+ function normalizeLabels(values: readonly string[]): string[] {
89
+ if (values.length > MAX_LABELS_PER_RESULT) {
90
+ throw new Error(`at most ${MAX_LABELS_PER_RESULT} labels are allowed`);
91
+ }
92
+ const normalized = values.map((label) => bounded(label, "label", MAX_LABEL_BYTES));
93
+ if (new Set(normalized).size !== normalized.length) throw new Error("labels must be unique");
94
+ return [...normalized].sort();
95
+ }
96
+
97
+ function validateResultText(
98
+ unit: string,
99
+ displayValue: string | undefined,
100
+ description: string | undefined,
101
+ ): void {
102
+ if (unit) bounded(unit, "unit", MAX_UNIT_BYTES);
103
+ if (displayValue !== undefined) bounded(displayValue, "display value", MAX_DISPLAY_VALUE_BYTES);
104
+ if (description !== undefined) bounded(description, "description", MAX_DESCRIPTION_BYTES);
105
+ }
106
+
107
+ export function validateKey(value: string, fieldName = "eval_key"): string {
108
+ bounded(value, fieldName, MAX_EVAL_KEY_BYTES);
109
+ if (!KEY_PATTERN.test(value)) throw new Error(`${fieldName} must match ${KEY_PATTERN.source}`);
110
+ return value;
111
+ }
112
+
113
+ export class Score {
114
+ readonly value: number;
115
+ readonly passed: boolean | undefined;
116
+ readonly unit: string;
117
+ readonly displayValue: string | undefined;
118
+ readonly description: string | undefined;
119
+
120
+ constructor(
121
+ value: number,
122
+ options: {
123
+ passed?: boolean;
124
+ unit?: string;
125
+ displayValue?: string;
126
+ description?: string;
127
+ } = {},
128
+ ) {
129
+ const numeric = finite(value, "score value");
130
+ if (numeric < 0 || numeric > 1) throw new Error("score value must be between 0 and 1");
131
+ if (options.passed !== undefined && typeof options.passed !== "boolean") {
132
+ throw new TypeError("score passed must be a boolean or undefined");
133
+ }
134
+ this.value = numeric;
135
+ this.passed = options.passed;
136
+ this.unit = options.unit ?? "ratio";
137
+ this.displayValue = options.displayValue;
138
+ this.description = options.description;
139
+ validateResultText(this.unit, this.displayValue, this.description);
140
+ Object.freeze(this);
141
+ }
142
+ }
143
+
144
+ export class Metric {
145
+ readonly value: number;
146
+ readonly unit: string;
147
+ readonly displayValue: string | undefined;
148
+ readonly description: string | undefined;
149
+
150
+ constructor(
151
+ value: number,
152
+ options: { unit?: string; displayValue?: string; description?: string } = {},
153
+ ) {
154
+ this.value = finite(value, "metric value");
155
+ this.unit = options.unit ?? "";
156
+ this.displayValue = options.displayValue;
157
+ this.description = options.description;
158
+ validateResultText(this.unit, this.displayValue, this.description);
159
+ Object.freeze(this);
160
+ }
161
+ }
162
+
163
+ export class Assertion {
164
+ readonly passed: boolean;
165
+ readonly description: string | undefined;
166
+
167
+ constructor(passed: boolean, options: { description?: string } = {}) {
168
+ if (typeof passed !== "boolean") throw new TypeError("assertion passed must be a boolean");
169
+ this.passed = passed;
170
+ this.description = options.description;
171
+ if (this.description !== undefined) {
172
+ bounded(this.description, "description", MAX_DESCRIPTION_BYTES);
173
+ }
174
+ Object.freeze(this);
175
+ }
176
+ }
177
+
178
+ export class ConditionResult {
179
+ readonly applicable: boolean;
180
+ readonly reasonCode: string;
181
+
182
+ constructor(applicable: boolean, reasonCode = "condition_false") {
183
+ if (typeof applicable !== "boolean") {
184
+ throw new TypeError("condition applicable must be a boolean");
185
+ }
186
+ this.applicable = applicable;
187
+ this.reasonCode = reasonCode;
188
+ validateKey(reasonCode, "condition reason code");
189
+ Object.freeze(this);
190
+ }
191
+ }
192
+
193
+ export interface EvalResultOptions {
194
+ score?: Score;
195
+ metrics?: Record<string, Metric | number>;
196
+ assertions?: Record<string, Assertion | boolean>;
197
+ reasoning?: string;
198
+ summary?: string;
199
+ labels?: readonly string[];
200
+ }
201
+
202
+ export class EvalResult {
203
+ readonly score: Score | undefined;
204
+ readonly metrics: Readonly<Record<string, Metric | number>>;
205
+ readonly assertions: Readonly<Record<string, Assertion | boolean>>;
206
+ readonly reasoning: string | undefined;
207
+ readonly summary: string | undefined;
208
+ readonly labels: readonly string[];
209
+
210
+ constructor(options: EvalResultOptions = {}) {
211
+ this.score = options.score;
212
+ this.metrics = options.metrics ?? {};
213
+ this.assertions = options.assertions ?? {};
214
+ this.reasoning = options.reasoning;
215
+ this.summary = options.summary;
216
+ if (this.reasoning !== undefined) bounded(this.reasoning, "reasoning", MAX_REASONING_BYTES);
217
+ if (this.summary !== undefined) bounded(this.summary, "summary", MAX_SUMMARY_BYTES);
218
+ this.labels = normalizeLabels(options.labels ?? []);
219
+ Object.freeze(this);
220
+ }
221
+
222
+ resultItems(evalKey: string): ResultItem[] {
223
+ const items: ResultItem[] = [];
224
+ if (this.score !== undefined) {
225
+ items.push({
226
+ resultKey: evalKey,
227
+ resultKind: ResultKind.SCORE,
228
+ numericValue: this.score.value,
229
+ boolValue: this.score.passed ?? null,
230
+ unit: this.score.unit,
231
+ displayValue: this.score.displayValue ?? null,
232
+ description: this.score.description ?? null,
233
+ reasoning: this.reasoning ?? null,
234
+ labels: this.labels,
235
+ });
236
+ }
237
+ for (const key of Object.keys(this.metrics).sort()) {
238
+ validateKey(key, "metric key");
239
+ const raw = this.metrics[key]!;
240
+ const metric = raw instanceof Metric ? raw : new Metric(raw);
241
+ items.push({
242
+ resultKey: key,
243
+ resultKind: ResultKind.METRIC,
244
+ numericValue: metric.value,
245
+ unit: metric.unit,
246
+ displayValue: metric.displayValue ?? null,
247
+ description: metric.description ?? null,
248
+ // A metric-kind eval's primary result IS the metric whose key equals
249
+ // `evalKey`; attach the eval's reasoning there so it is not silently
250
+ // dropped for non-score evals.
251
+ reasoning: key === evalKey ? (this.reasoning ?? null) : null,
252
+ labels: this.labels,
253
+ });
254
+ }
255
+ for (const key of Object.keys(this.assertions).sort()) {
256
+ validateKey(key, "assertion key");
257
+ const raw = this.assertions[key]!;
258
+ const assertion = raw instanceof Assertion ? raw : new Assertion(raw);
259
+ items.push({
260
+ resultKey: key,
261
+ resultKind: ResultKind.ASSERTION,
262
+ boolValue: assertion.passed,
263
+ description: assertion.description ?? null,
264
+ reasoning: key === evalKey ? (this.reasoning ?? null) : null,
265
+ labels: this.labels,
266
+ });
267
+ }
268
+ if (items.length === 0) {
269
+ throw new Error("an EvalResult must contain a score, metric, or assertion");
270
+ }
271
+ if (items.length > MAX_RESULTS_PER_RUN) {
272
+ throw new Error(`an EvalResult may contain at most ${MAX_RESULTS_PER_RUN} results`);
273
+ }
274
+ const keys = items.map((item) => item.resultKey);
275
+ if (new Set(keys).size !== keys.length) {
276
+ throw new Error("result keys must be unique within one evaluation run");
277
+ }
278
+ return items;
279
+ }
280
+ }
281
+
282
+ export interface EvalDefinition {
283
+ evalKey: string;
284
+ displayName: string;
285
+ evalVersion: string;
286
+ resultKind: ResultKind;
287
+ labels: readonly string[];
288
+ function: EvalFunction;
289
+ condition: ConditionFunction | null;
290
+ onCancel: CancellationFunction | null;
291
+ timeoutSeconds: number | null;
292
+ }
293
+
294
+ export function catalogDefinitionOf(definition: EvalDefinition): CatalogDefinition {
295
+ return {
296
+ evalKey: definition.evalKey,
297
+ displayName: definition.displayName,
298
+ evalVersion: definition.evalVersion,
299
+ resultKind: definition.resultKind,
300
+ labels: definition.labels,
301
+ };
302
+ }
303
+
304
+ /** Deterministic JSON with sorted keys and no spaces, for the catalog hash. */
305
+ function canonicalJson(value: unknown): string {
306
+ if (value === null || typeof value !== "object") return JSON.stringify(value) ?? "null";
307
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
308
+ const entries = Object.entries(value as Record<string, unknown>)
309
+ .filter(([, item]) => item !== undefined)
310
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
311
+ return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`).join(",")}}`;
312
+ }
313
+
314
+ export interface EvalOptions {
315
+ version: string;
316
+ displayName?: string;
317
+ resultKind?: ResultKind;
318
+ labels?: readonly string[];
319
+ when?: ConditionFunction;
320
+ onCancel?: CancellationFunction;
321
+ timeoutSeconds?: number;
322
+ }
323
+
324
+ /**
325
+ * Marks an `Evaluator` across the package's two builds.
326
+ *
327
+ * `failproofai-evaluator` is the ESM build, and a CommonJS evals file (plain
328
+ * `tsc` output, `require`) constructs its `Evaluator` from `dist/cjs` — a
329
+ * second, unrelated copy of the class. `instanceof` is false across the two, so
330
+ * the loader refused the commonest setup there is with "resolved to Evaluator,
331
+ * not an Evaluator". `Symbol.for` is one registry per process, so both copies
332
+ * stamp and read the same key.
333
+ */
334
+ const EVALUATOR_BRAND = Symbol.for("@failproofai/sdk/evaluator.Evaluator");
335
+
336
+ /**
337
+ * True for an `Evaluator` from either build of this package.
338
+ *
339
+ * Safe to hand the result to `runFromEnv()`: that method belongs to the copy
340
+ * that built the object, and runs the runtime from that same copy, so the
341
+ * result classes it checks are the ones the evaluations construct.
342
+ *
343
+ * @internal
344
+ */
345
+ export function isEvaluator(value: unknown): value is Evaluator {
346
+ return (
347
+ typeof value === "object" &&
348
+ value !== null &&
349
+ (value as Record<symbol, unknown>)[EVALUATOR_BRAND] === true &&
350
+ typeof (value as { runFromEnv?: unknown }).runFromEnv === "function"
351
+ );
352
+ }
353
+
354
+ /** A process-local collection of explicitly versioned evaluations. */
355
+ export class Evaluator {
356
+ declare readonly [EVALUATOR_BRAND]: true;
357
+ readonly name: string;
358
+ readonly version: string;
359
+ readonly managedCompiler: ManagedCompiler | null;
360
+ private readonly registry = new Map<string, EvalDefinition>();
361
+
362
+ constructor(options: { name: string; version: string; managedCompiler?: ManagedCompiler }) {
363
+ Object.defineProperty(this, EVALUATOR_BRAND, { value: true });
364
+ this.name = bounded(options.name, "name", MAX_DISPLAY_NAME_BYTES);
365
+ this.version = bounded(options.version, "version", MAX_VERSION_BYTES);
366
+ // Omitted keeps the default: server-authored source is compiled and
367
+ // sandboxed by `source.compileEvaluator`. Customer workers never set this —
368
+ // their definitions are LOCAL and never carry source at all.
369
+ if (options.managedCompiler !== undefined && typeof options.managedCompiler !== "function") {
370
+ throw new TypeError("managedCompiler must be a function");
371
+ }
372
+ this.managedCompiler = options.managedCompiler ?? null;
373
+ }
374
+
375
+ /**
376
+ * Register one evaluation.
377
+ *
378
+ * evaluator.eval("tool_success_rate", { version: "1" }, (session) =>
379
+ * new EvalResult({ score: new Score(ratio) }),
380
+ * );
381
+ */
382
+ eval(evalKey: string, options: EvalOptions, fn: EvalFunction): EvalFunction {
383
+ const key = validateKey(evalKey);
384
+ const evalVersion = bounded(options.version, "eval version", MAX_VERSION_BYTES);
385
+ const display = bounded(
386
+ options.displayName ?? defaultDisplayName(evalKey),
387
+ "display name",
388
+ MAX_DISPLAY_NAME_BYTES,
389
+ );
390
+ const kind = options.resultKind ?? ResultKind.SCORE;
391
+ if (!Object.values(ResultKind).includes(kind)) {
392
+ throw new Error(`resultKind must be one of ${Object.values(ResultKind).join(", ")}`);
393
+ }
394
+ const labels = normalizeLabels(options.labels ?? []);
395
+ let timeoutSeconds: number | null = null;
396
+ if (options.timeoutSeconds !== undefined) {
397
+ timeoutSeconds = finite(options.timeoutSeconds, "timeoutSeconds");
398
+ if (timeoutSeconds <= 0) throw new Error("timeoutSeconds must be greater than zero");
399
+ }
400
+
401
+ if (this.registry.has(key)) throw new Error(`duplicate eval key: ${key}`);
402
+ if (this.registry.size >= MAX_CATALOG_DEFINITIONS) {
403
+ throw new Error(
404
+ `an evaluator may define at most ${MAX_CATALOG_DEFINITIONS} evaluations`,
405
+ );
406
+ }
407
+ if (typeof fn !== "function") throw new TypeError("evaluation must be a function");
408
+ if (options.when !== undefined && typeof options.when !== "function") {
409
+ throw new TypeError("when must be a function");
410
+ }
411
+ if (options.onCancel !== undefined && typeof options.onCancel !== "function") {
412
+ throw new TypeError("onCancel must be a function");
413
+ }
414
+
415
+ this.registry.set(key, {
416
+ evalKey: key,
417
+ displayName: display,
418
+ evalVersion,
419
+ resultKind: kind,
420
+ labels,
421
+ function: fn,
422
+ condition: options.when ?? null,
423
+ onCancel: options.onCancel ?? null,
424
+ timeoutSeconds,
425
+ });
426
+ return fn;
427
+ }
428
+
429
+ get definitions(): readonly EvalDefinition[] {
430
+ return [...this.registry.keys()].sort().map((key) => this.registry.get(key)!);
431
+ }
432
+
433
+ catalog(): CatalogDefinition[] {
434
+ return this.definitions.map(catalogDefinitionOf);
435
+ }
436
+
437
+ get catalogRevision(): string {
438
+ const payload = this.catalog().map(catalogDefinitionToWire);
439
+ const canonical = Buffer.from(canonicalJson(payload), "utf8");
440
+ return `sha256:${createHash("sha256").update(canonical).digest("hex")}`;
441
+ }
442
+
443
+ definition(evalKey: string): EvalDefinition {
444
+ const found = this.registry.get(evalKey);
445
+ if (found === undefined) throw new Error(`unknown eval key: ${evalKey}`);
446
+ return found;
447
+ }
448
+
449
+ /** Run this evaluator until the process receives a stop request. */
450
+ async runFromEnv(): Promise<void> {
451
+ const { WorkerRuntime, workerConfigFromEnv } = await import("./runtime.js");
452
+ const runtime = new WorkerRuntime(this, workerConfigFromEnv());
453
+ const stop = (): void => {
454
+ runtime.stop();
455
+ };
456
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
457
+ process.once(signal, stop);
458
+ }
459
+ try {
460
+ await runtime.runForever();
461
+ } finally {
462
+ for (const signal of ["SIGINT", "SIGTERM"] as const) {
463
+ process.removeListener(signal, stop);
464
+ }
465
+ }
466
+ }
467
+
468
+ /** Call an evaluation or condition, awaiting it when it returns a promise. */
469
+ static async call(
470
+ fn: EvalFunction | ConditionFunction,
471
+ session: SessionTranscript,
472
+ ): Promise<unknown> {
473
+ return await (fn as (s: SessionTranscript) => unknown)(session);
474
+ }
475
+ }
476
+
477
+ function defaultDisplayName(evalKey: string): string {
478
+ const spaced = evalKey.replaceAll("_", " ");
479
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
480
+ }
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Run an evaluator declared as `module#export`.
4
+ *
5
+ * npx failproofai-evaluator ./my-evals.js
6
+ * npx failproofai-evaluator ./my-evals.js#app
7
+ * FAILPROOFAI_EVALUATOR_MODULE=./my-evals.js npx failproofai-evaluator
8
+ *
9
+ * `#` rather than `:` as the separator, because a module specifier on Windows
10
+ * routinely contains a colon (`C:\evals\index.js`) and a `file:` URL always
11
+ * does. Splitting on `:` would take `C` as the module.
12
+ */
13
+
14
+ import { pathToFileURL } from "node:url";
15
+ import { isAbsolute, resolve } from "node:path";
16
+
17
+ import { importModule } from "../node-require.js";
18
+ import { isEvaluator, type Evaluator } from "./authoring.js";
19
+
20
+ export async function loadEvaluator(spec: string): Promise<Evaluator> {
21
+ const separator = spec.lastIndexOf("#");
22
+ const moduleName = separator === -1 ? spec : spec.slice(0, separator);
23
+ const exportName = separator === -1 ? "app" : spec.slice(separator + 1);
24
+ if (!moduleName) throw new Error("evaluator module must not be empty");
25
+ if (!exportName) throw new Error("evaluator export must not be empty");
26
+
27
+ // A relative specifier is relative to the USER'S working directory, not to
28
+ // this file inside `node_modules`. Bare specifiers (`my-evals`) are left
29
+ // alone so a package can be named.
30
+ const target =
31
+ moduleName.startsWith(".") || isAbsolute(moduleName)
32
+ ? pathToFileURL(resolve(process.cwd(), moduleName)).href
33
+ : moduleName;
34
+
35
+ const module = (await importModule(target)) as Record<string, unknown>;
36
+ const candidate = module[exportName] ?? (module.default as Record<string, unknown> | undefined)?.[exportName];
37
+ if (candidate === undefined) {
38
+ throw new Error(`${JSON.stringify(spec)} does not export ${JSON.stringify(exportName)}`);
39
+ }
40
+ if (!isEvaluator(candidate)) {
41
+ throw new TypeError(
42
+ `${JSON.stringify(spec)} resolved to ${
43
+ (candidate as object)?.constructor?.name ?? typeof candidate
44
+ }, not an Evaluator`,
45
+ );
46
+ }
47
+ return candidate;
48
+ }
49
+
50
+ export async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {
51
+ const args = argv.filter((arg) => arg !== "--");
52
+ if (args.includes("--help") || args.includes("-h")) {
53
+ process.stdout.write(
54
+ "Usage: failproofai-evaluator [module[#export]]\n\n" +
55
+ " module Path or package to import (default: $FAILPROOFAI_EVALUATOR_MODULE)\n" +
56
+ " export Named export holding the Evaluator (default: app)\n\n" +
57
+ "Environment:\n" +
58
+ " FAILPROOFAI_EVALUATOR_URL required — the API origin\n" +
59
+ " FAILPROOFAI_EVALUATOR_TOKEN required — the worker credential\n" +
60
+ " FAILPROOFAI_EVALUATOR_WORKER_ID, _CONCURRENCY, _REQUEST_TIMEOUT_SECONDS,\n" +
61
+ " _DRAIN_TIMEOUT_SECONDS, _ALLOW_INSECURE_HTTP\n",
62
+ );
63
+ return 0;
64
+ }
65
+
66
+ const spec = args[0] ?? process.env.FAILPROOFAI_EVALUATOR_MODULE;
67
+ if (!spec) {
68
+ process.stderr.write(
69
+ "failproofai-evaluator: a module is required (or set FAILPROOFAI_EVALUATOR_MODULE)\n",
70
+ );
71
+ return 2;
72
+ }
73
+
74
+ const evaluator = await loadEvaluator(spec);
75
+ await evaluator.runFromEnv();
76
+ return 0;
77
+ }
78
+
79
+ // `process.argv[1]` is the script Node was started with. Comparing it to this
80
+ // module's own resolved path is the module-system-agnostic way to ask "was I
81
+ // run, or imported" — `import.meta.main` does not exist and `require.main`
82
+ // only answers for CommonJS.
83
+ const invokedPath = process.argv[1];
84
+ if (invokedPath !== undefined && /failproofai-evaluator|evaluator[\\/]cli/.test(invokedPath)) {
85
+ main().then(
86
+ (code) => {
87
+ process.exitCode = code;
88
+ },
89
+ (error: unknown) => {
90
+ process.stderr.write(
91
+ `failproofai-evaluator: ${error instanceof Error ? error.message : String(error)}\n`,
92
+ );
93
+ process.exitCode = 1;
94
+ },
95
+ );
96
+ }