create-ailk 0.1.0
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/LICENSE +201 -0
- package/README.md +39 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/copy.d.ts +8 -0
- package/dist/copy.js +109 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/lib/pro-callout.d.ts +12 -0
- package/dist/lib/pro-callout.js +20 -0
- package/dist/parse-args.d.ts +13 -0
- package/dist/parse-args.js +81 -0
- package/dist/programmatic.d.ts +49 -0
- package/dist/programmatic.js +89 -0
- package/dist/substitute.d.ts +31 -0
- package/dist/substitute.js +45 -0
- package/dist/validate.d.ts +8 -0
- package/dist/validate.js +70 -0
- package/package.json +47 -0
- package/templates/.claude/.gitkeep +0 -0
- package/templates/.claude/agents/web.md +80 -0
- package/templates/.claude/rules/architecture.md +62 -0
- package/templates/.claude/rules/preserve-existing-style.md +51 -0
- package/templates/.claude/skills/README.md +43 -0
- package/templates/.claude/skills/add-schema/SKILL.md +270 -0
- package/templates/.claude/skills/add-schema/references/conflict-handling.md +200 -0
- package/templates/.claude/skills/add-schema/references/file-finding.md +123 -0
- package/templates/.claude/skills/add-schema/references/schema-types.md +131 -0
- package/templates/.claude/skills/audit-site/SKILL.md +213 -0
- package/templates/.claude/skills/audit-site/references/common-errors.md +113 -0
- package/templates/.claude/skills/audit-site/references/findings-glossary.md +138 -0
- package/templates/.claude/skills/audit-site/references/severity-levels.md +114 -0
- package/templates/.claude/skills/provision-config/SKILL.md +243 -0
- package/templates/.claude/skills/provision-config/references/env-vars-template.md +184 -0
- package/templates/.claude/skills/provision-config/references/runbook-template.md +248 -0
- package/templates/.claude/skills/provision-config/references/vercel-json-template.md +98 -0
- package/templates/.claude/skills/scaffold-auth/SKILL.md +261 -0
- package/templates/.claude/skills/scaffold-auth/references/env-vars.md +91 -0
- package/templates/.claude/skills/scaffold-auth/references/oauth-app-setup.md +171 -0
- package/templates/.claude/skills/scaffold-commerce/SKILL.md +310 -0
- package/templates/.claude/skills/scaffold-commerce/references/lookup-keys-template.md +71 -0
- package/templates/.claude/skills/scaffold-commerce/references/marketplace-brand-pages.md +83 -0
- package/templates/.claude/skills/scaffold-commerce/templates/marketplace-cta-route.tsx.tmpl +72 -0
- package/templates/.claude/skills/scaffold-page/SKILL.md +243 -0
- package/templates/.claude/skills/scaffold-page/references/page-types.md +169 -0
- package/templates/.claude/skills/scaffold-page/templates/content.mdx.tmpl +28 -0
- package/templates/.claude/skills/scaffold-page/templates/route.tsx.tmpl +28 -0
- package/templates/.claude/skills/suggest-site-pages/SKILL.md +242 -0
- package/templates/.claude/skills/suggest-site-pages/references/categories.md +287 -0
- package/templates/.env.example +205 -0
- package/templates/.gitkeep +2 -0
- package/templates/CLAUDE.md +142 -0
- package/templates/CONVENTIONS.md +222 -0
- package/templates/README.md +110 -0
- package/templates/apps/api/.env.example +40 -0
- package/templates/apps/api/CLAUDE.md +63 -0
- package/templates/apps/api/api/index.ts +144 -0
- package/templates/apps/api/jest.config.cjs +74 -0
- package/templates/apps/api/package.json +54 -0
- package/templates/apps/api/src/__tests__/factories/content-fixture.ts +138 -0
- package/templates/apps/api/src/__tests__/factories/index.ts +70 -0
- package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +82 -0
- package/templates/apps/api/src/__tests__/index.test.ts +118 -0
- package/templates/apps/api/src/__tests__/server.test.ts +207 -0
- package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +126 -0
- package/templates/apps/api/src/__tests__/setup.ts +24 -0
- package/templates/apps/api/src/cli.ts +30 -0
- package/templates/apps/api/src/config/__tests__/index.test.ts +97 -0
- package/templates/apps/api/src/config/index.ts +56 -0
- package/templates/apps/api/src/index.ts +32 -0
- package/templates/apps/api/src/lib/__mocks__/prisma-client.js +15 -0
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +45 -0
- package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +178 -0
- package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +100 -0
- package/templates/apps/api/src/lib/__tests__/errors.test.ts +94 -0
- package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +144 -0
- package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +8 -0
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +227 -0
- package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +125 -0
- package/templates/apps/api/src/lib/__tests__/prisma.test.ts +165 -0
- package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +129 -0
- package/templates/apps/api/src/lib/__tests__/stripe.test.ts +74 -0
- package/templates/apps/api/src/lib/content-adapter.ts +86 -0
- package/templates/apps/api/src/lib/error-serializer.ts +77 -0
- package/templates/apps/api/src/lib/errors.ts +95 -0
- package/templates/apps/api/src/lib/file-fallback.ts +87 -0
- package/templates/apps/api/src/lib/lead-capture-store.ts +110 -0
- package/templates/apps/api/src/lib/locales.ts +201 -0
- package/templates/apps/api/src/lib/outbound-http.ts +122 -0
- package/templates/apps/api/src/lib/prisma.ts +21 -0
- package/templates/apps/api/src/lib/require-paid-tier.ts +53 -0
- package/templates/apps/api/src/lib/stripe.ts +30 -0
- package/templates/apps/api/src/lib/webhook-idempotency.ts +92 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +111 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +172 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +119 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +138 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +149 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +139 -0
- package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +175 -0
- package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +76 -0
- package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +153 -0
- package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +72 -0
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +292 -0
- package/templates/apps/api/src/middleware/auth.ts +246 -0
- package/templates/apps/api/src/middleware/rate-limit.ts +132 -0
- package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +129 -0
- package/templates/apps/api/src/openapi/index.ts +12 -0
- package/templates/apps/api/src/openapi/spec.ts +408 -0
- package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +193 -0
- package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +201 -0
- package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +294 -0
- package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +486 -0
- package/templates/apps/api/src/routes/auth/tokens.ts +199 -0
- package/templates/apps/api/src/routes/auth/user.ts +244 -0
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +588 -0
- package/templates/apps/api/src/routes/checkout/index.ts +13 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +185 -0
- package/templates/apps/api/src/routes/content/__tests__/create.test.ts +239 -0
- package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +201 -0
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +141 -0
- package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +122 -0
- package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +44 -0
- package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +118 -0
- package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +51 -0
- package/templates/apps/api/src/routes/content/__tests__/update.test.ts +252 -0
- package/templates/apps/api/src/routes/content/create.ts +114 -0
- package/templates/apps/api/src/routes/content/delete.ts +81 -0
- package/templates/apps/api/src/routes/content/get-page.ts +98 -0
- package/templates/apps/api/src/routes/content/index.ts +32 -0
- package/templates/apps/api/src/routes/content/list-pages.ts +83 -0
- package/templates/apps/api/src/routes/content/list-types.ts +19 -0
- package/templates/apps/api/src/routes/content/rate-limit.ts +13 -0
- package/templates/apps/api/src/routes/content/slug.ts +9 -0
- package/templates/apps/api/src/routes/content/update.ts +111 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +415 -0
- package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +165 -0
- package/templates/apps/api/src/routes/leads/index.ts +130 -0
- package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +296 -0
- package/templates/apps/api/src/routes/test/auth/session.ts +141 -0
- package/templates/apps/api/src/routes/webhooks/README.md +57 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +247 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +198 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +633 -0
- package/templates/apps/api/src/routes/webhooks/index.ts +41 -0
- package/templates/apps/api/src/routes/webhooks/stripe.ts +253 -0
- package/templates/apps/api/src/server.ts +157 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +395 -0
- package/templates/apps/api/src/services/enrichment-shim.ts +53 -0
- package/templates/apps/api/src/services/lead-routing.ts +338 -0
- package/templates/apps/api/tsconfig.json +34 -0
- package/templates/apps/api/vercel.json +17 -0
- package/templates/apps/mcp/.env.example +52 -0
- package/templates/apps/mcp/CLAUDE.md +84 -0
- package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +52 -0
- package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +46 -0
- package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +36 -0
- package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +54 -0
- package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +110 -0
- package/templates/apps/mcp/__tests__/audit-single-page.test.ts +213 -0
- package/templates/apps/mcp/__tests__/audit.test.ts +217 -0
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +52 -0
- package/templates/apps/mcp/__tests__/create_page.test.ts +201 -0
- package/templates/apps/mcp/__tests__/delete_page.test.ts +176 -0
- package/templates/apps/mcp/__tests__/get_business_hours.test.ts +82 -0
- package/templates/apps/mcp/__tests__/get_faq.test.ts +80 -0
- package/templates/apps/mcp/__tests__/get_locations.test.ts +65 -0
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +90 -0
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +80 -0
- package/templates/apps/mcp/__tests__/get_site_info.test.ts +81 -0
- package/templates/apps/mcp/__tests__/http-transport.test.ts +323 -0
- package/templates/apps/mcp/__tests__/lib/errors.test.ts +75 -0
- package/templates/apps/mcp/__tests__/lib/require-paid-tier.test.ts +75 -0
- package/templates/apps/mcp/__tests__/list_pages.test.ts +112 -0
- package/templates/apps/mcp/__tests__/locale.test.ts +135 -0
- package/templates/apps/mcp/__tests__/parity.test.ts +205 -0
- package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +34 -0
- package/templates/apps/mcp/__tests__/read_content.test.ts +153 -0
- package/templates/apps/mcp/__tests__/request_callback.test.ts +163 -0
- package/templates/apps/mcp/__tests__/search_content.test.ts +153 -0
- package/templates/apps/mcp/__tests__/server.test.ts +115 -0
- package/templates/apps/mcp/__tests__/submit_lead.test.ts +165 -0
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +161 -0
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +227 -0
- package/templates/apps/mcp/__tests__/tools/scaffold.test.ts +237 -0
- package/templates/apps/mcp/__tests__/update_page.test.ts +195 -0
- package/templates/apps/mcp/jest.config.cjs +82 -0
- package/templates/apps/mcp/package.json +37 -0
- package/templates/apps/mcp/src/abuse/daily-cap.ts +47 -0
- package/templates/apps/mcp/src/abuse/email-validator.ts +25 -0
- package/templates/apps/mcp/src/abuse/honeypot.ts +21 -0
- package/templates/apps/mcp/src/abuse/index.ts +111 -0
- package/templates/apps/mcp/src/abuse/user-agent-deny.ts +58 -0
- package/templates/apps/mcp/src/http-transport.ts +303 -0
- package/templates/apps/mcp/src/index.ts +67 -0
- package/templates/apps/mcp/src/lib/audit-single-page.ts +194 -0
- package/templates/apps/mcp/src/lib/errors.ts +61 -0
- package/templates/apps/mcp/src/lib/locales.ts +171 -0
- package/templates/apps/mcp/src/lib/require-paid-tier.ts +44 -0
- package/templates/apps/mcp/src/lib/resolve-locale.ts +30 -0
- package/templates/apps/mcp/src/server.ts +139 -0
- package/templates/apps/mcp/src/tools/audit.ts +103 -0
- package/templates/apps/mcp/src/tools/capture_lead.ts +52 -0
- package/templates/apps/mcp/src/tools/create_page.ts +95 -0
- package/templates/apps/mcp/src/tools/delete_page.ts +73 -0
- package/templates/apps/mcp/src/tools/get_business_hours.ts +66 -0
- package/templates/apps/mcp/src/tools/get_faq.ts +69 -0
- package/templates/apps/mcp/src/tools/get_locations.ts +85 -0
- package/templates/apps/mcp/src/tools/get_offerings.ts +66 -0
- package/templates/apps/mcp/src/tools/get_pricing.ts +74 -0
- package/templates/apps/mcp/src/tools/get_site_info.ts +84 -0
- package/templates/apps/mcp/src/tools/index.ts +125 -0
- package/templates/apps/mcp/src/tools/list_pages.ts +72 -0
- package/templates/apps/mcp/src/tools/purchase.ts +89 -0
- package/templates/apps/mcp/src/tools/read_content.ts +61 -0
- package/templates/apps/mcp/src/tools/request_callback.ts +51 -0
- package/templates/apps/mcp/src/tools/scaffold.ts +119 -0
- package/templates/apps/mcp/src/tools/search_content.ts +59 -0
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +47 -0
- package/templates/apps/mcp/src/tools/update_page.ts +91 -0
- package/templates/apps/mcp/tsconfig.json +19 -0
- package/templates/apps/web/.env.example +47 -0
- package/templates/apps/web/CLAUDE.md +81 -0
- package/templates/apps/web/__tests__/auth/adversarial/cookie-attributes.test.ts +94 -0
- package/templates/apps/web/__tests__/auth/adversarial/oauth-state-parameter.test.ts +75 -0
- package/templates/apps/web/__tests__/auth/adversarial/redirect-uri-allowlist.test.ts +82 -0
- package/templates/apps/web/__tests__/auth/env-helpers.test.ts +168 -0
- package/templates/apps/web/__tests__/authority-list-routes.test.tsx +208 -0
- package/templates/apps/web/__tests__/better-stack.test.ts +66 -0
- package/templates/apps/web/__tests__/blog-dir-resolution.test.ts +87 -0
- package/templates/apps/web/__tests__/blog-source-populated.test.ts +130 -0
- package/templates/apps/web/__tests__/data-testid-coverage.test.tsx +60 -0
- package/templates/apps/web/__tests__/google-analytics.test.tsx +104 -0
- package/templates/apps/web/__tests__/i18n/middleware.test.ts +119 -0
- package/templates/apps/web/__tests__/i18n/routing.test.ts +114 -0
- package/templates/apps/web/__tests__/i18n/translations.test.ts +191 -0
- package/templates/apps/web/__tests__/json-ld.test.ts +98 -0
- package/templates/apps/web/__tests__/knowledge-events-routes.test.tsx +580 -0
- package/templates/apps/web/__tests__/layout-stealth.test.ts +39 -0
- package/templates/apps/web/__tests__/lighthouse-fixtures/improvement-image-shrink.tsx +103 -0
- package/templates/apps/web/__tests__/lighthouse-fixtures/override-fixture.md +114 -0
- package/templates/apps/web/__tests__/lighthouse-fixtures/regression-bloat.tsx +94 -0
- package/templates/apps/web/__tests__/page.test.tsx +230 -0
- package/templates/apps/web/__tests__/products-services-phase1.test.tsx +321 -0
- package/templates/apps/web/__tests__/projects-routes.test.tsx +392 -0
- package/templates/apps/web/__tests__/resources-downloads-integrations-phase2.test.tsx +475 -0
- package/templates/apps/web/__tests__/routes/ai-plugin-json.test.ts +53 -0
- package/templates/apps/web/__tests__/routes/blog-route.test.tsx +191 -0
- package/templates/apps/web/__tests__/routes/llms-txt.test.ts +123 -0
- package/templates/apps/web/__tests__/routes/robots-txt.test.ts +52 -0
- package/templates/apps/web/__tests__/routes/sitemap-xml.test.ts +78 -0
- package/templates/apps/web/__tests__/routes/well-known-mcp.test.ts +203 -0
- package/templates/apps/web/__tests__/section-routes.test.tsx +693 -0
- package/templates/apps/web/__tests__/security-headers.test.ts +201 -0
- package/templates/apps/web/__tests__/sentry-config.test.ts +116 -0
- package/templates/apps/web/__tests__/setup.ts +82 -0
- package/templates/apps/web/__tests__/sitemap-locales.test.ts +415 -0
- package/templates/apps/web/__tests__/standalone-informational-routes.test.tsx +844 -0
- package/templates/apps/web/app/.well-known/ai-plugin.json/route.ts +81 -0
- package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +110 -0
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +58 -0
- package/templates/apps/web/app/[locale]/__tests__/layout.test.tsx +120 -0
- package/templates/apps/web/app/[locale]/__tests__/page-renderer-migration.test.tsx +202 -0
- package/templates/apps/web/app/[locale]/about/page.tsx +31 -0
- package/templates/apps/web/app/[locale]/blog/[[...slug]]/page.tsx +173 -0
- package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +45 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +117 -0
- package/templates/apps/web/app/[locale]/careers/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/case-studies/[slug]/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +113 -0
- package/templates/apps/web/app/[locale]/case-studies/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +63 -0
- package/templates/apps/web/app/[locale]/clients/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +130 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +152 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +92 -0
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +79 -0
- package/templates/apps/web/app/[locale]/contact/error.tsx +24 -0
- package/templates/apps/web/app/[locale]/contact/page.tsx +38 -0
- package/templates/apps/web/app/[locale]/courses/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +119 -0
- package/templates/apps/web/app/[locale]/courses/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/dev/purchase/__tests__/actions.test.ts +160 -0
- package/templates/apps/web/app/[locale]/dev/purchase/error.tsx +25 -0
- package/templates/apps/web/app/[locale]/dev/purchase/page.tsx +117 -0
- package/templates/apps/web/app/[locale]/dev/purchase/purchase.actions.ts +58 -0
- package/templates/apps/web/app/[locale]/docs/[[...slug]]/page.tsx +118 -0
- package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +72 -0
- package/templates/apps/web/app/[locale]/downloads/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +47 -0
- package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +130 -0
- package/templates/apps/web/app/[locale]/events/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/faq/page.tsx +36 -0
- package/templates/apps/web/app/[locale]/how-to/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +78 -0
- package/templates/apps/web/app/[locale]/how-to/page.tsx +40 -0
- package/templates/apps/web/app/[locale]/integrations/[slug]/page.tsx +43 -0
- package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +129 -0
- package/templates/apps/web/app/[locale]/integrations/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/launch-service/page.tsx +31 -0
- package/templates/apps/web/app/[locale]/layout.tsx +241 -0
- package/templates/apps/web/app/[locale]/page.tsx +41 -0
- package/templates/apps/web/app/[locale]/partners/[slug]/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +113 -0
- package/templates/apps/web/app/[locale]/partners/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/products/[slug]/page.tsx +43 -0
- package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +129 -0
- package/templates/apps/web/app/[locale]/products/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/projects/[slug]/page.tsx +39 -0
- package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +138 -0
- package/templates/apps/web/app/[locale]/projects/page.tsx +30 -0
- package/templates/apps/web/app/[locale]/resources/[slug]/page.tsx +51 -0
- package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +117 -0
- package/templates/apps/web/app/[locale]/resources/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/services/[slug]/page.tsx +43 -0
- package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +129 -0
- package/templates/apps/web/app/[locale]/services/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +81 -0
- package/templates/apps/web/app/[locale]/software/page.tsx +39 -0
- package/templates/apps/web/app/[locale]/tech-articles/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +82 -0
- package/templates/apps/web/app/[locale]/tech-articles/page.tsx +39 -0
- package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +63 -0
- package/templates/apps/web/app/[locale]/testimonials/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +63 -0
- package/templates/apps/web/app/[locale]/use-cases/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/whitepapers/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +82 -0
- package/templates/apps/web/app/[locale]/whitepapers/page.tsx +39 -0
- package/templates/apps/web/app/__tests__/error-boundaries.test.tsx +152 -0
- package/templates/apps/web/app/api/auth/[...all]/route.ts +16 -0
- package/templates/apps/web/app/error-fallback.tsx +75 -0
- package/templates/apps/web/app/error.tsx +23 -0
- package/templates/apps/web/app/layout.tsx +18 -0
- package/templates/apps/web/app/llms.txt/route.ts +101 -0
- package/templates/apps/web/app/not-found.tsx +48 -0
- package/templates/apps/web/app/og/__tests__/route.test.ts +164 -0
- package/templates/apps/web/app/og/route.tsx +135 -0
- package/templates/apps/web/app/robots.txt/route.ts +36 -0
- package/templates/apps/web/app/sitemap.xml/route.ts +146 -0
- package/templates/apps/web/auth.ts +141 -0
- package/templates/apps/web/components/ThemeToggle.tsx +60 -0
- package/templates/apps/web/components/google-analytics.tsx +34 -0
- package/templates/apps/web/content/en/blog/index.mdx +15 -0
- package/templates/apps/web/content/en/blog/launching-ailk.mdx +20 -0
- package/templates/apps/web/content/en/docs/getting-started.mdx +30 -0
- package/templates/apps/web/i18n/request.ts +36 -0
- package/templates/apps/web/jest.config.cjs +100 -0
- package/templates/apps/web/lib/__mocks__/next-mdx-remote-rsc.js +12 -0
- package/templates/apps/web/lib/__mocks__/source-server.js +31 -0
- package/templates/apps/web/lib/__tests__/og.test.ts +65 -0
- package/templates/apps/web/lib/auth-env.ts +66 -0
- package/templates/apps/web/lib/blog-list-data.ts +95 -0
- package/templates/apps/web/lib/blog-post-data.ts +79 -0
- package/templates/apps/web/lib/nav-config.ts +13 -0
- package/templates/apps/web/lib/observability/better-stack.ts +27 -0
- package/templates/apps/web/lib/og.ts +23 -0
- package/templates/apps/web/lib/prisma-for-auth.ts +34 -0
- package/templates/apps/web/lib/source.ts +34 -0
- package/templates/apps/web/messages/en.json +131 -0
- package/templates/apps/web/middleware.ts +80 -0
- package/templates/apps/web/next.config.mjs +167 -0
- package/templates/apps/web/package.json +62 -0
- package/templates/apps/web/public/.well-known/security.txt +17 -0
- package/templates/apps/web/public/android-chrome-192x192.png +0 -0
- package/templates/apps/web/public/android-chrome-512x512.png +0 -0
- package/templates/apps/web/public/apple-touch-icon.png +0 -0
- package/templates/apps/web/public/favicon-16x16.png +0 -0
- package/templates/apps/web/public/favicon-32x32.png +0 -0
- package/templates/apps/web/public/favicon.ico +0 -0
- package/templates/apps/web/public/favicon.svg +4 -0
- package/templates/apps/web/public/logo-dark.svg +21 -0
- package/templates/apps/web/public/logo-light.svg +21 -0
- package/templates/apps/web/public/logomark-dark.svg +4 -0
- package/templates/apps/web/public/logomark-light.svg +4 -0
- package/templates/apps/web/public/og-default.png +0 -0
- package/templates/apps/web/public/site.webmanifest +19 -0
- package/templates/apps/web/scripts/assert-content-bundled.ts +55 -0
- package/templates/apps/web/security-headers.config.ts +132 -0
- package/templates/apps/web/sentry.client.config.ts +27 -0
- package/templates/apps/web/sentry.edge.config.ts +15 -0
- package/templates/apps/web/sentry.server.config.ts +20 -0
- package/templates/apps/web/source.config.ts +78 -0
- package/templates/apps/web/src/components/SiteNav.tsx +21 -0
- package/templates/apps/web/src/lib/routes.ts +37 -0
- package/templates/apps/web/tsconfig.json +35 -0
- package/templates/apps/web/types/messages.d.ts +19 -0
- package/templates/content/.gitkeep +0 -0
- package/templates/content/CLAUDE.md +85 -0
- package/templates/content/_site.mdx +38 -0
- package/templates/content/ar/HomePage/home.mdx +123 -0
- package/templates/content/ar/_site.mdx +35 -0
- package/templates/content/de/_site.mdx +29 -0
- package/templates/content/en/.gitkeep +0 -0
- package/templates/content/en/AboutPage/about.mdx +19 -0
- package/templates/content/en/AboutPage/about.schema.json +82 -0
- package/templates/content/en/BookCall/book-call.mdx +19 -0
- package/templates/content/en/BookCall/book-call.schema.json +121 -0
- package/templates/content/en/BreadcrumbList/site-breadcrumbs.mdx +20 -0
- package/templates/content/en/CareersList/careers.mdx +24 -0
- package/templates/content/en/CaseStudiesList/case-studies.mdx +22 -0
- package/templates/content/en/CaseStudiesList/showcase.mdx +8 -0
- package/templates/content/en/CaseStudy/ailk-aeo-rollout.mdx +32 -0
- package/templates/content/en/CaseStudy/schema-builder-migration.mdx +41 -0
- package/templates/content/en/ClientsList/clients.mdx +38 -0
- package/templates/content/en/ContactPage/contact.mdx +19 -0
- package/templates/content/en/ContactPage/contact.schema.json +100 -0
- package/templates/content/en/ContactPoint/primary.mdx +14 -0
- package/templates/content/en/Course/aeo-fundamentals.mdx +37 -0
- package/templates/content/en/Course/schema-builder-workshop.mdx +62 -0
- package/templates/content/en/CoursesList/courses.mdx +22 -0
- package/templates/content/en/DownloadsList/downloads.mdx +22 -0
- package/templates/content/en/Event/aeo-office-hours-may-2026.mdx +39 -0
- package/templates/content/en/Event/ailk-launch-day-2026.mdx +35 -0
- package/templates/content/en/EventsList/events.mdx +26 -0
- package/templates/content/en/FAQPage/faq.mdx +420 -0
- package/templates/content/en/FAQPage/faq.schema.json +231 -0
- package/templates/content/en/GlossaryList/glossary.mdx +19 -0
- package/templates/content/en/GlossaryList/glossary.schema.json +300 -0
- package/templates/content/en/HomePage/home.mdx +312 -0
- package/templates/content/en/HomePage/home.schema.json +88 -0
- package/templates/content/en/HomePage/launch-service.mdx +475 -0
- package/templates/content/en/HomePage/launch-service.schema.json +138 -0
- package/templates/content/en/HowTo/add-mdx-content.mdx +38 -0
- package/templates/content/en/HowTo/configure-aeo-scoring.mdx +35 -0
- package/templates/content/en/HowTo/set-up-json-ld.mdx +36 -0
- package/templates/content/en/Integration/github-actions.mdx +31 -0
- package/templates/content/en/Integration/openai-api.mdx +26 -0
- package/templates/content/en/Integration/vercel.mdx +32 -0
- package/templates/content/en/IntegrationsList/integrations.mdx +22 -0
- package/templates/content/en/JobPosting/content-strategist.mdx +46 -0
- package/templates/content/en/JobPosting/developer-advocate.mdx +47 -0
- package/templates/content/en/JobPosting/senior-fullstack-engineer.mdx +57 -0
- package/templates/content/en/LandingPage/aeo-audit.mdx +19 -0
- package/templates/content/en/LandingPage/aeo-audit.schema.json +92 -0
- package/templates/content/en/LandingPage/agency-waitlist.mdx +340 -0
- package/templates/content/en/LandingPage/agency-waitlist.schema.json +152 -0
- package/templates/content/en/LandingPage/developers.mdx +19 -0
- package/templates/content/en/LandingPage/developers.schema.json +109 -0
- package/templates/content/en/LandingPage/for-agencies.mdx +390 -0
- package/templates/content/en/LandingPage/for-agencies.schema.json +107 -0
- package/templates/content/en/LandingPage/for-ai-search-agencies.mdx +417 -0
- package/templates/content/en/LandingPage/for-ai-search-agencies.schema.json +105 -0
- package/templates/content/en/LandingPage/for-businesses.mdx +19 -0
- package/templates/content/en/LandingPage/for-businesses.schema.json +96 -0
- package/templates/content/en/LandingPage/platform.mdx +369 -0
- package/templates/content/en/LandingPage/platform.schema.json +166 -0
- package/templates/content/en/LandingPage/vs-ai-website-builders.mdx +19 -0
- package/templates/content/en/LandingPage/vs-ai-website-builders.schema.json +102 -0
- package/templates/content/en/LandingPage/vs-wordpress.mdx +19 -0
- package/templates/content/en/LandingPage/vs-wordpress.schema.json +53 -0
- package/templates/content/en/NewsletterSignup/newsletter.mdx +236 -0
- package/templates/content/en/NewsletterSignup/newsletter.schema.json +91 -0
- package/templates/content/en/Organization/site-owner.mdx +16 -0
- package/templates/content/en/Partner/prisma.mdx +31 -0
- package/templates/content/en/Partner/supabase.mdx +30 -0
- package/templates/content/en/Partner/vercel.mdx +28 -0
- package/templates/content/en/PartnersList/partners.mdx +22 -0
- package/templates/content/en/Person/founder.mdx +18 -0
- package/templates/content/en/Pricing/pricing.mdx +538 -0
- package/templates/content/en/Pricing/pricing.schema.json +209 -0
- package/templates/content/en/PrivacyPage/privacy.mdx +165 -0
- package/templates/content/en/PrivacyPage/privacy.schema.json +64 -0
- package/templates/content/en/Product/ailk.mdx +19 -0
- package/templates/content/en/Product/ailk.schema.json +94 -0
- package/templates/content/en/Product/api-launch-kit.mdx +26 -0
- package/templates/content/en/Product/launch-kit.mdx +28 -0
- package/templates/content/en/ProductsList/products.mdx +26 -0
- package/templates/content/en/Project/ailk-phase-2.mdx +54 -0
- package/templates/content/en/ProjectsList/projects.mdx +25 -0
- package/templates/content/en/ResourceDetail/aeo-scoring-guide.mdx +27 -0
- package/templates/content/en/ResourceDetail/content-model-whitepaper.mdx +28 -0
- package/templates/content/en/ResourceDetail/schema-org-quick-reference.mdx +39 -0
- package/templates/content/en/ResourcesHub/resources.mdx +22 -0
- package/templates/content/en/Service/consulting.mdx +22 -0
- package/templates/content/en/Service/implementation.mdx +30 -0
- package/templates/content/en/Service/launch-service.mdx +232 -0
- package/templates/content/en/Service/launch.mdx +228 -0
- package/templates/content/en/ServicesList/services.mdx +84 -0
- package/templates/content/en/SoftwareProduct/ailk-aeo.mdx +44 -0
- package/templates/content/en/SoftwareProduct/ailk-content-adapters.mdx +47 -0
- package/templates/content/en/SoftwareProduct/ailk-schema.mdx +49 -0
- package/templates/content/en/TeamList/team.mdx +63 -0
- package/templates/content/en/TeamMember/founder.mdx +72 -0
- package/templates/content/en/TermsPage/terms.mdx +19 -0
- package/templates/content/en/TermsPage/terms.schema.json +99 -0
- package/templates/content/en/TestimonialsList/testimonials.mdx +44 -0
- package/templates/content/en/UseCasesList/use-cases.mdx +30 -0
- package/templates/content/en/Whitepaper/ax-first-product-development.mdx +27 -0
- package/templates/content/en/Whitepaper/open-core-commercial-strategy.mdx +27 -0
- package/templates/content/en/Whitepaper/structured-data-for-answer-engines.mdx +31 -0
- package/templates/content/en-XA/AboutPage/about.mdx +8 -0
- package/templates/content/en-XA/FAQPage/faq.mdx +8 -0
- package/templates/content/en-XA/HomePage/home.mdx +8 -0
- package/templates/content/es/_site.mdx +30 -0
- package/templates/content/fr/_site.mdx +30 -0
- package/templates/content/ja/_site.mdx +30 -0
- package/templates/content/pt-BR/AboutPage/about.mdx +8 -0
- package/templates/content/pt-BR/FAQPage/faq.mdx +8 -0
- package/templates/content/pt-BR/HomePage/home.mdx +23 -0
- package/templates/database/CHANGELOG.md +5 -0
- package/templates/database/README.md +234 -0
- package/templates/database/__tests__/user-cascade.test.ts +125 -0
- package/templates/database/auth/.gitkeep +0 -0
- package/templates/database/config/.gitkeep +0 -0
- package/templates/database/content/.gitkeep +0 -0
- package/templates/database/inbox/.gitkeep +0 -0
- package/templates/database/inbox/README.md +3 -0
- package/templates/database/inbox/__tests__/schema.test.ts +40 -0
- package/templates/database/inbox/schema.prisma +52 -0
- package/templates/database/jest.config.cjs +29 -0
- package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +328 -0
- package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +100 -0
- package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +28 -0
- package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +25 -0
- package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +42 -0
- package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +67 -0
- package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +21 -0
- package/templates/database/migrations/migration_lock.toml +3 -0
- package/templates/database/ops/.gitkeep +0 -0
- package/templates/database/package.json +45 -0
- package/templates/database/prisma.config.ts +20 -0
- package/templates/database/schema.prisma +487 -0
- package/templates/database/scripts/db-generate-locked.sh +80 -0
- package/templates/database/seed-test.ts +85 -0
- package/templates/database/tsconfig.build.json +16 -0
- package/templates/database/tsconfig.json +9 -0
- package/templates/package.json +125 -0
- package/templates/pnpm-workspace.yaml +6 -0
- package/templates/project.yaml +59 -0
- package/templates/tsconfig.base.json +18 -0
- package/templates/tsconfig.json +45 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* delete_page — Paid-tier MCP tool for removing a content page.
|
|
3
|
+
*
|
|
4
|
+
* D14a Stage 1 Unit C — wires McpServer delete_page to ContentAdapter.deletePage.
|
|
5
|
+
* Mandatory optimistic locking: caller supplies `ifMatch`; stale or missing
|
|
6
|
+
* tokens yield canonical conflict bodies.
|
|
7
|
+
*
|
|
8
|
+
* Success body is `{ ok: true }` per the Stage 0 catalog `deletePageOutputSchema`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
SCHEMA_ORG_TYPES,
|
|
15
|
+
SLUG_PATTERN,
|
|
16
|
+
createMdxAdapter,
|
|
17
|
+
mapAdapterError,
|
|
18
|
+
type ContentAdapter,
|
|
19
|
+
} from "@working-theory/content-adapters";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
|
|
22
|
+
import { validationError, type ErrorBody } from "../lib/errors.js";
|
|
23
|
+
import { requirePaidTier } from "../lib/require-paid-tier.js";
|
|
24
|
+
|
|
25
|
+
const DeletePageInputSchema = z.object({
|
|
26
|
+
type: z.enum(SCHEMA_ORG_TYPES),
|
|
27
|
+
// Defence-in-depth slug allowlist matches create_page / update_page;
|
|
28
|
+
// the adapter also enforces the pattern, but a fail-fast validation_failed
|
|
29
|
+
// here keeps the tool's surface contract consistent (issue #398).
|
|
30
|
+
slug: z.string().regex(SLUG_PATTERN),
|
|
31
|
+
ifMatch: z.string().min(1),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
interface DeletePageSuccess {
|
|
35
|
+
ok: true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type DeletePageResult = DeletePageSuccess | ErrorBody;
|
|
39
|
+
|
|
40
|
+
export interface DeletePageInput {
|
|
41
|
+
type: string;
|
|
42
|
+
slug: string;
|
|
43
|
+
ifMatch: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function ailkDeletePage(
|
|
47
|
+
input: DeletePageInput,
|
|
48
|
+
adapter?: ContentAdapter,
|
|
49
|
+
): Promise<DeletePageResult> {
|
|
50
|
+
const guard = await requirePaidTier();
|
|
51
|
+
if (guard) return guard;
|
|
52
|
+
|
|
53
|
+
const parsed = DeletePageInputSchema.safeParse(input);
|
|
54
|
+
if (!parsed.success) {
|
|
55
|
+
return validationError("Invalid input for delete_page.", {
|
|
56
|
+
issues: parsed.error.issues,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const { type, slug, ifMatch } = parsed.data;
|
|
61
|
+
const resolved =
|
|
62
|
+
adapter ??
|
|
63
|
+
createMdxAdapter({ contentRoot: join(process.cwd(), "content") });
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
await resolved.deletePage(type, slug, { ifMatch });
|
|
67
|
+
return { ok: true };
|
|
68
|
+
} catch (err) {
|
|
69
|
+
const mapped = mapAdapterError(err, { type, slug });
|
|
70
|
+
if (mapped) return mapped;
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_business_hours — returns business hours from LocalBusiness structured data.
|
|
3
|
+
*
|
|
4
|
+
* Pure read: imports the MDX adapter from @working-theory/content-adapters (ADR 0011).
|
|
5
|
+
* Resolves a page by slug (default: "home") and extracts LocalBusiness schema.
|
|
6
|
+
* Returns null when the page is not found or has no openingHoursSpecification.
|
|
7
|
+
*
|
|
8
|
+
* Phase 3 S3: optional `locale` parameter (BCP-47). Validated against the
|
|
9
|
+
* project's allowlist; invalid or unknown values silently fall back to the
|
|
10
|
+
* default locale (AC-i18n-07).
|
|
11
|
+
*
|
|
12
|
+
* Input: { slug?: string, locale?: string }
|
|
13
|
+
* Output: Array<{ dayOfWeek, opens, closes, validFrom?, validThrough? }> | null
|
|
14
|
+
* Session/scope: none — read-only public content.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
import { createMdxAdapter } from "@working-theory/content-adapters";
|
|
20
|
+
import {
|
|
21
|
+
getBusinessHoursInputSchema,
|
|
22
|
+
getBusinessHoursOutputSchema,
|
|
23
|
+
type GetBusinessHoursInput,
|
|
24
|
+
type GetBusinessHoursOutput,
|
|
25
|
+
} from "@working-theory/validation";
|
|
26
|
+
|
|
27
|
+
import { resolveLocale } from "../lib/resolve-locale.js";
|
|
28
|
+
|
|
29
|
+
export { getBusinessHoursInputSchema, getBusinessHoursOutputSchema };
|
|
30
|
+
export type { GetBusinessHoursInput, GetBusinessHoursOutput };
|
|
31
|
+
|
|
32
|
+
const DEFAULT_SLUG = "home";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* get_business_hours handler.
|
|
36
|
+
*
|
|
37
|
+
* Accepts an optional `contentRoot` override for testing. When omitted,
|
|
38
|
+
* resolves the content root relative to cwd (supports ESM runtime).
|
|
39
|
+
*/
|
|
40
|
+
export async function ailkGetBusinessHours(
|
|
41
|
+
input: GetBusinessHoursInput,
|
|
42
|
+
contentRoot?: string,
|
|
43
|
+
): Promise<GetBusinessHoursOutput> {
|
|
44
|
+
getBusinessHoursInputSchema.parse(input);
|
|
45
|
+
|
|
46
|
+
const root = contentRoot ?? join(process.cwd(), "content");
|
|
47
|
+
const locale = resolveLocale(input.locale);
|
|
48
|
+
const adapter = createMdxAdapter({ contentRoot: root, defaultLocale: locale });
|
|
49
|
+
|
|
50
|
+
const slug = input.slug ?? DEFAULT_SLUG;
|
|
51
|
+
const data = await adapter.extractStructuredData("LocalBusiness", slug, locale);
|
|
52
|
+
if (!data) return null;
|
|
53
|
+
|
|
54
|
+
const hours = data.openingHoursSpecification;
|
|
55
|
+
if (!Array.isArray(hours) || hours.length === 0) return null;
|
|
56
|
+
|
|
57
|
+
return getBusinessHoursOutputSchema.parse(
|
|
58
|
+
(hours as Record<string, unknown>[]).map((h) => ({
|
|
59
|
+
dayOfWeek: h["dayOfWeek"] as string,
|
|
60
|
+
opens: h["opens"] as string,
|
|
61
|
+
closes: h["closes"] as string,
|
|
62
|
+
validFrom: h["validFrom"] as string | undefined,
|
|
63
|
+
validThrough: h["validThrough"] as string | undefined,
|
|
64
|
+
})),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_faq — returns FAQ question/answer pairs from FAQPage structured data.
|
|
3
|
+
*
|
|
4
|
+
* Pure read: imports the MDX adapter from @working-theory/content-adapters (ADR 0011).
|
|
5
|
+
* Resolves a page by slug (default: "faq") and extracts FAQPage schema.
|
|
6
|
+
* Returns null when the page is not found or has no mainEntity questions.
|
|
7
|
+
*
|
|
8
|
+
* Phase 3 S3: optional `locale` parameter (BCP-47). Validated against the
|
|
9
|
+
* project's allowlist; invalid or unknown values silently fall back to the
|
|
10
|
+
* default locale (AC-i18n-07).
|
|
11
|
+
*
|
|
12
|
+
* Input: { slug?: string, locale?: string }
|
|
13
|
+
* Output: { questions: Array<{ question, answer }> } | null
|
|
14
|
+
* Session/scope: none — read-only public content.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
import { createMdxAdapter } from "@working-theory/content-adapters";
|
|
20
|
+
import {
|
|
21
|
+
getFaqInputSchema,
|
|
22
|
+
getFaqOutputSchema,
|
|
23
|
+
type GetFaqInput,
|
|
24
|
+
type GetFaqOutput,
|
|
25
|
+
} from "@working-theory/validation";
|
|
26
|
+
|
|
27
|
+
import { resolveLocale } from "../lib/resolve-locale.js";
|
|
28
|
+
|
|
29
|
+
export { getFaqInputSchema, getFaqOutputSchema };
|
|
30
|
+
export type { GetFaqInput, GetFaqOutput };
|
|
31
|
+
|
|
32
|
+
const DEFAULT_SLUG = "faq";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* get_faq handler.
|
|
36
|
+
*
|
|
37
|
+
* Accepts an optional `contentRoot` override for testing. When omitted,
|
|
38
|
+
* resolves the content root relative to cwd (supports ESM runtime).
|
|
39
|
+
*/
|
|
40
|
+
export async function ailkGetFaq(
|
|
41
|
+
input: GetFaqInput,
|
|
42
|
+
contentRoot?: string,
|
|
43
|
+
): Promise<GetFaqOutput> {
|
|
44
|
+
getFaqInputSchema.parse(input);
|
|
45
|
+
|
|
46
|
+
const root = contentRoot ?? join(process.cwd(), "content");
|
|
47
|
+
const locale = resolveLocale(input.locale);
|
|
48
|
+
const adapter = createMdxAdapter({ contentRoot: root, defaultLocale: locale });
|
|
49
|
+
|
|
50
|
+
const slug = input.slug ?? DEFAULT_SLUG;
|
|
51
|
+
const data = await adapter.extractStructuredData("FAQPage", slug, locale);
|
|
52
|
+
if (!data) return null;
|
|
53
|
+
|
|
54
|
+
const entities = data.mainEntity;
|
|
55
|
+
if (!Array.isArray(entities) || entities.length === 0) return null;
|
|
56
|
+
|
|
57
|
+
const questions = (entities as Record<string, unknown>[]).map((item) => ({
|
|
58
|
+
question: (item["name"] as string) ?? "",
|
|
59
|
+
answer:
|
|
60
|
+
typeof item["acceptedAnswer"] === "object" &&
|
|
61
|
+
item["acceptedAnswer"] !== null
|
|
62
|
+
? (((item["acceptedAnswer"] as Record<string, unknown>)[
|
|
63
|
+
"text"
|
|
64
|
+
] as string) ?? "")
|
|
65
|
+
: ((item["acceptedAnswer"] as string) ?? ""),
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
return getFaqOutputSchema.parse({ questions });
|
|
69
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_locations — returns all Place locations from structured data site-wide.
|
|
3
|
+
*
|
|
4
|
+
* Pure read: imports the MDX adapter from @working-theory/content-adapters (ADR 0011).
|
|
5
|
+
* Lists all pages of type "Place" and extracts Place schema from each.
|
|
6
|
+
* Returns an empty array when no Place pages exist.
|
|
7
|
+
*
|
|
8
|
+
* Phase 3 S3: optional `locale` parameter (BCP-47). Validated against the
|
|
9
|
+
* project's allowlist; invalid or unknown values silently fall back to the
|
|
10
|
+
* default locale (AC-i18n-07). Page enumeration is locale-scoped.
|
|
11
|
+
*
|
|
12
|
+
* Input: { locale?: string }
|
|
13
|
+
* Output: { locations: Array<{ name, address, geo?, telephone? }> }
|
|
14
|
+
* Session/scope: none — read-only public content.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
import { createMdxAdapter, SCHEMA_ORG_TYPES } from "@working-theory/content-adapters";
|
|
20
|
+
import {
|
|
21
|
+
getLocationsInputSchema,
|
|
22
|
+
getLocationsOutputSchema,
|
|
23
|
+
type GetLocationsInput,
|
|
24
|
+
type GetLocationsOutput,
|
|
25
|
+
} from "@working-theory/validation";
|
|
26
|
+
|
|
27
|
+
import { resolveLocale } from "../lib/resolve-locale.js";
|
|
28
|
+
|
|
29
|
+
export { getLocationsInputSchema, getLocationsOutputSchema };
|
|
30
|
+
export type { GetLocationsInput, GetLocationsOutput };
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* get_locations handler.
|
|
34
|
+
*
|
|
35
|
+
* Accepts an optional `contentRoot` override for testing. When omitted,
|
|
36
|
+
* resolves the content root relative to cwd (supports ESM runtime).
|
|
37
|
+
*/
|
|
38
|
+
export async function ailkGetLocations(
|
|
39
|
+
input: GetLocationsInput,
|
|
40
|
+
contentRoot?: string,
|
|
41
|
+
): Promise<GetLocationsOutput> {
|
|
42
|
+
getLocationsInputSchema.parse(input);
|
|
43
|
+
|
|
44
|
+
const root = contentRoot ?? join(process.cwd(), "content");
|
|
45
|
+
const locale = resolveLocale(input.locale);
|
|
46
|
+
const adapter = createMdxAdapter({ contentRoot: root, defaultLocale: locale });
|
|
47
|
+
|
|
48
|
+
// Place is not a page-level SchemaOrgType, so we iterate all types to find
|
|
49
|
+
// pages whose schema field has Place structured data.
|
|
50
|
+
const allPages = await Promise.all(
|
|
51
|
+
SCHEMA_ORG_TYPES.map((type) => adapter.listPages(type, locale)),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// Deduplicate slugs before extracting — a slug can appear in multiple types.
|
|
55
|
+
const slugsSeen = new Set<string>();
|
|
56
|
+
const uniquePages = allPages.flat().filter((page) => {
|
|
57
|
+
if (slugsSeen.has(page.slug)) return false;
|
|
58
|
+
slugsSeen.add(page.slug);
|
|
59
|
+
return true;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Parallelize extraction — each call is an independent fs read.
|
|
63
|
+
const extracted = await Promise.all(
|
|
64
|
+
uniquePages.map(async (page) => ({
|
|
65
|
+
page,
|
|
66
|
+
data: await adapter.extractStructuredData("Place", page.slug, locale),
|
|
67
|
+
})),
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
const locations: GetLocationsOutput["locations"] = [];
|
|
71
|
+
for (const { page, data } of extracted) {
|
|
72
|
+
if (!data) continue;
|
|
73
|
+
const place = data as Record<string, unknown>;
|
|
74
|
+
const address = place["address"] as Record<string, unknown> | undefined;
|
|
75
|
+
if (!address) continue;
|
|
76
|
+
locations.push({
|
|
77
|
+
name: page.title,
|
|
78
|
+
address,
|
|
79
|
+
geo: place["geo"] as Record<string, unknown> | undefined,
|
|
80
|
+
telephone: place["telephone"] as string | undefined,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return getLocationsOutputSchema.parse({ locations });
|
|
85
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_offerings — returns Services and/or Products as a unified offerings array.
|
|
3
|
+
*
|
|
4
|
+
* Pure read: imports the MDX adapter from @working-theory/content-adapters (ADR 0011).
|
|
5
|
+
* Lists pages of type "Service" and/or "Product" and shapes them into a
|
|
6
|
+
* unified offerings array. Optionally filtered by type.
|
|
7
|
+
*
|
|
8
|
+
* Phase 3 S3: optional `locale` parameter (BCP-47). Validated against the
|
|
9
|
+
* project's allowlist; invalid or unknown values silently fall back to the
|
|
10
|
+
* default locale (AC-i18n-07). Lists are locale-scoped.
|
|
11
|
+
*
|
|
12
|
+
* Input: { type?: 'service' | 'product', locale?: string }
|
|
13
|
+
* Output: { offerings: Array<{ name, description, category?, image? }> }
|
|
14
|
+
* Session/scope: none — read-only public content.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
import { createMdxAdapter, type SchemaOrgType } from "@working-theory/content-adapters";
|
|
20
|
+
import {
|
|
21
|
+
getOfferingsInputSchema,
|
|
22
|
+
getOfferingsOutputSchema,
|
|
23
|
+
type GetOfferingsInput,
|
|
24
|
+
type GetOfferingsOutput,
|
|
25
|
+
} from "@working-theory/validation";
|
|
26
|
+
|
|
27
|
+
import { resolveLocale } from "../lib/resolve-locale.js";
|
|
28
|
+
|
|
29
|
+
export { getOfferingsInputSchema, getOfferingsOutputSchema };
|
|
30
|
+
export type { GetOfferingsInput, GetOfferingsOutput };
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* get_offerings handler.
|
|
34
|
+
*
|
|
35
|
+
* Accepts an optional `contentRoot` override for testing. When omitted,
|
|
36
|
+
* resolves the content root relative to cwd (supports ESM runtime).
|
|
37
|
+
*/
|
|
38
|
+
export async function ailkGetOfferings(
|
|
39
|
+
input: GetOfferingsInput,
|
|
40
|
+
contentRoot?: string,
|
|
41
|
+
): Promise<GetOfferingsOutput> {
|
|
42
|
+
getOfferingsInputSchema.parse(input);
|
|
43
|
+
|
|
44
|
+
const root = contentRoot ?? join(process.cwd(), "content");
|
|
45
|
+
const locale = resolveLocale(input.locale);
|
|
46
|
+
const adapter = createMdxAdapter({ contentRoot: root, defaultLocale: locale });
|
|
47
|
+
|
|
48
|
+
const typesToFetch: SchemaOrgType[] = [];
|
|
49
|
+
if (!input.type || input.type === "service") typesToFetch.push("Service");
|
|
50
|
+
if (!input.type || input.type === "product") typesToFetch.push("Product");
|
|
51
|
+
|
|
52
|
+
const perType = await Promise.all(
|
|
53
|
+
typesToFetch.map((type) => adapter.listPages(type, locale)),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const offerings: GetOfferingsOutput["offerings"] = perType
|
|
57
|
+
.flat()
|
|
58
|
+
.map((page) => ({
|
|
59
|
+
name: page.title,
|
|
60
|
+
description: page.description,
|
|
61
|
+
category: page.schema?.["category"] as string | undefined,
|
|
62
|
+
image: page.image,
|
|
63
|
+
}));
|
|
64
|
+
|
|
65
|
+
return getOfferingsOutputSchema.parse({ offerings });
|
|
66
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_pricing — returns pricing tiers from Offer structured data.
|
|
3
|
+
*
|
|
4
|
+
* Pure read: imports the MDX adapter from @working-theory/content-adapters (ADR 0011).
|
|
5
|
+
* Resolves a page by slug (default: "pricing") and extracts Offer schema.
|
|
6
|
+
* Returns null when the page is not found or has no offer data.
|
|
7
|
+
*
|
|
8
|
+
* Phase 3 S3: optional `locale` parameter (BCP-47). Validated against the
|
|
9
|
+
* project's allowlist; invalid or unknown values silently fall back to the
|
|
10
|
+
* default locale (AC-i18n-07).
|
|
11
|
+
*
|
|
12
|
+
* Input: { slug?: string, locale?: string }
|
|
13
|
+
* Output: { tiers: Array<{ name, price, priceCurrency, description? }> } | null
|
|
14
|
+
* Session/scope: none — read-only public content.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
import { createMdxAdapter } from "@working-theory/content-adapters";
|
|
20
|
+
import {
|
|
21
|
+
getPricingInputSchema,
|
|
22
|
+
getPricingOutputSchema,
|
|
23
|
+
type GetPricingInput,
|
|
24
|
+
type GetPricingOutput,
|
|
25
|
+
} from "@working-theory/validation";
|
|
26
|
+
|
|
27
|
+
import { resolveLocale } from "../lib/resolve-locale.js";
|
|
28
|
+
|
|
29
|
+
export { getPricingInputSchema, getPricingOutputSchema };
|
|
30
|
+
export type { GetPricingInput, GetPricingOutput };
|
|
31
|
+
|
|
32
|
+
const DEFAULT_SLUG = "pricing";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* get_pricing handler.
|
|
36
|
+
*
|
|
37
|
+
* Accepts an optional `contentRoot` override for testing. When omitted,
|
|
38
|
+
* resolves the content root relative to cwd (supports ESM runtime).
|
|
39
|
+
*/
|
|
40
|
+
export async function ailkGetPricing(
|
|
41
|
+
input: GetPricingInput,
|
|
42
|
+
contentRoot?: string,
|
|
43
|
+
): Promise<GetPricingOutput> {
|
|
44
|
+
getPricingInputSchema.parse(input);
|
|
45
|
+
|
|
46
|
+
const root = contentRoot ?? join(process.cwd(), "content");
|
|
47
|
+
const locale = resolveLocale(input.locale);
|
|
48
|
+
const adapter = createMdxAdapter({ contentRoot: root, defaultLocale: locale });
|
|
49
|
+
|
|
50
|
+
const slug = input.slug ?? DEFAULT_SLUG;
|
|
51
|
+
const data = await adapter.extractStructuredData("Product", slug, locale);
|
|
52
|
+
if (!data) return null;
|
|
53
|
+
|
|
54
|
+
const schema = data as Record<string, unknown>;
|
|
55
|
+
|
|
56
|
+
// Support both a top-level `offers` array and a single offer object.
|
|
57
|
+
const offersRaw = schema["offers"];
|
|
58
|
+
const offersArr: Record<string, unknown>[] = Array.isArray(offersRaw)
|
|
59
|
+
? (offersRaw as Record<string, unknown>[])
|
|
60
|
+
: offersRaw && typeof offersRaw === "object"
|
|
61
|
+
? [offersRaw as Record<string, unknown>]
|
|
62
|
+
: [];
|
|
63
|
+
|
|
64
|
+
if (offersArr.length === 0) return null;
|
|
65
|
+
|
|
66
|
+
const tiers = offersArr.map((offer) => ({
|
|
67
|
+
name: (offer["name"] as string) ?? "",
|
|
68
|
+
price: (offer["price"] as string | number) ?? "",
|
|
69
|
+
priceCurrency: (offer["priceCurrency"] as string) ?? "USD",
|
|
70
|
+
description: offer["description"] as string | undefined,
|
|
71
|
+
}));
|
|
72
|
+
|
|
73
|
+
return getPricingOutputSchema.parse({ tiers });
|
|
74
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_site_info — returns structured site identity from the HomePage.
|
|
3
|
+
*
|
|
4
|
+
* Pure read: imports the MDX adapter from @working-theory/content-adapters (ADR 0011).
|
|
5
|
+
* Resolves the HomePage by slug (default: "home") and extracts the `schema`
|
|
6
|
+
* frontmatter field. Returns null when the page is not found or has no schema.
|
|
7
|
+
*
|
|
8
|
+
* Phase 3 S3: optional `locale` parameter (BCP-47). Validated against the
|
|
9
|
+
* project's allowlist; invalid or unknown values silently fall back to the
|
|
10
|
+
* default locale (AC-i18n-07).
|
|
11
|
+
*
|
|
12
|
+
* Input: { slug?: string, locale?: string }
|
|
13
|
+
* Output: { name, description, contact?, brandColors?, socialHandles? } | null
|
|
14
|
+
* Session/scope: none — read-only public content.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
import { createMdxAdapter } from "@working-theory/content-adapters";
|
|
20
|
+
import {
|
|
21
|
+
getSiteInfoInputSchema,
|
|
22
|
+
getSiteInfoOutputSchema,
|
|
23
|
+
type GetSiteInfoInput,
|
|
24
|
+
type GetSiteInfoOutput,
|
|
25
|
+
} from "@working-theory/validation";
|
|
26
|
+
|
|
27
|
+
import { resolveLocale } from "../lib/resolve-locale.js";
|
|
28
|
+
|
|
29
|
+
export { getSiteInfoInputSchema, getSiteInfoOutputSchema };
|
|
30
|
+
export type { GetSiteInfoInput, GetSiteInfoOutput };
|
|
31
|
+
|
|
32
|
+
const DEFAULT_SLUG = "home";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* get_site_info handler.
|
|
36
|
+
*
|
|
37
|
+
* Accepts an optional `contentRoot` override for testing. When omitted,
|
|
38
|
+
* resolves the content root relative to cwd (supports ESM runtime).
|
|
39
|
+
*/
|
|
40
|
+
export async function ailkGetSiteInfo(
|
|
41
|
+
input: GetSiteInfoInput,
|
|
42
|
+
contentRoot?: string,
|
|
43
|
+
): Promise<GetSiteInfoOutput> {
|
|
44
|
+
getSiteInfoInputSchema.parse(input);
|
|
45
|
+
|
|
46
|
+
const root = contentRoot ?? join(process.cwd(), "content");
|
|
47
|
+
const locale = resolveLocale(input.locale);
|
|
48
|
+
const adapter = createMdxAdapter({ contentRoot: root, defaultLocale: locale });
|
|
49
|
+
|
|
50
|
+
const slug = input.slug ?? DEFAULT_SLUG;
|
|
51
|
+
const data = await adapter.extractStructuredData("HomePage", slug, locale);
|
|
52
|
+
if (!data) return null;
|
|
53
|
+
|
|
54
|
+
const schema = data as Record<string, unknown>;
|
|
55
|
+
|
|
56
|
+
const contactRaw = schema["contactPoint"] as
|
|
57
|
+
| Record<string, unknown>
|
|
58
|
+
| undefined;
|
|
59
|
+
const contact =
|
|
60
|
+
contactRaw !== undefined
|
|
61
|
+
? {
|
|
62
|
+
email: contactRaw["email"] as string | undefined,
|
|
63
|
+
phone: contactRaw["telephone"] as string | undefined,
|
|
64
|
+
}
|
|
65
|
+
: undefined;
|
|
66
|
+
|
|
67
|
+
const colorsRaw = schema["brandColors"];
|
|
68
|
+
const brandColors = Array.isArray(colorsRaw)
|
|
69
|
+
? (colorsRaw as string[])
|
|
70
|
+
: undefined;
|
|
71
|
+
|
|
72
|
+
const socialsRaw = schema["sameAs"];
|
|
73
|
+
const socialHandles = Array.isArray(socialsRaw)
|
|
74
|
+
? (socialsRaw as string[])
|
|
75
|
+
: undefined;
|
|
76
|
+
|
|
77
|
+
return getSiteInfoOutputSchema.parse({
|
|
78
|
+
name: (schema["name"] as string) ?? "",
|
|
79
|
+
description: (schema["description"] as string) ?? "",
|
|
80
|
+
contact,
|
|
81
|
+
brandColors,
|
|
82
|
+
socialHandles,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool registry — re-exports every tool module.
|
|
3
|
+
*
|
|
4
|
+
* Add new tool modules here as they land in Phase 3+.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
purchaseInputSchema,
|
|
9
|
+
purchaseOutputSchema,
|
|
10
|
+
ailkPurchase,
|
|
11
|
+
type PurchaseInput,
|
|
12
|
+
type PurchaseOutput,
|
|
13
|
+
} from "./purchase.js";
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
listPagesInputSchema,
|
|
17
|
+
listPagesOutputSchema,
|
|
18
|
+
ailkListPages,
|
|
19
|
+
type ListPagesInput,
|
|
20
|
+
type ListPagesOutput,
|
|
21
|
+
} from "./list_pages.js";
|
|
22
|
+
|
|
23
|
+
export {
|
|
24
|
+
readContentInputSchema,
|
|
25
|
+
readContentOutputSchema,
|
|
26
|
+
ailkReadContent,
|
|
27
|
+
type ReadContentInput,
|
|
28
|
+
type ReadContentOutput,
|
|
29
|
+
} from "./read_content.js";
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
searchContentInputSchema,
|
|
33
|
+
searchContentOutputSchema,
|
|
34
|
+
ailkSearchContent,
|
|
35
|
+
type SearchContentInput,
|
|
36
|
+
type SearchContentOutput,
|
|
37
|
+
} from "./search_content.js";
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
getSiteInfoInputSchema,
|
|
41
|
+
getSiteInfoOutputSchema,
|
|
42
|
+
ailkGetSiteInfo,
|
|
43
|
+
type GetSiteInfoInput,
|
|
44
|
+
type GetSiteInfoOutput,
|
|
45
|
+
} from "./get_site_info.js";
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
getBusinessHoursInputSchema,
|
|
49
|
+
getBusinessHoursOutputSchema,
|
|
50
|
+
ailkGetBusinessHours,
|
|
51
|
+
type GetBusinessHoursInput,
|
|
52
|
+
type GetBusinessHoursOutput,
|
|
53
|
+
} from "./get_business_hours.js";
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
getLocationsInputSchema,
|
|
57
|
+
getLocationsOutputSchema,
|
|
58
|
+
ailkGetLocations,
|
|
59
|
+
type GetLocationsInput,
|
|
60
|
+
type GetLocationsOutput,
|
|
61
|
+
} from "./get_locations.js";
|
|
62
|
+
|
|
63
|
+
export {
|
|
64
|
+
getOfferingsInputSchema,
|
|
65
|
+
getOfferingsOutputSchema,
|
|
66
|
+
ailkGetOfferings,
|
|
67
|
+
type GetOfferingsInput,
|
|
68
|
+
type GetOfferingsOutput,
|
|
69
|
+
} from "./get_offerings.js";
|
|
70
|
+
|
|
71
|
+
export {
|
|
72
|
+
getPricingInputSchema,
|
|
73
|
+
getPricingOutputSchema,
|
|
74
|
+
ailkGetPricing,
|
|
75
|
+
type GetPricingInput,
|
|
76
|
+
type GetPricingOutput,
|
|
77
|
+
} from "./get_pricing.js";
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
getFaqInputSchema,
|
|
81
|
+
getFaqOutputSchema,
|
|
82
|
+
ailkGetFaq,
|
|
83
|
+
type GetFaqInput,
|
|
84
|
+
type GetFaqOutput,
|
|
85
|
+
} from "./get_faq.js";
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
auditInputSchema,
|
|
89
|
+
auditOutputSchema,
|
|
90
|
+
ailkAudit,
|
|
91
|
+
type AuditInput,
|
|
92
|
+
type AuditOutput,
|
|
93
|
+
} from "./audit.js";
|
|
94
|
+
|
|
95
|
+
export {
|
|
96
|
+
submitLeadInputSchema,
|
|
97
|
+
submitLeadOutputSchema,
|
|
98
|
+
ailkCaptureLead,
|
|
99
|
+
type SubmitLeadInput,
|
|
100
|
+
type SubmitLeadOutput,
|
|
101
|
+
} from "./capture_lead.js";
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
subscribeNewsletterInputSchema,
|
|
105
|
+
subscribeNewsletterOutputSchema,
|
|
106
|
+
ailkSubscribeNewsletter,
|
|
107
|
+
type SubscribeNewsletterInput,
|
|
108
|
+
type SubscribeNewsletterOutput,
|
|
109
|
+
} from "./subscribe_newsletter.js";
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
requestCallbackInputSchema,
|
|
113
|
+
requestCallbackOutputSchema,
|
|
114
|
+
ailkRequestCallback,
|
|
115
|
+
type RequestCallbackInput,
|
|
116
|
+
type RequestCallbackOutput,
|
|
117
|
+
} from "./request_callback.js";
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
scaffoldInputSchema,
|
|
121
|
+
scaffoldOutputSchema,
|
|
122
|
+
ailkScaffold,
|
|
123
|
+
type ScaffoldInput,
|
|
124
|
+
type ScaffoldOutput,
|
|
125
|
+
} from "./scaffold.js";
|