failproofai 0.0.6-beta.3 → 0.0.6-beta.4
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 +7 -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 +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- 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 +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
- 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 +8 -8
- 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/chunks/[root-of-the-server]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0kyh86x._.js → [root-of-the-server]__0om-5pe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__096k.db._.js → [root-of-the-server]__111.vxi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- 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 +9 -9
- package/.next/standalone/.next/static/chunks/{01pmw1-asbek~.js → 02dqjyv6_9mhq.js} +2 -2
- package/.next/standalone/.next/static/chunks/{051m32nx~n5yr.js → 070orfsl6.xal.js} +1 -1
- package/.next/standalone/.next/static/chunks/0mir9jdxn35~s.css +1 -0
- package/.next/standalone/.next/static/chunks/{0mazj-p-~2kc6.js → 0o547jv-k_k35.js} +1 -1
- package/.next/standalone/.next/static/chunks/0pk2h2.mjxy.m.js +6 -0
- package/.next/standalone/.next/static/chunks/{0l-mu4okl-cj1.js → 0rcwkbh24w38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0-dm_9a6nsc2l.js → 140xx_tfr~lm_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{156zca6aewyr-.js → 169_e4dq~1~b6.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0a-yctdwn368y.js → 17ne4p.1sw1jy.js} +1 -1
- package/.next/standalone/next.config.ts +6 -0
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/dist/cli.mjs +2 -2
- package/package.json +2 -2
- package/scripts/prune-standalone.mjs +128 -0
- package/.next/standalone/.claude/settings.json +0 -316
- package/.next/standalone/.failproofai/policies/review-policies.mjs +0 -113
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +0 -63
- package/.next/standalone/.failproofai/policies-config.json +0 -39
- package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +0 -1
- package/.next/standalone/.next/static/chunks/0qakntsrpc~1j.js +0 -6
- package/.next/standalone/AGENTS.md +0 -80
- package/.next/standalone/CHANGELOG.md +0 -158
- package/.next/standalone/CLAUDE.md +0 -165
- package/.next/standalone/CONTRIBUTING.md +0 -76
- package/.next/standalone/Dockerfile.docs +0 -12
- package/.next/standalone/LICENSE +0 -42
- package/.next/standalone/README.md +0 -301
- package/.next/standalone/bin/failproofai.mjs +0 -439
- package/.next/standalone/bun.lock +0 -1119
- package/.next/standalone/components.json +0 -23
- package/.next/standalone/dist/cli.mjs +0 -4696
- package/.next/standalone/dist/index.js +0 -80
- package/.next/standalone/docs/ar/architecture.mdx +0 -334
- package/.next/standalone/docs/ar/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ar/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ar/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ar/cli/hook.mdx +0 -31
- package/.next/standalone/docs/ar/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ar/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ar/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ar/cli/version.mdx +0 -13
- package/.next/standalone/docs/ar/configuration.mdx +0 -223
- package/.next/standalone/docs/ar/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ar/dashboard.mdx +0 -142
- package/.next/standalone/docs/ar/examples.mdx +0 -307
- package/.next/standalone/docs/ar/for-agents.mdx +0 -39
- package/.next/standalone/docs/ar/getting-started.mdx +0 -187
- package/.next/standalone/docs/ar/introduction.mdx +0 -58
- package/.next/standalone/docs/ar/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ar/testing.mdx +0 -261
- package/.next/standalone/docs/architecture.mdx +0 -332
- package/.next/standalone/docs/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/cli/hook.mdx +0 -30
- package/.next/standalone/docs/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/cli/version.mdx +0 -12
- package/.next/standalone/docs/configuration.mdx +0 -222
- package/.next/standalone/docs/custom-policies.mdx +0 -353
- package/.next/standalone/docs/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/architecture.mdx +0 -332
- package/.next/standalone/docs/de/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/de/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/de/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/de/cli/hook.mdx +0 -30
- package/.next/standalone/docs/de/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/de/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/de/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/de/cli/version.mdx +0 -12
- package/.next/standalone/docs/de/configuration.mdx +0 -222
- package/.next/standalone/docs/de/custom-policies.mdx +0 -353
- package/.next/standalone/docs/de/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/examples.mdx +0 -307
- package/.next/standalone/docs/de/for-agents.mdx +0 -38
- package/.next/standalone/docs/de/getting-started.mdx +0 -186
- package/.next/standalone/docs/de/introduction.mdx +0 -57
- package/.next/standalone/docs/de/package-aliases.mdx +0 -82
- package/.next/standalone/docs/de/testing.mdx +0 -260
- package/.next/standalone/docs/docs.json +0 -1002
- package/.next/standalone/docs/es/architecture.mdx +0 -332
- package/.next/standalone/docs/es/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/es/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/es/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/es/cli/hook.mdx +0 -30
- package/.next/standalone/docs/es/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/es/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/es/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/es/cli/version.mdx +0 -12
- package/.next/standalone/docs/es/configuration.mdx +0 -222
- package/.next/standalone/docs/es/custom-policies.mdx +0 -353
- package/.next/standalone/docs/es/dashboard.mdx +0 -142
- package/.next/standalone/docs/es/examples.mdx +0 -307
- package/.next/standalone/docs/es/for-agents.mdx +0 -38
- package/.next/standalone/docs/es/getting-started.mdx +0 -186
- package/.next/standalone/docs/es/introduction.mdx +0 -57
- package/.next/standalone/docs/es/package-aliases.mdx +0 -82
- package/.next/standalone/docs/es/testing.mdx +0 -260
- package/.next/standalone/docs/examples.mdx +0 -307
- package/.next/standalone/docs/favicon.ico +0 -0
- package/.next/standalone/docs/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/architecture.mdx +0 -332
- package/.next/standalone/docs/fr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/fr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/fr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/fr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/fr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/fr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/fr/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/fr/cli/version.mdx +0 -12
- package/.next/standalone/docs/fr/configuration.mdx +0 -222
- package/.next/standalone/docs/fr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/fr/dashboard.mdx +0 -142
- package/.next/standalone/docs/fr/examples.mdx +0 -307
- package/.next/standalone/docs/fr/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/getting-started.mdx +0 -186
- package/.next/standalone/docs/fr/introduction.mdx +0 -57
- package/.next/standalone/docs/fr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/fr/testing.mdx +0 -260
- package/.next/standalone/docs/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/architecture.mdx +0 -333
- package/.next/standalone/docs/he/built-in-policies.mdx +0 -575
- package/.next/standalone/docs/he/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/he/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/he/cli/hook.mdx +0 -30
- package/.next/standalone/docs/he/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/he/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/he/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/he/cli/version.mdx +0 -12
- package/.next/standalone/docs/he/configuration.mdx +0 -223
- package/.next/standalone/docs/he/custom-policies.mdx +0 -353
- package/.next/standalone/docs/he/dashboard.mdx +0 -142
- package/.next/standalone/docs/he/examples.mdx +0 -307
- package/.next/standalone/docs/he/for-agents.mdx +0 -38
- package/.next/standalone/docs/he/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/introduction.mdx +0 -57
- package/.next/standalone/docs/he/package-aliases.mdx +0 -82
- package/.next/standalone/docs/he/testing.mdx +0 -260
- package/.next/standalone/docs/hi/architecture.mdx +0 -334
- package/.next/standalone/docs/hi/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/hi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/hi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/hi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/hi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/hi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/hi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/hi/cli/version.mdx +0 -12
- package/.next/standalone/docs/hi/configuration.mdx +0 -222
- package/.next/standalone/docs/hi/custom-policies.mdx +0 -354
- package/.next/standalone/docs/hi/dashboard.mdx +0 -142
- package/.next/standalone/docs/hi/examples.mdx +0 -309
- package/.next/standalone/docs/hi/for-agents.mdx +0 -38
- package/.next/standalone/docs/hi/getting-started.mdx +0 -187
- package/.next/standalone/docs/hi/introduction.mdx +0 -57
- package/.next/standalone/docs/hi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/hi/testing.mdx +0 -260
- package/.next/standalone/docs/i18n/README.ar.md +0 -312
- package/.next/standalone/docs/i18n/README.de.md +0 -307
- package/.next/standalone/docs/i18n/README.es.md +0 -307
- package/.next/standalone/docs/i18n/README.fr.md +0 -307
- package/.next/standalone/docs/i18n/README.he.md +0 -312
- package/.next/standalone/docs/i18n/README.hi.md +0 -307
- package/.next/standalone/docs/i18n/README.it.md +0 -307
- package/.next/standalone/docs/i18n/README.ja.md +0 -307
- package/.next/standalone/docs/i18n/README.ko.md +0 -307
- package/.next/standalone/docs/i18n/README.pt-br.md +0 -307
- package/.next/standalone/docs/i18n/README.ru.md +0 -308
- package/.next/standalone/docs/i18n/README.tr.md +0 -307
- package/.next/standalone/docs/i18n/README.vi.md +0 -307
- package/.next/standalone/docs/i18n/README.zh.md +0 -307
- package/.next/standalone/docs/introduction.mdx +0 -57
- package/.next/standalone/docs/it/architecture.mdx +0 -334
- package/.next/standalone/docs/it/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/it/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/it/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/it/cli/hook.mdx +0 -30
- package/.next/standalone/docs/it/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/it/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/it/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/it/cli/version.mdx +0 -12
- package/.next/standalone/docs/it/configuration.mdx +0 -222
- package/.next/standalone/docs/it/custom-policies.mdx +0 -353
- package/.next/standalone/docs/it/dashboard.mdx +0 -142
- package/.next/standalone/docs/it/examples.mdx +0 -307
- package/.next/standalone/docs/it/for-agents.mdx +0 -38
- package/.next/standalone/docs/it/getting-started.mdx +0 -186
- package/.next/standalone/docs/it/introduction.mdx +0 -57
- package/.next/standalone/docs/it/package-aliases.mdx +0 -82
- package/.next/standalone/docs/it/testing.mdx +0 -260
- package/.next/standalone/docs/ja/architecture.mdx +0 -332
- package/.next/standalone/docs/ja/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ja/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ja/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ja/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ja/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ja/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ja/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ja/cli/version.mdx +0 -12
- package/.next/standalone/docs/ja/configuration.mdx +0 -222
- package/.next/standalone/docs/ja/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ja/dashboard.mdx +0 -142
- package/.next/standalone/docs/ja/examples.mdx +0 -307
- package/.next/standalone/docs/ja/for-agents.mdx +0 -38
- package/.next/standalone/docs/ja/getting-started.mdx +0 -186
- package/.next/standalone/docs/ja/introduction.mdx +0 -57
- package/.next/standalone/docs/ja/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ja/testing.mdx +0 -260
- package/.next/standalone/docs/ko/architecture.mdx +0 -332
- package/.next/standalone/docs/ko/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ko/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ko/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ko/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ko/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ko/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ko/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ko/cli/version.mdx +0 -12
- package/.next/standalone/docs/ko/configuration.mdx +0 -222
- package/.next/standalone/docs/ko/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ko/dashboard.mdx +0 -142
- package/.next/standalone/docs/ko/examples.mdx +0 -307
- package/.next/standalone/docs/ko/for-agents.mdx +0 -38
- package/.next/standalone/docs/ko/getting-started.mdx +0 -186
- package/.next/standalone/docs/ko/introduction.mdx +0 -57
- package/.next/standalone/docs/ko/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ko/testing.mdx +0 -260
- package/.next/standalone/docs/logo/dark.svg +0 -21
- package/.next/standalone/docs/logo/exosphere-dark.png +0 -0
- package/.next/standalone/docs/logo/exosphere-light.png +0 -0
- package/.next/standalone/docs/logo/light.svg +0 -21
- package/.next/standalone/docs/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/architecture.mdx +0 -332
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/pt-br/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/pt-br/cli/hook.mdx +0 -30
- package/.next/standalone/docs/pt-br/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/pt-br/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/pt-br/cli/version.mdx +0 -12
- package/.next/standalone/docs/pt-br/configuration.mdx +0 -222
- package/.next/standalone/docs/pt-br/custom-policies.mdx +0 -353
- package/.next/standalone/docs/pt-br/dashboard.mdx +0 -142
- package/.next/standalone/docs/pt-br/examples.mdx +0 -307
- package/.next/standalone/docs/pt-br/for-agents.mdx +0 -38
- package/.next/standalone/docs/pt-br/getting-started.mdx +0 -186
- package/.next/standalone/docs/pt-br/introduction.mdx +0 -57
- package/.next/standalone/docs/pt-br/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/testing.mdx +0 -260
- package/.next/standalone/docs/ru/architecture.mdx +0 -333
- package/.next/standalone/docs/ru/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ru/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ru/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ru/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ru/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ru/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/ru/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ru/cli/version.mdx +0 -12
- package/.next/standalone/docs/ru/configuration.mdx +0 -222
- package/.next/standalone/docs/ru/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ru/dashboard.mdx +0 -142
- package/.next/standalone/docs/ru/examples.mdx +0 -309
- package/.next/standalone/docs/ru/for-agents.mdx +0 -38
- package/.next/standalone/docs/ru/getting-started.mdx +0 -186
- package/.next/standalone/docs/ru/introduction.mdx +0 -57
- package/.next/standalone/docs/ru/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ru/testing.mdx +0 -260
- package/.next/standalone/docs/testing.mdx +0 -260
- package/.next/standalone/docs/tr/architecture.mdx +0 -333
- package/.next/standalone/docs/tr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/tr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/tr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/tr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/tr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/tr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/tr/cli/remove-policies.mdx +0 -44
- package/.next/standalone/docs/tr/cli/version.mdx +0 -12
- package/.next/standalone/docs/tr/configuration.mdx +0 -222
- package/.next/standalone/docs/tr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/tr/dashboard.mdx +0 -142
- package/.next/standalone/docs/tr/examples.mdx +0 -308
- package/.next/standalone/docs/tr/for-agents.mdx +0 -38
- package/.next/standalone/docs/tr/getting-started.mdx +0 -186
- package/.next/standalone/docs/tr/introduction.mdx +0 -57
- package/.next/standalone/docs/tr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/tr/testing.mdx +0 -260
- package/.next/standalone/docs/vi/architecture.mdx +0 -334
- package/.next/standalone/docs/vi/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/vi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/vi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/vi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/vi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/vi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/vi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/vi/cli/version.mdx +0 -13
- package/.next/standalone/docs/vi/configuration.mdx +0 -222
- package/.next/standalone/docs/vi/custom-policies.mdx +0 -353
- package/.next/standalone/docs/vi/dashboard.mdx +0 -142
- package/.next/standalone/docs/vi/examples.mdx +0 -308
- package/.next/standalone/docs/vi/for-agents.mdx +0 -38
- package/.next/standalone/docs/vi/getting-started.mdx +0 -186
- package/.next/standalone/docs/vi/introduction.mdx +0 -57
- package/.next/standalone/docs/vi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/vi/testing.mdx +0 -260
- package/.next/standalone/docs/zh/architecture.mdx +0 -332
- package/.next/standalone/docs/zh/built-in-policies.mdx +0 -570
- package/.next/standalone/docs/zh/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/zh/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/zh/cli/hook.mdx +0 -30
- package/.next/standalone/docs/zh/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/zh/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/zh/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/zh/cli/version.mdx +0 -12
- package/.next/standalone/docs/zh/configuration.mdx +0 -222
- package/.next/standalone/docs/zh/custom-policies.mdx +0 -353
- package/.next/standalone/docs/zh/dashboard.mdx +0 -142
- package/.next/standalone/docs/zh/examples.mdx +0 -307
- package/.next/standalone/docs/zh/for-agents.mdx +0 -38
- package/.next/standalone/docs/zh/getting-started.mdx +0 -186
- package/.next/standalone/docs/zh/introduction.mdx +0 -57
- package/.next/standalone/docs/zh/package-aliases.mdx +0 -82
- package/.next/standalone/docs/zh/testing.mdx +0 -260
- package/.next/standalone/eslint.config.mjs +0 -15
- package/.next/standalone/examples/convention-policies/security-policies.mjs +0 -40
- package/.next/standalone/examples/convention-policies/workflow-policies.mjs +0 -41
- package/.next/standalone/examples/policies-advanced/index.js +0 -103
- package/.next/standalone/examples/policies-advanced/utils.js +0 -35
- package/.next/standalone/examples/policies-basic.js +0 -77
- package/.next/standalone/examples/policies-notification.js +0 -104
- package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
- package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
- package/.next/standalone/node_modules/@img/colour/package.json +0 -45
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linux-x64/package.json +0 -46
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/.next/standalone/node_modules/detect-libc/lib/elf.js +0 -39
- package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/.next/standalone/node_modules/detect-libc/lib/process.js +0 -24
- package/.next/standalone/node_modules/detect-libc/package.json +0 -44
- package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
- package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
- package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
- package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
- package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
- package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
- package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
- package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
- package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
- package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
- package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
- package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
- package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
- package/.next/standalone/node_modules/sharp/package.json +0 -202
- package/.next/standalone/scripts/alias-proxy.js +0 -18
- package/.next/standalone/scripts/dev.ts +0 -3
- package/.next/standalone/scripts/install-telemetry.mjs +0 -108
- package/.next/standalone/scripts/launch.ts +0 -83
- package/.next/standalone/scripts/parse-script-args.ts +0 -87
- package/.next/standalone/scripts/postinstall.mjs +0 -121
- package/.next/standalone/scripts/preuninstall.mjs +0 -131
- package/.next/standalone/scripts/publish-aliases.mjs +0 -87
- package/.next/standalone/scripts/start.ts +0 -3
- package/.next/standalone/scripts/sync-hook-events-prompt.md +0 -60
- package/.next/standalone/scripts/translate-docs/cache.ts +0 -62
- package/.next/standalone/scripts/translate-docs/cli.ts +0 -357
- package/.next/standalone/scripts/translate-docs/config.ts +0 -248
- package/.next/standalone/scripts/translate-docs/mdx-translator.ts +0 -153
- package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +0 -107
- package/.next/standalone/scripts/translate-docs/readme-translator.ts +0 -154
- package/.next/standalone/scripts/translate-docs/translator.ts +0 -68
- package/.next/standalone/scripts/translate-docs/types.ts +0 -43
- package/.next/standalone/src/auth/login.ts +0 -104
- package/.next/standalone/src/auth/logout.ts +0 -50
- package/.next/standalone/src/auth/token-store.ts +0 -64
- package/.next/standalone/src/cli-error.ts +0 -18
- package/.next/standalone/src/hooks/builtin-policies.ts +0 -1615
- package/.next/standalone/src/hooks/custom-hooks-loader.ts +0 -205
- package/.next/standalone/src/hooks/custom-hooks-registry.ts +0 -30
- package/.next/standalone/src/hooks/handler.ts +0 -222
- package/.next/standalone/src/hooks/hook-activity-store.ts +0 -349
- package/.next/standalone/src/hooks/hook-logger.ts +0 -133
- package/.next/standalone/src/hooks/hook-telemetry.ts +0 -43
- package/.next/standalone/src/hooks/hooks-config.ts +0 -166
- package/.next/standalone/src/hooks/install-prompt.ts +0 -357
- package/.next/standalone/src/hooks/llm-client.ts +0 -90
- package/.next/standalone/src/hooks/loader-utils.ts +0 -178
- package/.next/standalone/src/hooks/manager.ts +0 -692
- package/.next/standalone/src/hooks/policy-evaluator.ts +0 -224
- package/.next/standalone/src/hooks/policy-helpers.ts +0 -16
- package/.next/standalone/src/hooks/policy-registry.ts +0 -90
- package/.next/standalone/src/hooks/policy-types.ts +0 -77
- package/.next/standalone/src/hooks/types.ts +0 -63
- package/.next/standalone/src/index.ts +0 -19
- package/.next/standalone/src/posthog-key.ts +0 -5
- package/.next/standalone/src/relay/daemon.ts +0 -362
- package/.next/standalone/src/relay/pid.ts +0 -76
- package/.next/standalone/src/relay/queue.ts +0 -225
- package/.next/standalone/tailwind.config.ts +0 -11
- package/.next/standalone/tsconfig.json +0 -42
- package/.next/standalone/vitest.config.e2e.mts +0 -24
- package/.next/standalone/vitest.config.mts +0 -23
- /package/.next/standalone/.next/static/{r-wX0MuAfCjbhJm3phQc8 → wOkJXoch1UmRAmyIuKZWc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{r-wX0MuAfCjbhJm3phQc8 → wOkJXoch1UmRAmyIuKZWc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{r-wX0MuAfCjbhJm3phQc8 → wOkJXoch1UmRAmyIuKZWc}/_ssgManifest.js +0 -0
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from "node:fs";
|
|
2
|
-
import { dirname, join, relative } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { getLanguageByCode } from "./config";
|
|
5
|
-
import { translateContent } from "./translator";
|
|
6
|
-
import {
|
|
7
|
-
readCache,
|
|
8
|
-
writeCache,
|
|
9
|
-
isCached,
|
|
10
|
-
setCacheEntry,
|
|
11
|
-
} from "./cache";
|
|
12
|
-
import type { TranslationResult, TranslationCache } from "./types";
|
|
13
|
-
|
|
14
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
-
const DOCS_DIR = join(__dirname, "..", "..", "docs");
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Rewrite internal doc links to include the language prefix.
|
|
19
|
-
* e.g. href="/built-in-policies" -> href="/es/built-in-policies"
|
|
20
|
-
* [Getting started](/getting-started) -> [Getting started](/es/getting-started)
|
|
21
|
-
*/
|
|
22
|
-
export function rewriteInternalLinks(
|
|
23
|
-
content: string,
|
|
24
|
-
lang: string,
|
|
25
|
-
): string {
|
|
26
|
-
// Rewrite MDX component href attributes pointing to internal paths
|
|
27
|
-
let result = content.replace(
|
|
28
|
-
/href="(\/[^"]*?)"/g,
|
|
29
|
-
(_match, path: string) => {
|
|
30
|
-
// Skip external URLs and anchors
|
|
31
|
-
if (path.startsWith("/http") || path === "/") return `href="${path}"`;
|
|
32
|
-
return `href="/${lang}${path}"`;
|
|
33
|
-
},
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
// Rewrite Markdown links with internal paths
|
|
37
|
-
result = result.replace(
|
|
38
|
-
/\]\((\/[^)]*?)\)/g,
|
|
39
|
-
(_match, path: string) => {
|
|
40
|
-
if (path.startsWith("/http") || path === "/") return `](${path})`;
|
|
41
|
-
return `](/${lang}${path})`;
|
|
42
|
-
},
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Translate a single MDX doc page for a given language.
|
|
50
|
-
*/
|
|
51
|
-
export async function translateMdxPage(
|
|
52
|
-
sourcePath: string,
|
|
53
|
-
lang: string,
|
|
54
|
-
options: { force?: boolean; dryRun?: boolean; model?: string; cache?: TranslationCache } = {},
|
|
55
|
-
): Promise<TranslationResult> {
|
|
56
|
-
const relPath = relative(DOCS_DIR, sourcePath);
|
|
57
|
-
const outputPath = join(DOCS_DIR, lang, relPath);
|
|
58
|
-
const sourceContent = readFileSync(sourcePath, "utf-8");
|
|
59
|
-
|
|
60
|
-
const langConfig = getLanguageByCode(lang);
|
|
61
|
-
if (!langConfig) throw new Error(`Unknown language: ${lang}`);
|
|
62
|
-
|
|
63
|
-
// Check cache — use provided cache object or read from disk
|
|
64
|
-
if (!options.force && !options.dryRun) {
|
|
65
|
-
const cache = options.cache ?? readCache();
|
|
66
|
-
if (isCached(cache, relPath, lang, sourceContent)) {
|
|
67
|
-
return {
|
|
68
|
-
lang,
|
|
69
|
-
sourcePath,
|
|
70
|
-
outputPath,
|
|
71
|
-
inputTokens: 0,
|
|
72
|
-
outputTokens: 0,
|
|
73
|
-
cached: true,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (options.dryRun) {
|
|
79
|
-
return {
|
|
80
|
-
lang,
|
|
81
|
-
sourcePath,
|
|
82
|
-
outputPath,
|
|
83
|
-
inputTokens: 0,
|
|
84
|
-
outputTokens: 0,
|
|
85
|
-
cached: false,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Translate
|
|
90
|
-
const { translated, inputTokens, outputTokens } = await translateContent(
|
|
91
|
-
sourceContent,
|
|
92
|
-
lang,
|
|
93
|
-
langConfig.name,
|
|
94
|
-
options.model,
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
// Rewrite internal links
|
|
98
|
-
const withLinks = rewriteInternalLinks(translated, lang);
|
|
99
|
-
|
|
100
|
-
// Write output
|
|
101
|
-
mkdirSync(dirname(outputPath), { recursive: true });
|
|
102
|
-
writeFileSync(outputPath, withLinks);
|
|
103
|
-
|
|
104
|
-
// Update cache — skip if caller manages the cache (batch write)
|
|
105
|
-
if (!options.cache) {
|
|
106
|
-
const cache = readCache();
|
|
107
|
-
setCacheEntry(cache, relPath, lang, sourceContent, inputTokens, outputTokens);
|
|
108
|
-
writeCache(cache);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return {
|
|
112
|
-
lang,
|
|
113
|
-
sourcePath,
|
|
114
|
-
outputPath,
|
|
115
|
-
inputTokens,
|
|
116
|
-
outputTokens,
|
|
117
|
-
cached: false,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Get all MDX page paths from the docs directory (English only, no language subdirs).
|
|
123
|
-
*/
|
|
124
|
-
export function getEnglishMdxPages(): string[] {
|
|
125
|
-
const results: string[] = [];
|
|
126
|
-
|
|
127
|
-
function walk(dir: string, prefix: string = "") {
|
|
128
|
-
for (const entry of readdirSync(dir)) {
|
|
129
|
-
const full = join(dir, entry);
|
|
130
|
-
const rel = prefix ? `${prefix}/${entry}` : entry;
|
|
131
|
-
if (statSync(full).isDirectory()) {
|
|
132
|
-
// Skip language directories at the top level
|
|
133
|
-
if (!prefix && isLanguageDir(entry)) continue;
|
|
134
|
-
// Skip non-doc directories like logo, i18n
|
|
135
|
-
if (!prefix && (entry === "logo" || entry === "i18n")) continue;
|
|
136
|
-
walk(full, rel);
|
|
137
|
-
} else if (entry.endsWith(".mdx")) {
|
|
138
|
-
results.push(full);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
walk(DOCS_DIR);
|
|
144
|
-
return results.sort();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function isLanguageDir(name: string): boolean {
|
|
148
|
-
const langCodes = [
|
|
149
|
-
"zh", "ja", "ko", "es", "pt-br", "de", "fr",
|
|
150
|
-
"ru", "hi", "tr", "vi", "it", "ar", "he",
|
|
151
|
-
];
|
|
152
|
-
return langCodes.includes(name);
|
|
153
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { NAV_TRANSLATIONS, LANGUAGES } from "./config";
|
|
5
|
-
|
|
6
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const DOCS_JSON_PATH = join(__dirname, "..", "..", "docs", "docs.json");
|
|
8
|
-
|
|
9
|
-
interface NavGroup {
|
|
10
|
-
group: string;
|
|
11
|
-
pages: string[];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface NavTab {
|
|
15
|
-
tab: string;
|
|
16
|
-
groups: NavGroup[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface LanguageNav {
|
|
20
|
-
language: string;
|
|
21
|
-
tabs: NavTab[];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Build a navigation entry for a specific language by transforming the
|
|
26
|
-
* English navigation structure.
|
|
27
|
-
*/
|
|
28
|
-
export function buildLanguageNav(
|
|
29
|
-
englishTabs: NavTab[],
|
|
30
|
-
lang: string,
|
|
31
|
-
): LanguageNav {
|
|
32
|
-
const t = NAV_TRANSLATIONS[lang];
|
|
33
|
-
if (!t) throw new Error(`No nav translations for language: ${lang}`);
|
|
34
|
-
|
|
35
|
-
const groupNameMap: Record<string, string> = {
|
|
36
|
-
"Getting Started": t.gettingStarted,
|
|
37
|
-
"Core Concepts": t.coreConcepts,
|
|
38
|
-
CLI: t.cli,
|
|
39
|
-
Tools: t.tools,
|
|
40
|
-
Advanced: t.advanced,
|
|
41
|
-
Examples: t.examples,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const tabNameMap: Record<string, string> = {
|
|
45
|
-
Docs: t.docs,
|
|
46
|
-
Examples: t.examples,
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const tabs: NavTab[] = englishTabs.map((tab) => ({
|
|
50
|
-
tab: tabNameMap[tab.tab] || tab.tab,
|
|
51
|
-
groups: tab.groups.map((group) => ({
|
|
52
|
-
group: groupNameMap[group.group] || group.group,
|
|
53
|
-
pages: group.pages.map((page) => `${lang}/${page}`),
|
|
54
|
-
})),
|
|
55
|
-
}));
|
|
56
|
-
|
|
57
|
-
return { language: lang, tabs };
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Read the current docs.json config.
|
|
62
|
-
*/
|
|
63
|
-
export function readDocsConfig(): Record<string, unknown> {
|
|
64
|
-
return JSON.parse(readFileSync(DOCS_JSON_PATH, "utf-8"));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Generate the full languages array for docs.json from the English nav
|
|
69
|
-
* and a list of language codes.
|
|
70
|
-
*/
|
|
71
|
-
export function generateLanguagesArray(
|
|
72
|
-
englishTabs: NavTab[],
|
|
73
|
-
langCodes: string[],
|
|
74
|
-
): LanguageNav[] {
|
|
75
|
-
// English first (default)
|
|
76
|
-
const english: LanguageNav = { language: "en", tabs: englishTabs };
|
|
77
|
-
const others = langCodes.map((code) => buildLanguageNav(englishTabs, code));
|
|
78
|
-
return [english, ...others];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Update docs.json to use the languages array structure.
|
|
83
|
-
*/
|
|
84
|
-
export function updateDocsJson(langCodes: string[]): void {
|
|
85
|
-
const config = readDocsConfig();
|
|
86
|
-
const nav = config.navigation as Record<string, unknown>;
|
|
87
|
-
|
|
88
|
-
// Extract existing English tabs
|
|
89
|
-
const englishTabs = nav.tabs as NavTab[];
|
|
90
|
-
if (!englishTabs) {
|
|
91
|
-
throw new Error("docs.json navigation.tabs not found — is this already using the languages format?");
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Build languages array
|
|
95
|
-
const languages = generateLanguagesArray(englishTabs, langCodes);
|
|
96
|
-
|
|
97
|
-
// Replace tabs with languages, preserve global
|
|
98
|
-
const newNav: Record<string, unknown> = {
|
|
99
|
-
languages,
|
|
100
|
-
};
|
|
101
|
-
if (nav.global) {
|
|
102
|
-
newNav.global = nav.global;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
config.navigation = newNav;
|
|
106
|
-
writeFileSync(DOCS_JSON_PATH, JSON.stringify(config, null, 2) + "\n");
|
|
107
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { LANGUAGES, getLanguageByCode } from "./config";
|
|
5
|
-
import { translateContent } from "./translator";
|
|
6
|
-
import { readCache, writeCache, isCached, setCacheEntry } from "./cache";
|
|
7
|
-
import type { TranslationResult, TranslationCache } from "./types";
|
|
8
|
-
|
|
9
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
-
const ROOT_DIR = join(__dirname, "..", "..");
|
|
11
|
-
const README_PATH = join(ROOT_DIR, "README.md");
|
|
12
|
-
const I18N_DIR = join(ROOT_DIR, "docs", "i18n");
|
|
13
|
-
|
|
14
|
-
function buildLanguageSelector(currentLang: string): string {
|
|
15
|
-
const flags: Record<string, string> = {
|
|
16
|
-
en: "\ud83c\uddfa\ud83c\uddf8",
|
|
17
|
-
zh: "\ud83c\udde8\ud83c\uddf3",
|
|
18
|
-
ja: "\ud83c\uddef\ud83c\uddf5",
|
|
19
|
-
ko: "\ud83c\uddf0\ud83c\uddf7",
|
|
20
|
-
es: "\ud83c\uddea\ud83c\uddf8",
|
|
21
|
-
"pt-br": "\ud83c\udde7\ud83c\uddf7",
|
|
22
|
-
de: "\ud83c\udde9\ud83c\uddea",
|
|
23
|
-
fr: "\ud83c\uddeb\ud83c\uddf7",
|
|
24
|
-
ru: "\ud83c\uddf7\ud83c\uddfa",
|
|
25
|
-
hi: "\ud83c\uddee\ud83c\uddf3",
|
|
26
|
-
tr: "\ud83c\uddf9\ud83c\uddf7",
|
|
27
|
-
vi: "\ud83c\uddfb\ud83c\uddf3",
|
|
28
|
-
it: "\ud83c\uddee\ud83c\uddf9",
|
|
29
|
-
ar: "\ud83c\uddf8\ud83c\udde6",
|
|
30
|
-
he: "\ud83c\uddee\ud83c\uddf1",
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const links: string[] = [];
|
|
34
|
-
|
|
35
|
-
// English link (to root README)
|
|
36
|
-
if (currentLang !== "en") {
|
|
37
|
-
links.push(`[${flags.en} English](../../README.md)`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
for (const lang of LANGUAGES) {
|
|
41
|
-
const flag = flags[lang.code] || "";
|
|
42
|
-
if (lang.code === currentLang) {
|
|
43
|
-
links.push(`**${flag} ${lang.nativeName}**`);
|
|
44
|
-
} else {
|
|
45
|
-
links.push(`[${flag} ${lang.nativeName}](README.${lang.code}.md)`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return links.join(" | ");
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function translateReadme(
|
|
53
|
-
lang: string,
|
|
54
|
-
options: { force?: boolean; dryRun?: boolean; model?: string; cache?: TranslationCache } = {},
|
|
55
|
-
): Promise<TranslationResult> {
|
|
56
|
-
const outputPath = join(I18N_DIR, `README.${lang}.md`);
|
|
57
|
-
const sourceContent = readFileSync(README_PATH, "utf-8");
|
|
58
|
-
|
|
59
|
-
const langConfig = getLanguageByCode(lang);
|
|
60
|
-
if (!langConfig) throw new Error(`Unknown language: ${lang}`);
|
|
61
|
-
|
|
62
|
-
// Check cache — use provided cache object or read from disk
|
|
63
|
-
if (!options.force && !options.dryRun) {
|
|
64
|
-
const cache = options.cache ?? readCache();
|
|
65
|
-
if (isCached(cache, "README.md", lang, sourceContent)) {
|
|
66
|
-
return {
|
|
67
|
-
lang,
|
|
68
|
-
sourcePath: README_PATH,
|
|
69
|
-
outputPath,
|
|
70
|
-
inputTokens: 0,
|
|
71
|
-
outputTokens: 0,
|
|
72
|
-
cached: true,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (options.dryRun) {
|
|
78
|
-
return {
|
|
79
|
-
lang,
|
|
80
|
-
sourcePath: README_PATH,
|
|
81
|
-
outputPath,
|
|
82
|
-
inputTokens: 0,
|
|
83
|
-
outputTokens: 0,
|
|
84
|
-
cached: false,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Translate
|
|
89
|
-
const { translated, inputTokens, outputTokens } = await translateContent(
|
|
90
|
-
sourceContent,
|
|
91
|
-
lang,
|
|
92
|
-
langConfig.name,
|
|
93
|
-
options.model,
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
// Build the final output with header
|
|
97
|
-
const disclaimer = langConfig.rtl
|
|
98
|
-
? `> **\u26a0\ufe0f** \u0647\u0630\u0647 \u062a\u0631\u062c\u0645\u0629 \u0622\u0644\u064a\u0629. \u0644\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631\u060c \u0631\u0627\u062c\u0639 [English README](../../README.md).`
|
|
99
|
-
: `> **\u26a0\ufe0f** This is an auto-generated translation. For the latest version, see the [English README](../../README.md). Community corrections welcome!`;
|
|
100
|
-
|
|
101
|
-
const langSelector = buildLanguageSelector(lang);
|
|
102
|
-
const rtlOpen = langConfig.rtl ? `<div dir="rtl">\n\n` : "";
|
|
103
|
-
const rtlClose = langConfig.rtl ? `\n\n</div>` : "";
|
|
104
|
-
|
|
105
|
-
const output = `${disclaimer}\n\n${langSelector}\n\n---\n${rtlOpen}\n${translated}\n${rtlClose}`;
|
|
106
|
-
|
|
107
|
-
// Write output
|
|
108
|
-
mkdirSync(I18N_DIR, { recursive: true });
|
|
109
|
-
writeFileSync(outputPath, output);
|
|
110
|
-
|
|
111
|
-
// Update cache — skip if caller manages the cache (batch write)
|
|
112
|
-
if (!options.cache) {
|
|
113
|
-
const cache = readCache();
|
|
114
|
-
setCacheEntry(cache, "README.md", lang, sourceContent, inputTokens, outputTokens);
|
|
115
|
-
writeCache(cache);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
lang,
|
|
120
|
-
sourcePath: README_PATH,
|
|
121
|
-
outputPath,
|
|
122
|
-
inputTokens,
|
|
123
|
-
outputTokens,
|
|
124
|
-
cached: false,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Build the language selector line to add to the main README.
|
|
130
|
-
*/
|
|
131
|
-
export function buildMainReadmeLanguageLinks(): string {
|
|
132
|
-
const flags: Record<string, string> = {
|
|
133
|
-
zh: "\ud83c\udde8\ud83c\uddf3",
|
|
134
|
-
ja: "\ud83c\uddef\ud83c\uddf5",
|
|
135
|
-
ko: "\ud83c\uddf0\ud83c\uddf7",
|
|
136
|
-
es: "\ud83c\uddea\ud83c\uddf8",
|
|
137
|
-
"pt-br": "\ud83c\udde7\ud83c\uddf7",
|
|
138
|
-
de: "\ud83c\udde9\ud83c\uddea",
|
|
139
|
-
fr: "\ud83c\uddeb\ud83c\uddf7",
|
|
140
|
-
ru: "\ud83c\uddf7\ud83c\uddfa",
|
|
141
|
-
hi: "\ud83c\uddee\ud83c\uddf3",
|
|
142
|
-
tr: "\ud83c\uddf9\ud83c\uddf7",
|
|
143
|
-
vi: "\ud83c\uddfb\ud83c\uddf3",
|
|
144
|
-
it: "\ud83c\uddee\ud83c\uddf9",
|
|
145
|
-
ar: "\ud83c\uddf8\ud83c\udde6",
|
|
146
|
-
he: "\ud83c\uddee\ud83c\uddf1",
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
const links = LANGUAGES.map(
|
|
150
|
-
(l) => `[${flags[l.code] || ""} ${l.nativeName}](docs/i18n/README.${l.code}.md)`,
|
|
151
|
-
);
|
|
152
|
-
|
|
153
|
-
return `**Translations**: ${links.join(" | ")}`;
|
|
154
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
2
|
-
import { DO_NOT_TRANSLATE } from "./config";
|
|
3
|
-
|
|
4
|
-
let client: Anthropic | null = null;
|
|
5
|
-
|
|
6
|
-
function getClient(): Anthropic {
|
|
7
|
-
if (!client) {
|
|
8
|
-
client = new Anthropic();
|
|
9
|
-
}
|
|
10
|
-
return client;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const SYSTEM_PROMPT = `You are a professional technical documentation translator. Your task is to translate documentation content precisely and naturally into the target language.
|
|
14
|
-
|
|
15
|
-
## Rules
|
|
16
|
-
|
|
17
|
-
1. **Preserve all code blocks exactly as-is** — never translate content inside backtick-fenced code blocks (\`\`\`...\`\`\`) or inline code (\`...\`).
|
|
18
|
-
2. **Preserve MDX component syntax** — tags like <Card>, <CardGroup>, <CodeGroup>, <Steps>, <Step>, <Note>, <Tip>, <Tabs>, <Tab>, <Warning> must remain unchanged. Their attribute names (title, icon, href, cols) must remain in English. Only translate the text content of the \`title\` attribute and the text body between tags.
|
|
19
|
-
3. **Preserve YAML frontmatter keys** — only translate the string values of \`title\` and \`description\`. Keep the \`icon\` value unchanged.
|
|
20
|
-
4. **Preserve all URLs and paths** — never modify href values, image paths, or links.
|
|
21
|
-
5. **Preserve Markdown structure** — headers (#, ##), lists (-, *), tables (|), bold (**), italic (*), links ([text](url)) must keep their Markdown formatting.
|
|
22
|
-
6. **Preserve badge/shield URLs** — any [](url) pattern must remain completely unchanged.
|
|
23
|
-
|
|
24
|
-
## Do-not-translate list
|
|
25
|
-
|
|
26
|
-
The following terms must NEVER be translated — keep them exactly as-is in the output:
|
|
27
|
-
${DO_NOT_TRANSLATE.map((t) => `- ${t}`).join("\n")}
|
|
28
|
-
|
|
29
|
-
## Translation quality
|
|
30
|
-
|
|
31
|
-
- Use natural, idiomatic phrasing in the target language — do NOT produce word-for-word literal translations.
|
|
32
|
-
- Technical documentation should read as if originally written in the target language by a native-speaking developer.
|
|
33
|
-
- Maintain the same level of formality and tone as the source.
|
|
34
|
-
- For languages that distinguish formal/informal registers, use a professional but approachable tone.
|
|
35
|
-
|
|
36
|
-
## Output
|
|
37
|
-
|
|
38
|
-
Return ONLY the translated content. Do not add explanations, notes, or commentary.`;
|
|
39
|
-
|
|
40
|
-
export async function translateContent(
|
|
41
|
-
content: string,
|
|
42
|
-
targetLang: string,
|
|
43
|
-
targetLangName: string,
|
|
44
|
-
model: string = "claude-sonnet-4-6",
|
|
45
|
-
): Promise<{ translated: string; inputTokens: number; outputTokens: number }> {
|
|
46
|
-
const anthropic = getClient();
|
|
47
|
-
|
|
48
|
-
const response = await anthropic.messages.create({
|
|
49
|
-
model,
|
|
50
|
-
max_tokens: 16384,
|
|
51
|
-
system: [{ type: "text", text: SYSTEM_PROMPT, cache_control: { type: "ephemeral" } }],
|
|
52
|
-
messages: [
|
|
53
|
-
{
|
|
54
|
-
role: "user",
|
|
55
|
-
content: `Translate the following documentation content into ${targetLangName} (${targetLang}).\n\n---\n\n${content}`,
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
const translated =
|
|
61
|
-
response.content[0].type === "text" ? response.content[0].text : "";
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
translated,
|
|
65
|
-
inputTokens: response.usage.input_tokens,
|
|
66
|
-
outputTokens: response.usage.output_tokens,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
export interface LanguageConfig {
|
|
2
|
-
code: string;
|
|
3
|
-
name: string;
|
|
4
|
-
nativeName: string;
|
|
5
|
-
tier: 1 | 2 | 3;
|
|
6
|
-
rtl?: boolean;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface CacheEntry {
|
|
10
|
-
sourceHash: string;
|
|
11
|
-
targetLang: string;
|
|
12
|
-
translatedAt: string;
|
|
13
|
-
inputTokens: number;
|
|
14
|
-
outputTokens: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface TranslationCache {
|
|
18
|
-
sourceHash: string;
|
|
19
|
-
lastUpdated: string;
|
|
20
|
-
translations: Record<string, CacheEntry>;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface TranslateOptions {
|
|
24
|
-
languages: string[];
|
|
25
|
-
tier?: number;
|
|
26
|
-
pagesFilter?: string[];
|
|
27
|
-
readmeOnly?: boolean;
|
|
28
|
-
docsOnly?: boolean;
|
|
29
|
-
dryRun?: boolean;
|
|
30
|
-
force?: boolean;
|
|
31
|
-
updateNav?: boolean;
|
|
32
|
-
validate?: boolean;
|
|
33
|
-
model?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface TranslationResult {
|
|
37
|
-
lang: string;
|
|
38
|
-
sourcePath: string;
|
|
39
|
-
outputPath: string;
|
|
40
|
-
inputTokens: number;
|
|
41
|
-
outputTokens: number;
|
|
42
|
-
cached: boolean;
|
|
43
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { platform } from "node:os";
|
|
3
|
-
import { writeTokens, type AuthTokens } from "./token-store";
|
|
4
|
-
|
|
5
|
-
const DEFAULT_SERVER_URL = process.env.FAILPROOFAI_SERVER_URL ?? "https://api.befailproof.ai";
|
|
6
|
-
const HTTP_TIMEOUT_MS = 10_000;
|
|
7
|
-
|
|
8
|
-
interface DeviceCodeResponse {
|
|
9
|
-
device_code: string;
|
|
10
|
-
user_code: string;
|
|
11
|
-
verification_url: string;
|
|
12
|
-
expires_in: number;
|
|
13
|
-
interval: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface TokenResponse {
|
|
17
|
-
access_token: string;
|
|
18
|
-
refresh_token: string;
|
|
19
|
-
expires_in: number;
|
|
20
|
-
user: { id: string; email: string; name?: string };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function openBrowser(url: string): void {
|
|
24
|
-
const os = platform();
|
|
25
|
-
try {
|
|
26
|
-
if (os === "darwin") {
|
|
27
|
-
spawn("open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
28
|
-
} else if (os === "win32") {
|
|
29
|
-
// On cmd's `start`, the first quoted token is treated as a window
|
|
30
|
-
// title. Pass an empty title so URLs containing "&" or spaces are
|
|
31
|
-
// interpreted as the target, not the title.
|
|
32
|
-
spawn("cmd", ["/c", "start", "", url], { detached: true, stdio: "ignore" }).unref();
|
|
33
|
-
} else {
|
|
34
|
-
spawn("xdg-open", [url], { detached: true, stdio: "ignore" }).unref();
|
|
35
|
-
}
|
|
36
|
-
} catch {
|
|
37
|
-
// Fallback: the URL is already printed above.
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async function postJson<T>(url: string, body: unknown, timeoutMs = HTTP_TIMEOUT_MS): Promise<T> {
|
|
42
|
-
const resp = await fetch(url, {
|
|
43
|
-
method: "POST",
|
|
44
|
-
headers: { "Content-Type": "application/json" },
|
|
45
|
-
body: JSON.stringify(body),
|
|
46
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
47
|
-
});
|
|
48
|
-
if (!resp.ok) {
|
|
49
|
-
throw new Error(`${url} → ${resp.status} ${resp.statusText}`);
|
|
50
|
-
}
|
|
51
|
-
return (await resp.json()) as T;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function login(): Promise<void> {
|
|
55
|
-
const serverUrl = DEFAULT_SERVER_URL;
|
|
56
|
-
|
|
57
|
-
console.log("Requesting device code...");
|
|
58
|
-
const dc = await postJson<DeviceCodeResponse>(`${serverUrl}/api/v1/auth/device-code`, {});
|
|
59
|
-
|
|
60
|
-
console.log(`\n Open this URL in your browser (will be opened automatically):`);
|
|
61
|
-
console.log(` ${dc.verification_url}\n`);
|
|
62
|
-
console.log(` Your code: ${dc.user_code}\n`);
|
|
63
|
-
|
|
64
|
-
openBrowser(dc.verification_url);
|
|
65
|
-
|
|
66
|
-
const deadline = Date.now() + dc.expires_in * 1000;
|
|
67
|
-
const intervalMs = dc.interval * 1000;
|
|
68
|
-
|
|
69
|
-
while (Date.now() < deadline) {
|
|
70
|
-
await new Promise((r) => setTimeout(r, intervalMs));
|
|
71
|
-
try {
|
|
72
|
-
const result = await postJson<TokenResponse | { status: string }>(
|
|
73
|
-
`${serverUrl}/api/v1/auth/device-token`,
|
|
74
|
-
{ device_code: dc.device_code },
|
|
75
|
-
);
|
|
76
|
-
if ("access_token" in result) {
|
|
77
|
-
const tokens: AuthTokens = {
|
|
78
|
-
access_token: result.access_token,
|
|
79
|
-
refresh_token: result.refresh_token,
|
|
80
|
-
expires_at: Math.floor(Date.now() / 1000) + result.expires_in,
|
|
81
|
-
user_email: result.user.email,
|
|
82
|
-
user_id: result.user.id,
|
|
83
|
-
server_url: serverUrl,
|
|
84
|
-
};
|
|
85
|
-
writeTokens(tokens);
|
|
86
|
-
console.log(`Logged in as ${result.user.email}`);
|
|
87
|
-
|
|
88
|
-
// Auto-start relay daemon
|
|
89
|
-
try {
|
|
90
|
-
const { ensureRelayRunning } = await import("../relay/daemon");
|
|
91
|
-
ensureRelayRunning();
|
|
92
|
-
console.log("Relay daemon started.");
|
|
93
|
-
} catch (e) {
|
|
94
|
-
console.warn("Failed to auto-start relay daemon:", e);
|
|
95
|
-
}
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
} catch {
|
|
99
|
-
// Pending or transient error — keep polling
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
throw new Error("Login timed out. Run `failproofai login` again.");
|
|
104
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { readTokens, clearTokens } from "./token-store";
|
|
2
|
-
import { stopRelay } from "../relay/pid";
|
|
3
|
-
|
|
4
|
-
const LOGOUT_TIMEOUT_MS = 3_000;
|
|
5
|
-
|
|
6
|
-
export async function logout(): Promise<void> {
|
|
7
|
-
const tokens = readTokens();
|
|
8
|
-
if (!tokens) {
|
|
9
|
-
console.log("Not logged in.");
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// Best-effort server revoke with a short timeout — the local logout
|
|
14
|
-
// must not block on a slow network.
|
|
15
|
-
try {
|
|
16
|
-
await fetch(`${tokens.server_url}/api/v1/auth/logout`, {
|
|
17
|
-
method: "POST",
|
|
18
|
-
headers: { "Content-Type": "application/json" },
|
|
19
|
-
body: JSON.stringify({ refresh_token: tokens.refresh_token }),
|
|
20
|
-
signal: AbortSignal.timeout(LOGOUT_TIMEOUT_MS),
|
|
21
|
-
});
|
|
22
|
-
} catch {
|
|
23
|
-
// Network or timeout — proceed to local clear anyway
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
stopRelay();
|
|
28
|
-
} catch {
|
|
29
|
-
// Best-effort daemon stop
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
clearTokens();
|
|
33
|
-
console.log("Logged out.");
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function whoami(): void {
|
|
37
|
-
const tokens = readTokens();
|
|
38
|
-
if (!tokens) {
|
|
39
|
-
console.log("Not logged in. Run `failproofai login` to authenticate.");
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
42
|
-
console.log(`Logged in as ${tokens.user_email}`);
|
|
43
|
-
console.log(`Server: ${tokens.server_url}`);
|
|
44
|
-
const expiresIn = tokens.expires_at - Math.floor(Date.now() / 1000);
|
|
45
|
-
if (expiresIn > 0) {
|
|
46
|
-
console.log(`Access token expires in ${Math.floor(expiresIn / 60)} minutes`);
|
|
47
|
-
} else {
|
|
48
|
-
console.log(`Access token expired (will refresh on next use)`);
|
|
49
|
-
}
|
|
50
|
-
}
|