failproofai 1.0.7-beta.1 → 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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +7 -7
- package/.next/standalone/.next/server/app/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0yxwl6j._.js → [root-of-the-server]__0l44ual._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_214wgrp._.js → _1mel6y1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0bn2oo8._.js → _1v-jvrv._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +22 -22
- package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +2 -0
- package/.next/standalone/.next/static/chunks/0fqd7m_u81mi5.js +1 -0
- package/.next/standalone/.next/static/chunks/129ag2bw93bdh.js +1 -0
- package/.next/standalone/.next/static/chunks/{29fql3nbnfc9q.js → 1qd741hzlmjbo.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0vmd180qfntfb.js → 2_pltstd8-xgs.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1u5zsejmgrir_.js → 2c8j9l6j_b1ci.js} +1 -1
- package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +1 -0
- package/.next/standalone/.next/static/chunks/{258668t68du6b.js → 3brze37td_wnc.js} +1 -1
- package/.next/standalone/.next/static/chunks/3otmypm6j_xfo.js +6 -0
- package/.next/standalone/.next/static/chunks/{12tvm75t5ffui.js → 3ugmd_7dyn0id.js} +1 -1
- package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +69 -0
- package/.next/standalone/PROBE-FOLLOWUP.md +186 -0
- package/.next/standalone/app/actions/get-jev-config.ts +38 -23
- package/.next/standalone/app/actions/update-jev-config.ts +1 -1
- package/.next/standalone/app/settings/jev-panel.tsx +33 -29
- package/.next/standalone/package.json +10 -10
- package/.next/standalone/sdk/python/skill/SKILL.md +60 -14
- package/.next/standalone/sdk/python/skill/agents/openai.yaml +2 -1
- package/.next/standalone/sdk/python/skill/references/evaluator.md +255 -0
- package/.next/standalone/sdk/python/skill/references/events.md +17 -8
- package/.next/standalone/sdk/python/skill/references/frameworks.md +3 -0
- package/.next/standalone/sdk/python/skill/references/install.md +3 -0
- package/.next/standalone/sdk/python/skill/references/integration.md +6 -2
- package/.next/standalone/sdk/python/skill/references/typescript.md +568 -0
- package/.next/standalone/sdk/typescript/CHANGELOG.md +119 -0
- package/.next/standalone/sdk/typescript/LICENSE +42 -0
- package/.next/standalone/sdk/typescript/README.md +552 -0
- package/.next/standalone/sdk/typescript/eslint.config.mjs +59 -0
- package/.next/standalone/sdk/typescript/examples/research-agent.ts +197 -0
- package/.next/standalone/sdk/typescript/integration/ai.test.ts +920 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/agent.ts +337 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +281 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/surfaces.ts +605 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/agent.ts +342 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +168 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/surfaces.ts +628 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/agent.ts +346 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +156 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/surfaces.ts +651 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/agent.ts +350 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +153 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/surfaces.ts +651 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/agent.ts +623 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +463 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent-v1.ts +99 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent.ts +623 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +336 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/agent.ts +96 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +579 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.cjs +53 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.mjs +55 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/package.json +18 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/agent.ts +659 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +635 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/agent.ts +659 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +553 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/agent.ts +877 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/mcp-server.mjs +66 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +6417 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/agent.ts +872 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/mcp-server.mjs +66 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +2540 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/actions.ts +18 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/ai/route.ts +42 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/edge/route.ts +29 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/langgraph/route.ts +21 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/llamaindex/route.ts +11 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/mastra/route.ts +19 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/status/route.ts +7 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/layout.tsx +9 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/page.tsx +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/instrumentation.ts +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/ai.ts +61 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/langgraph.ts +68 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/llamaindex.ts +98 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/mastra.ts +90 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/next.config.ts +52 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +4343 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +28 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/agent.ts +51 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +76 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +484 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/types/agent.ts +79 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/types/package-lock.json +740 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/types/package.json +11 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/agent.ts +197 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package-lock.json +70 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/global-setup.ts +29 -0
- package/.next/standalone/sdk/typescript/integration/harness.ts +451 -0
- package/.next/standalone/sdk/typescript/integration/langchain.test.ts +682 -0
- package/.next/standalone/sdk/typescript/integration/llamaindex.test.ts +709 -0
- package/.next/standalone/sdk/typescript/integration/mastra-coverage.test.ts +386 -0
- package/.next/standalone/sdk/typescript/integration/mastra.test.ts +311 -0
- package/.next/standalone/sdk/typescript/integration/nextjs.test.ts +341 -0
- package/.next/standalone/sdk/typescript/integration/runtime-parity.ts +180 -0
- package/.next/standalone/sdk/typescript/integration/runtimes.bun.test.ts +15 -0
- package/.next/standalone/sdk/typescript/integration/runtimes.core.test.ts +113 -0
- package/.next/standalone/sdk/typescript/integration/runtimes.deno.test.ts +19 -0
- package/.next/standalone/sdk/typescript/integration/types.test.ts +141 -0
- package/.next/standalone/sdk/typescript/integration/vanilla.test.ts +255 -0
- package/.next/standalone/sdk/typescript/package-lock.json +2640 -0
- package/.next/standalone/sdk/typescript/package.json +401 -0
- package/.next/standalone/sdk/typescript/scripts/finalize-build.mjs +123 -0
- package/.next/standalone/sdk/typescript/scripts/release.mjs +177 -0
- package/.next/standalone/sdk/typescript/src/clock.ts +58 -0
- package/.next/standalone/sdk/typescript/src/context.ts +214 -0
- package/.next/standalone/sdk/typescript/src/edge/adapter.ts +18 -0
- package/.next/standalone/sdk/typescript/src/edge/ai.ts +116 -0
- package/.next/standalone/sdk/typescript/src/edge/index.ts +238 -0
- package/.next/standalone/sdk/typescript/src/edge/langchain.ts +18 -0
- package/.next/standalone/sdk/typescript/src/edge/llamaindex.ts +12 -0
- package/.next/standalone/sdk/typescript/src/edge/mastra.ts +17 -0
- package/.next/standalone/sdk/typescript/src/edge/notice.ts +33 -0
- package/.next/standalone/sdk/typescript/src/environment.ts +75 -0
- package/.next/standalone/sdk/typescript/src/evaluator/authoring.ts +480 -0
- package/.next/standalone/sdk/typescript/src/evaluator/cli.ts +96 -0
- package/.next/standalone/sdk/typescript/src/evaluator/client.ts +421 -0
- package/.next/standalone/sdk/typescript/src/evaluator/expression.ts +1292 -0
- package/.next/standalone/sdk/typescript/src/evaluator/index.ts +144 -0
- package/.next/standalone/sdk/typescript/src/evaluator/protocol.ts +747 -0
- package/.next/standalone/sdk/typescript/src/evaluator/runtime.ts +930 -0
- package/.next/standalone/sdk/typescript/src/evaluator/sandbox-worker.ts +171 -0
- package/.next/standalone/sdk/typescript/src/evaluator/source-limits.ts +27 -0
- package/.next/standalone/sdk/typescript/src/evaluator/source.ts +509 -0
- package/.next/standalone/sdk/typescript/src/events.ts +879 -0
- package/.next/standalone/sdk/typescript/src/exit.ts +117 -0
- package/.next/standalone/sdk/typescript/src/index.ts +186 -0
- package/.next/standalone/sdk/typescript/src/integrations/ai.ts +1566 -0
- package/.next/standalone/sdk/typescript/src/integrations/compat.ts +322 -0
- package/.next/standalone/sdk/typescript/src/integrations/core.ts +1321 -0
- package/.next/standalone/sdk/typescript/src/integrations/index.ts +355 -0
- package/.next/standalone/sdk/typescript/src/integrations/langchain.ts +2340 -0
- package/.next/standalone/sdk/typescript/src/integrations/llamaindex.ts +2111 -0
- package/.next/standalone/sdk/typescript/src/integrations/mastra.ts +1802 -0
- package/.next/standalone/sdk/typescript/src/logger.ts +98 -0
- package/.next/standalone/sdk/typescript/src/next.ts +115 -0
- package/.next/standalone/sdk/typescript/src/node-require.ts +446 -0
- package/.next/standalone/sdk/typescript/src/redact.ts +305 -0
- package/.next/standalone/sdk/typescript/src/resolver.ts +120 -0
- package/.next/standalone/sdk/typescript/src/runtime.ts +29 -0
- package/.next/standalone/sdk/typescript/src/schema.ts +410 -0
- package/.next/standalone/sdk/typescript/src/scopes.ts +701 -0
- package/.next/standalone/sdk/typescript/src/shared.ts +33 -0
- package/.next/standalone/sdk/typescript/src/version.ts +5 -0
- package/.next/standalone/sdk/typescript/src/writer.ts +934 -0
- package/.next/standalone/sdk/typescript/test/adapters.test.ts +397 -0
- package/.next/standalone/sdk/typescript/test/ai.test.ts +1076 -0
- package/.next/standalone/sdk/typescript/test/copies.test.ts +204 -0
- package/.next/standalone/sdk/typescript/test/edge.test.ts +183 -0
- package/.next/standalone/sdk/typescript/test/evaluator-client.test.ts +234 -0
- package/.next/standalone/sdk/typescript/test/evaluator-protocol.test.ts +225 -0
- package/.next/standalone/sdk/typescript/test/events.test.ts +193 -0
- package/.next/standalone/sdk/typescript/test/expression.test.ts +181 -0
- package/.next/standalone/sdk/typescript/test/global-setup.ts +26 -0
- package/.next/standalone/sdk/typescript/test/helpers.ts +130 -0
- package/.next/standalone/sdk/typescript/test/integrations.test.ts +369 -0
- package/.next/standalone/sdk/typescript/test/langchain-copies.test.ts +204 -0
- package/.next/standalone/sdk/typescript/test/langchain.test.ts +999 -0
- package/.next/standalone/sdk/typescript/test/llamaindex.test.ts +1760 -0
- package/.next/standalone/sdk/typescript/test/mastra-coverage.test.ts +501 -0
- package/.next/standalone/sdk/typescript/test/mastra-lifecycle.test.ts +479 -0
- package/.next/standalone/sdk/typescript/test/mastra.test.ts +285 -0
- package/.next/standalone/sdk/typescript/test/next.test.ts +109 -0
- package/.next/standalone/sdk/typescript/test/packaging.test.ts +312 -0
- package/.next/standalone/sdk/typescript/test/redaction.test.ts +171 -0
- package/.next/standalone/sdk/typescript/test/runtimes.test.ts +101 -0
- package/.next/standalone/sdk/typescript/test/sandbox.test.ts +189 -0
- package/.next/standalone/sdk/typescript/test/scopes.test.ts +271 -0
- package/.next/standalone/sdk/typescript/test/setup.ts +19 -0
- package/.next/standalone/sdk/typescript/test/skill-snippets.test.ts +73 -0
- package/.next/standalone/sdk/typescript/test/spool-contract.test.ts +124 -0
- package/.next/standalone/sdk/typescript/test/tracker-bounds.test.ts +191 -0
- package/.next/standalone/sdk/typescript/test/wire-format.test.ts +214 -0
- package/.next/standalone/sdk/typescript/test/writer.test.ts +407 -0
- package/.next/standalone/sdk/typescript/tsconfig.build.json +15 -0
- package/.next/standalone/sdk/typescript/tsconfig.cjs.json +19 -0
- package/.next/standalone/sdk/typescript/tsconfig.json +28 -0
- package/.next/standalone/sdk/typescript/vitest.config.ts +33 -0
- package/.next/standalone/sdk/typescript/vitest.integration.config.ts +23 -0
- package/.next/standalone/server.js +1 -1
- package/README.md +2 -2
- package/dist/cli.mjs +208 -27
- package/dist/worker.mjs +120 -14
- package/package.json +10 -10
- package/scripts/build-policy-pack.mjs +14 -0
- package/src/audit/features.ts +3 -2
- package/src/hooks/builtin-policies.ts +156 -5
- package/src/hooks/jev-cli.ts +57 -1
- package/src/hooks/manager.ts +1 -1
- package/src/hooks/pack-cli.ts +150 -18
- package/src/hooks/pack-store.ts +1 -1
- package/src/hooks/policy-catalog.ts +148 -9
- package/src/hooks/types.ts +1 -1
- package/.next/standalone/.next/static/chunks/0cd-_8-c-m1ea.js +0 -6
- package/.next/standalone/.next/static/chunks/0qrbdkv9qmvli.js +0 -69
- package/.next/standalone/.next/static/chunks/0uldbut9y2-e8.js +0 -1
- package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
- package/.next/standalone/.next/static/chunks/2vkvu9-opa_1z.js +0 -1
- package/.next/standalone/.next/static/chunks/37lhv7wa3ywt6.js +0 -1
- /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version and capability probes for the framework adapters.
|
|
3
|
+
*
|
|
4
|
+
* Peer dependencies express a *floor*, not enforcement: most users already have
|
|
5
|
+
* the framework and will never read our peer range. So the real check happens
|
|
6
|
+
* here, at `instrument()` time, in three tiers:
|
|
7
|
+
*
|
|
8
|
+
* 1. **framework not importable** -> a hard error whose message contains the
|
|
9
|
+
* literal install command. Instrumenting is an explicit user action, so
|
|
10
|
+
* silently doing nothing is never the right answer.
|
|
11
|
+
* 2. **importable but outside the declared range** -> a warning, once, then
|
|
12
|
+
* best-effort. A ceiling exists because without one a clean install a year
|
|
13
|
+
* from now pulls the next major, the callback API shifts, and the adapter
|
|
14
|
+
* stops receiving events *while throwing nothing*.
|
|
15
|
+
* 3. **a capability probe fails** -> warn and no-op **that hook only**, never
|
|
16
|
+
* the whole adapter.
|
|
17
|
+
*
|
|
18
|
+
* `FAILPROOFAI_SDK_STRICT_INTEGRATIONS=1` promotes every warning here to an
|
|
19
|
+
* exception. Warn-by-default is only defensible because there is a supported
|
|
20
|
+
* way to make it fail loudly.
|
|
21
|
+
*
|
|
22
|
+
* ## Why the version comparison is naive
|
|
23
|
+
*
|
|
24
|
+
* This package is contractually zero-dependency, so it cannot use `semver`.
|
|
25
|
+
* `parseVersion` reads the **leading numeric components only** and stops at the
|
|
26
|
+
* first component that is not purely numeric:
|
|
27
|
+
*
|
|
28
|
+
* "1.5.2" -> [1, 5, 2]
|
|
29
|
+
* "2.0.0-beta.1" -> [2, 0, 0] # pre-release suffix ignored
|
|
30
|
+
* "0.14.23+build" -> [0, 14, 23] # build metadata ignored
|
|
31
|
+
*
|
|
32
|
+
* That means `2.0.0-beta.1` compares **equal** to `2.0.0`, so a pre-release of
|
|
33
|
+
* a major we have declared a ceiling against will not be flagged. That is
|
|
34
|
+
* deliberate: the alternative is shipping a semver parser, and being wrong
|
|
35
|
+
* about a release candidate is much cheaper than a runtime dependency.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import { join, sep } from "node:path";
|
|
39
|
+
import { pathToFileURL } from "node:url";
|
|
40
|
+
|
|
41
|
+
import { logger } from "../logger.js";
|
|
42
|
+
import {
|
|
43
|
+
appImportsReachCommonJs,
|
|
44
|
+
importModule,
|
|
45
|
+
isRequired,
|
|
46
|
+
nodeRequire,
|
|
47
|
+
resolveEsm,
|
|
48
|
+
resolveFrom,
|
|
49
|
+
} from "../node-require.js";
|
|
50
|
+
|
|
51
|
+
/** A framework is outside the range this adapter was written against. */
|
|
52
|
+
export class FailproofAICompatError extends Error {
|
|
53
|
+
constructor(message: string) {
|
|
54
|
+
super(message);
|
|
55
|
+
this.name = "FailproofAICompatError";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const TRUTHY = new Set(["1", "true", "yes", "on"]);
|
|
60
|
+
|
|
61
|
+
/** Read a boolean env var. Shared with `core.ts` so both flags parse alike. */
|
|
62
|
+
export function envFlag(name: string): boolean {
|
|
63
|
+
return TRUTHY.has((process.env[name] ?? "").trim().toLowerCase());
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Cached, because it is read on every warning and every `safe()` failure, and
|
|
67
|
+
// resettable, because a test that cannot flip the switch cannot test the policy.
|
|
68
|
+
let strictIntegrationsValue: boolean | null = null;
|
|
69
|
+
|
|
70
|
+
export function strictIntegrations(): boolean {
|
|
71
|
+
strictIntegrationsValue ??= envFlag("FAILPROOFAI_SDK_STRICT_INTEGRATIONS");
|
|
72
|
+
return strictIntegrationsValue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Override the flag. `null` re-reads the environment variable. */
|
|
76
|
+
export function setStrictIntegrations(value: boolean | null): void {
|
|
77
|
+
strictIntegrationsValue = value;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const warned = new Set<string>();
|
|
81
|
+
|
|
82
|
+
/** Forget which warnings have already fired (tests; also `uninstrument()`). */
|
|
83
|
+
export function resetWarnings(): void {
|
|
84
|
+
warned.clear();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Warn once per `key`, or throw if strict.
|
|
89
|
+
*
|
|
90
|
+
* Deduplicated because these fire from `install()` *and* from hot callbacks: a
|
|
91
|
+
* per-call warning on a chatty framework is its own outage.
|
|
92
|
+
*/
|
|
93
|
+
export function warn(message: string, key?: string): void {
|
|
94
|
+
if (strictIntegrations()) throw new FailproofAICompatError(message);
|
|
95
|
+
const dedup = key ?? message;
|
|
96
|
+
if (warned.has(dedup)) return;
|
|
97
|
+
warned.add(dedup);
|
|
98
|
+
logger.warn(message);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Leading numeric components of a version string. See the module comment. */
|
|
102
|
+
export function parseVersion(text: string): number[] {
|
|
103
|
+
const parts: number[] = [];
|
|
104
|
+
for (const chunk of String(text).split(".")) {
|
|
105
|
+
let digits = "";
|
|
106
|
+
for (const character of chunk) {
|
|
107
|
+
if (character < "0" || character > "9") break;
|
|
108
|
+
digits += character;
|
|
109
|
+
}
|
|
110
|
+
if (digits === "") break;
|
|
111
|
+
parts.push(Number.parseInt(digits, 10));
|
|
112
|
+
if (digits.length !== chunk.length) {
|
|
113
|
+
// A partially numeric component ("0-beta", "3+build") ends the numeric
|
|
114
|
+
// prefix — everything after it is a pre-release or build segment.
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return parts;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function compare(left: readonly number[], right: readonly number[]): number {
|
|
122
|
+
const length = Math.max(left.length, right.length);
|
|
123
|
+
for (let i = 0; i < length; i += 1) {
|
|
124
|
+
const a = left[i] ?? 0;
|
|
125
|
+
const b = right[i] ?? 0;
|
|
126
|
+
if (a !== b) return a < b ? -1 : 1;
|
|
127
|
+
}
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* The installed version of a package, or null if it is not installed.
|
|
133
|
+
*
|
|
134
|
+
* Reads `package.json` rather than a `version` export: that export is not
|
|
135
|
+
* guaranteed to exist and most of the frameworks we target do not define one.
|
|
136
|
+
* Resolution is anchored at the consuming APPLICATION (see `node-require.ts`),
|
|
137
|
+
* so it finds a framework installed beside the app even when this SDK itself
|
|
138
|
+
* lives somewhere isolated — a pnpm store, a workspace link.
|
|
139
|
+
*/
|
|
140
|
+
export function versionString(pkg: string): string | null {
|
|
141
|
+
const manifest = resolveFrom(`${pkg}/package.json`);
|
|
142
|
+
if (manifest !== null) {
|
|
143
|
+
try {
|
|
144
|
+
const parsed = nodeRequire(manifest) as { version?: unknown };
|
|
145
|
+
if (typeof parsed.version === "string") return parsed.version;
|
|
146
|
+
} catch {
|
|
147
|
+
// A manifest that will not load is not a reason to refuse to instrument.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// `package.json` is not always in a package's `exports` map. Fall back to the
|
|
151
|
+
// package root's own resolution and walk up to the manifest beside it, rather
|
|
152
|
+
// than reporting "not installed" for a package that is merely strict about
|
|
153
|
+
// what it exports.
|
|
154
|
+
const entry = resolveFrom(pkg);
|
|
155
|
+
if (entry === null) return null;
|
|
156
|
+
const marker = `${sep}node_modules${sep}`;
|
|
157
|
+
const index = entry.lastIndexOf(marker + pkg.split("/")[0]);
|
|
158
|
+
if (index === -1) return null;
|
|
159
|
+
const root = join(entry.slice(0, index + marker.length), ...pkg.split("/"));
|
|
160
|
+
try {
|
|
161
|
+
const parsed = nodeRequire(join(root, "package.json")) as { version?: unknown };
|
|
162
|
+
return typeof parsed.version === "string" ? parsed.version : null;
|
|
163
|
+
} catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function versionTuple(pkg: string): number[] | null {
|
|
169
|
+
const text = versionString(pkg);
|
|
170
|
+
return text ? parseVersion(text) : null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Import a framework module or throw with the literal install command.
|
|
175
|
+
*
|
|
176
|
+
* Tier 1. `instrument("langchain")` on a machine without LangChain is a mistake
|
|
177
|
+
* the user can fix in one command, so we hand them the command.
|
|
178
|
+
*/
|
|
179
|
+
export async function requireModule(specifier: string, install: string): Promise<unknown> {
|
|
180
|
+
const copies = await requireModuleCopies(specifier, install);
|
|
181
|
+
return copies[0]!;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Every in-memory copy of `specifier` the application can be using — the one
|
|
186
|
+
* it loads first. Adapters that patch or subscribe must do so on EACH.
|
|
187
|
+
*
|
|
188
|
+
* ## Why there can be two
|
|
189
|
+
*
|
|
190
|
+
* A dual-published framework ships an ES-module build and a CommonJS build of
|
|
191
|
+
* every module, and Node loads them as two unrelated module instances: two
|
|
192
|
+
* `CallbackManager` classes, two `Agent.prototype`s, two `Settings` singletons.
|
|
193
|
+
* Patching one does nothing to the other. The first release of these adapters
|
|
194
|
+
* resolved with `createRequire` and so always patched the CommonJS copy — in an
|
|
195
|
+
* ES-module application, which is the default for a new TypeScript project,
|
|
196
|
+
* `instrument()` returned success and not one event was ever recorded.
|
|
197
|
+
*
|
|
198
|
+
* ## Which copies
|
|
199
|
+
*
|
|
200
|
+
* 1. The copy the application's own imports reach: CommonJS when the process
|
|
201
|
+
* entry point is CommonJS, the ES-module build otherwise — and always the
|
|
202
|
+
* ES-module build inside a Next.js server, whose CommonJS launcher
|
|
203
|
+
* `import()`s every external package (`appImportsReachCommonJs`). A
|
|
204
|
+
* framework Next BUNDLES is a third copy no resolution can reach; only
|
|
205
|
+
* the call-site helpers see it. Loaded if it is
|
|
206
|
+
* not loaded yet — instrumenting before the framework's first import is
|
|
207
|
+
* the documented order, and loading it then is exactly what the
|
|
208
|
+
* application is about to do anyway.
|
|
209
|
+
* 2. The CommonJS copy as well, but ONLY if something has already
|
|
210
|
+
* `require`d it — an ES-module application with a CommonJS dependency
|
|
211
|
+
* that pulls the framework in. It is never loaded speculatively: a second
|
|
212
|
+
* copy that nothing uses costs memory at best, and at worst the framework
|
|
213
|
+
* notices — LlamaIndex prints "llamaindex was already imported. This
|
|
214
|
+
* breaks constructor checks" to the customer's terminal.
|
|
215
|
+
*
|
|
216
|
+
* The one arrangement this cannot see is the mirror image of (2): a CommonJS
|
|
217
|
+
* application whose ESM-only dependency imports the framework's ES-module
|
|
218
|
+
* build. Node keeps no inspectable registry of loaded ES modules, so there is
|
|
219
|
+
* nothing to detect it with short of a loader hook. Call-site helpers
|
|
220
|
+
* (`langchainHandler()`, `telemetry()`) cover that case, as they cover a
|
|
221
|
+
* bundled application where neither copy in `node_modules` is the one running.
|
|
222
|
+
*/
|
|
223
|
+
export async function requireModuleCopies(specifier: string, install: string): Promise<unknown[]> {
|
|
224
|
+
// Resolve against the APPLICATION. A bare `import(specifier)` resolves
|
|
225
|
+
// relative to this file, which under pnpm or a workspace cannot see the
|
|
226
|
+
// caller's dependencies at all — so the framework the user definitely has
|
|
227
|
+
// installed reports as missing.
|
|
228
|
+
const cjsPath = resolveFrom(specifier);
|
|
229
|
+
const esmPath = resolveEsm(specifier);
|
|
230
|
+
const dual = cjsPath !== null && esmPath !== null && esmPath !== cjsPath;
|
|
231
|
+
|
|
232
|
+
const load = async (path: string | null, viaRequire: boolean): Promise<unknown> =>
|
|
233
|
+
viaRequire && path !== null
|
|
234
|
+
? nodeRequire(path)
|
|
235
|
+
: await importModule(path === null ? specifier : pathToFileURL(path).href);
|
|
236
|
+
|
|
237
|
+
const copies: unknown[] = [];
|
|
238
|
+
try {
|
|
239
|
+
if (!dual) {
|
|
240
|
+
copies.push(await load(cjsPath ?? esmPath, false));
|
|
241
|
+
} else if (appImportsReachCommonJs()) {
|
|
242
|
+
copies.push(await load(cjsPath, true));
|
|
243
|
+
} else {
|
|
244
|
+
copies.push(await load(esmPath, false));
|
|
245
|
+
if (isRequired(cjsPath)) copies.push(nodeRequire(cjsPath));
|
|
246
|
+
}
|
|
247
|
+
} catch (error) {
|
|
248
|
+
throw new Error(
|
|
249
|
+
`cannot instrument ${JSON.stringify(specifier)} because it is not importable. ` +
|
|
250
|
+
`Install it with: ${install}`,
|
|
251
|
+
{ cause: error },
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
return [...new Set(copies)];
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Tier 2. True when `pkg` is inside [minimum, below); warns once if not.
|
|
259
|
+
*
|
|
260
|
+
* Returns true (best effort) for an unknown version too — a framework installed
|
|
261
|
+
* from a git checkout or a workspace link has no usable manifest, and refusing
|
|
262
|
+
* to instrument it would be a worse answer than trying.
|
|
263
|
+
*/
|
|
264
|
+
export function checkVersion(
|
|
265
|
+
framework: string,
|
|
266
|
+
pkg: string,
|
|
267
|
+
options: { minimum?: string; below?: string; reason?: string } = {},
|
|
268
|
+
): boolean {
|
|
269
|
+
const found = versionString(pkg);
|
|
270
|
+
if (found === null) return true;
|
|
271
|
+
const got = parseVersion(found);
|
|
272
|
+
if (got.length === 0) return true;
|
|
273
|
+
|
|
274
|
+
if (options.minimum !== undefined && compare(got, parseVersion(options.minimum)) < 0) {
|
|
275
|
+
warn(
|
|
276
|
+
`${pkg} ${found} is older than the ${options.minimum} this ${framework} adapter was ` +
|
|
277
|
+
`written against${options.reason ? ` (${options.reason})` : ""}. ` +
|
|
278
|
+
"Instrumenting anyway; some events may be missing.",
|
|
279
|
+
`${framework}:${pkg}:min`,
|
|
280
|
+
);
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
if (options.below !== undefined && compare(got, parseVersion(options.below)) >= 0) {
|
|
284
|
+
warn(
|
|
285
|
+
`${pkg} ${found} is newer than the <${options.below} this ${framework} adapter was ` +
|
|
286
|
+
"written against. Instrumenting anyway, but a callback API change would make it " +
|
|
287
|
+
"stop recording silently — please report this.",
|
|
288
|
+
`${framework}:${pkg}:max`,
|
|
289
|
+
);
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
return true;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Tier 3. Run a capability probe; on failure warn and disable ONE hook.
|
|
297
|
+
*
|
|
298
|
+
* A missing capability is never a reason to abandon the whole adapter: the
|
|
299
|
+
* other 90% of the events are still correct and still worth having.
|
|
300
|
+
*/
|
|
301
|
+
export function probe(framework: string, hook: string, check: () => unknown): boolean {
|
|
302
|
+
let ok: boolean;
|
|
303
|
+
try {
|
|
304
|
+
ok = Boolean(check());
|
|
305
|
+
} catch (error) {
|
|
306
|
+
warn(
|
|
307
|
+
`${framework} capability probe for ${JSON.stringify(hook)} failed ` +
|
|
308
|
+
`(${error instanceof Error ? error.message : String(error)}); that hook is disabled, ` +
|
|
309
|
+
"the rest of the adapter is unaffected.",
|
|
310
|
+
`${framework}:${hook}`,
|
|
311
|
+
);
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
if (!ok) {
|
|
315
|
+
warn(
|
|
316
|
+
`${framework} does not provide ${JSON.stringify(hook)} in this version; that hook is ` +
|
|
317
|
+
"disabled, the rest of the adapter is unaffected.",
|
|
318
|
+
`${framework}:${hook}`,
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
return ok;
|
|
322
|
+
}
|