gazetta 0.7.0 → 0.8.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/admin-dist/assets/index-CBeq0rRb.js +693 -0
- package/admin-dist/assets/index-Dtg1dTZQ.css +1 -0
- package/admin-dist/assets/rolldown-runtime-BYbx6iT9.js +1 -0
- package/admin-dist/assets/{vendor-primevue-C0Q_YTCb.js → vendor-primevue-CBGHkaXv.js} +183 -39
- package/admin-dist/assets/{vendor-react-BipDVGow.js → vendor-react-BdW_kNCG.js} +2 -2
- package/admin-dist/assets/vendor-rjsf-lN2SztQt.js +33 -0
- package/admin-dist/assets/vendor-tiptap-C36yDquB.js +141 -0
- package/admin-dist/assets/vendor-vue-Bt5uR1VW.js +1 -0
- package/admin-dist/assets/workbox-window.prod.es5-DGMtIXHc.js +2 -0
- package/admin-dist/index.html +8 -8
- package/admin-dist/sw.js +1 -0
- package/dist/admin-api/archived-name-conflict.d.ts +31 -0
- package/dist/admin-api/archived-name-conflict.d.ts.map +1 -0
- package/dist/admin-api/archived-name-conflict.js +226 -0
- package/dist/admin-api/archived-name-conflict.js.map +1 -0
- package/dist/admin-api/cache-stats-logger.d.ts +83 -0
- package/dist/admin-api/cache-stats-logger.d.ts.map +1 -0
- package/dist/admin-api/cache-stats-logger.js +59 -0
- package/dist/admin-api/cache-stats-logger.js.map +1 -0
- package/dist/admin-api/hook-audit-emitter.d.ts +38 -0
- package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
- package/dist/admin-api/hook-audit-emitter.js +21 -0
- package/dist/admin-api/hook-audit-emitter.js.map +1 -0
- package/dist/admin-api/index.d.ts +84 -0
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +254 -9
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/middleware/audit.d.ts +25 -0
- package/dist/admin-api/middleware/audit.d.ts.map +1 -0
- package/dist/admin-api/middleware/audit.js +65 -0
- package/dist/admin-api/middleware/audit.js.map +1 -0
- package/dist/admin-api/middleware/capability.d.ts +8 -0
- package/dist/admin-api/middleware/capability.d.ts.map +1 -0
- package/dist/admin-api/middleware/capability.js +65 -0
- package/dist/admin-api/middleware/capability.js.map +1 -0
- package/dist/admin-api/middleware/principal.d.ts +18 -0
- package/dist/admin-api/middleware/principal.d.ts.map +1 -0
- package/dist/admin-api/middleware/principal.js +128 -0
- package/dist/admin-api/middleware/principal.js.map +1 -0
- package/dist/admin-api/routes/archive-review.d.ts +80 -0
- package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
- package/dist/admin-api/routes/archive-review.js +70 -0
- package/dist/admin-api/routes/archive-review.js.map +1 -0
- package/dist/admin-api/routes/archive.d.ts +145 -0
- package/dist/admin-api/routes/archive.d.ts.map +1 -0
- package/dist/admin-api/routes/archive.js +540 -0
- package/dist/admin-api/routes/archive.js.map +1 -0
- package/dist/admin-api/routes/assets.d.ts +6 -1
- package/dist/admin-api/routes/assets.d.ts.map +1 -1
- package/dist/admin-api/routes/assets.js +167 -14
- package/dist/admin-api/routes/assets.js.map +1 -1
- package/dist/admin-api/routes/audit.d.ts +71 -0
- package/dist/admin-api/routes/audit.d.ts.map +1 -0
- package/dist/admin-api/routes/audit.js +178 -0
- package/dist/admin-api/routes/audit.js.map +1 -0
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +3 -2
- package/dist/admin-api/routes/compare.js.map +1 -1
- package/dist/admin-api/routes/fields.d.ts.map +1 -1
- package/dist/admin-api/routes/fields.js +2 -1
- package/dist/admin-api/routes/fields.js.map +1 -1
- package/dist/admin-api/routes/fragments.d.ts +13 -1
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +127 -92
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/health.d.ts +60 -0
- package/dist/admin-api/routes/health.d.ts.map +1 -0
- package/dist/admin-api/routes/health.js +65 -0
- package/dist/admin-api/routes/health.js.map +1 -0
- package/dist/admin-api/routes/history.d.ts +2 -1
- package/dist/admin-api/routes/history.d.ts.map +1 -1
- package/dist/admin-api/routes/history.js +26 -4
- package/dist/admin-api/routes/history.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts +20 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +157 -117
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/preview.d.ts.map +1 -1
- package/dist/admin-api/routes/preview.js +56 -17
- package/dist/admin-api/routes/preview.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts +19 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +508 -92
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/routes/rename.d.ts +62 -0
- package/dist/admin-api/routes/rename.d.ts.map +1 -0
- package/dist/admin-api/routes/rename.js +366 -0
- package/dist/admin-api/routes/rename.js.map +1 -0
- package/dist/admin-api/routes/site.d.ts.map +1 -1
- package/dist/admin-api/routes/site.js +6 -18
- package/dist/admin-api/routes/site.js.map +1 -1
- package/dist/admin-api/routes/system.d.ts +23 -0
- package/dist/admin-api/routes/system.d.ts.map +1 -0
- package/dist/admin-api/routes/system.js +115 -0
- package/dist/admin-api/routes/system.js.map +1 -0
- package/dist/admin-api/routes/templates.d.ts +11 -1
- package/dist/admin-api/routes/templates.d.ts.map +1 -1
- package/dist/admin-api/routes/templates.js +36 -3
- package/dist/admin-api/routes/templates.js.map +1 -1
- package/dist/admin-api/routes/validation.d.ts +47 -0
- package/dist/admin-api/routes/validation.d.ts.map +1 -0
- package/dist/admin-api/routes/validation.js +120 -0
- package/dist/admin-api/routes/validation.js.map +1 -0
- package/dist/admin-api/schemas/archive.d.ts +124 -0
- package/dist/admin-api/schemas/archive.d.ts.map +1 -0
- package/dist/admin-api/schemas/archive.js +93 -0
- package/dist/admin-api/schemas/archive.js.map +1 -0
- package/dist/admin-api/schemas/assets.d.ts +16 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -1
- package/dist/admin-api/schemas/assets.js +15 -0
- package/dist/admin-api/schemas/assets.js.map +1 -1
- package/dist/admin-api/schemas/audit.d.ts +175 -0
- package/dist/admin-api/schemas/audit.d.ts.map +1 -0
- package/dist/admin-api/schemas/audit.js +91 -0
- package/dist/admin-api/schemas/audit.js.map +1 -0
- package/dist/admin-api/schemas/error.d.ts +94 -0
- package/dist/admin-api/schemas/error.d.ts.map +1 -0
- package/dist/admin-api/schemas/error.js +79 -0
- package/dist/admin-api/schemas/error.js.map +1 -0
- package/dist/admin-api/schemas/fragments.d.ts +2 -0
- package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
- package/dist/admin-api/schemas/fragments.js +4 -0
- package/dist/admin-api/schemas/fragments.js.map +1 -1
- package/dist/admin-api/schemas/index.d.ts +8 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +8 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/schemas/pages.d.ts +2 -0
- package/dist/admin-api/schemas/pages.d.ts.map +1 -1
- package/dist/admin-api/schemas/pages.js +11 -0
- package/dist/admin-api/schemas/pages.js.map +1 -1
- package/dist/admin-api/schemas/rename.d.ts +77 -0
- package/dist/admin-api/schemas/rename.d.ts.map +1 -0
- package/dist/admin-api/schemas/rename.js +75 -0
- package/dist/admin-api/schemas/rename.js.map +1 -0
- package/dist/admin-api/schemas/site.d.ts +3 -2
- package/dist/admin-api/schemas/site.d.ts.map +1 -1
- package/dist/admin-api/schemas/site.js +3 -2
- package/dist/admin-api/schemas/site.js.map +1 -1
- package/dist/admin-api/schemas/system.d.ts +28 -0
- package/dist/admin-api/schemas/system.d.ts.map +1 -0
- package/dist/admin-api/schemas/system.js +35 -0
- package/dist/admin-api/schemas/system.js.map +1 -0
- package/dist/admin-api/schemas/targets.d.ts +55 -0
- package/dist/admin-api/schemas/targets.d.ts.map +1 -1
- package/dist/admin-api/schemas/targets.js +46 -0
- package/dist/admin-api/schemas/targets.js.map +1 -1
- package/dist/admin-api/schemas/templates.d.ts +54 -0
- package/dist/admin-api/schemas/templates.d.ts.map +1 -1
- package/dist/admin-api/schemas/templates.js +21 -0
- package/dist/admin-api/schemas/templates.js.map +1 -1
- package/dist/admin-api/schemas/validation.d.ts +101 -0
- package/dist/admin-api/schemas/validation.d.ts.map +1 -0
- package/dist/admin-api/schemas/validation.js +57 -0
- package/dist/admin-api/schemas/validation.js.map +1 -0
- package/dist/admin-api/source-context.d.ts +66 -10
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +43 -5
- package/dist/admin-api/source-context.js.map +1 -1
- package/dist/ai/adapter-scaffold.d.ts +63 -0
- package/dist/ai/adapter-scaffold.d.ts.map +1 -0
- package/dist/ai/adapter-scaffold.js +89 -0
- package/dist/ai/adapter-scaffold.js.map +1 -0
- package/dist/ai/compose-prompt.d.ts +50 -0
- package/dist/ai/compose-prompt.d.ts.map +1 -0
- package/dist/ai/compose-prompt.js +49 -0
- package/dist/ai/compose-prompt.js.map +1 -0
- package/dist/ai/errors.d.ts +65 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/errors.js +59 -0
- package/dist/ai/errors.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +16 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +76 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +13 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/refusal.d.ts +50 -0
- package/dist/ai/refusal.d.ts.map +1 -0
- package/dist/ai/refusal.js +100 -0
- package/dist/ai/refusal.js.map +1 -0
- package/dist/ai/vision-prep.d.ts +32 -0
- package/dist/ai/vision-prep.d.ts.map +1 -0
- package/dist/ai/vision-prep.js +113 -0
- package/dist/ai/vision-prep.js.map +1 -0
- package/dist/alt/adapter.d.ts +140 -0
- package/dist/alt/adapter.d.ts.map +1 -0
- package/dist/alt/adapter.js +7 -0
- package/dist/alt/adapter.js.map +1 -0
- package/dist/alt/anthropic.d.ts +63 -0
- package/dist/alt/anthropic.d.ts.map +1 -0
- package/dist/alt/anthropic.js +147 -0
- package/dist/alt/anthropic.js.map +1 -0
- package/dist/alt/config.d.ts +67 -0
- package/dist/alt/config.d.ts.map +1 -0
- package/dist/alt/config.js +41 -0
- package/dist/alt/config.js.map +1 -0
- package/dist/alt/factory.d.ts +19 -0
- package/dist/alt/factory.d.ts.map +1 -0
- package/dist/alt/factory.js +69 -0
- package/dist/alt/factory.js.map +1 -0
- package/dist/alt/null-adapter.d.ts +3 -0
- package/dist/alt/null-adapter.d.ts.map +1 -0
- package/dist/alt/null-adapter.js +43 -0
- package/dist/alt/null-adapter.js.map +1 -0
- package/dist/alt/ollama.d.ts +40 -0
- package/dist/alt/ollama.d.ts.map +1 -0
- package/dist/alt/ollama.js +139 -0
- package/dist/alt/ollama.js.map +1 -0
- package/dist/alt/openai.d.ts +46 -0
- package/dist/alt/openai.d.ts.map +1 -0
- package/dist/alt/openai.js +118 -0
- package/dist/alt/openai.js.map +1 -0
- package/dist/alt/prompt-policies.d.ts +79 -0
- package/dist/alt/prompt-policies.d.ts.map +1 -0
- package/dist/alt/prompt-policies.js +67 -0
- package/dist/alt/prompt-policies.js.map +1 -0
- package/dist/alt/route-handler.d.ts +56 -0
- package/dist/alt/route-handler.d.ts.map +1 -0
- package/dist/alt/route-handler.js +122 -0
- package/dist/alt/route-handler.js.map +1 -0
- package/dist/alt/suggester.d.ts +57 -0
- package/dist/alt/suggester.d.ts.map +1 -0
- package/dist/alt/suggester.js +133 -0
- package/dist/alt/suggester.js.map +1 -0
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/archive-aliases.d.ts +79 -0
- package/dist/archive-aliases.d.ts.map +1 -0
- package/dist/archive-aliases.js +60 -0
- package/dist/archive-aliases.js.map +1 -0
- package/dist/archive-helpers.d.ts +73 -0
- package/dist/archive-helpers.d.ts.map +1 -0
- package/dist/archive-helpers.js +94 -0
- package/dist/archive-helpers.js.map +1 -0
- package/dist/assets/find-refs.d.ts +1 -1
- package/dist/assets/find-refs.js +1 -1
- package/dist/assets/find-refs.js.map +1 -1
- package/dist/assets/rename.js +1 -1
- package/dist/assets/rename.js.map +1 -1
- package/dist/assets/replace.js +1 -1
- package/dist/assets/replace.js.map +1 -1
- package/dist/assets/resolve.js +4 -4
- package/dist/assets/resolve.js.map +1 -1
- package/dist/assets/serve-route.js +2 -2
- package/dist/assets/serve-route.js.map +1 -1
- package/dist/assets/validate.d.ts +1 -1
- package/dist/assets/validate.js +1 -1
- package/dist/audit/config.d.ts +75 -0
- package/dist/audit/config.d.ts.map +1 -0
- package/dist/audit/config.js +91 -0
- package/dist/audit/config.js.map +1 -0
- package/dist/audit/context.d.ts +98 -0
- package/dist/audit/context.d.ts.map +1 -0
- package/dist/audit/context.js +51 -0
- package/dist/audit/context.js.map +1 -0
- package/dist/audit/errors.d.ts +73 -0
- package/dist/audit/errors.d.ts.map +1 -0
- package/dist/audit/errors.js +78 -0
- package/dist/audit/errors.js.map +1 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +10 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/provider.d.ts +73 -0
- package/dist/audit/provider.d.ts.map +1 -0
- package/dist/audit/provider.js +2 -0
- package/dist/audit/provider.js.map +1 -0
- package/dist/audit/providers/history.d.ts +66 -0
- package/dist/audit/providers/history.d.ts.map +1 -0
- package/dist/audit/providers/history.js +102 -0
- package/dist/audit/providers/history.js.map +1 -0
- package/dist/audit/pseudonymize.d.ts +26 -0
- package/dist/audit/pseudonymize.d.ts.map +1 -0
- package/dist/audit/pseudonymize.js +86 -0
- package/dist/audit/pseudonymize.js.map +1 -0
- package/dist/audit/recorder.d.ts +102 -0
- package/dist/audit/recorder.d.ts.map +1 -0
- package/dist/audit/recorder.js +55 -0
- package/dist/audit/recorder.js.map +1 -0
- package/dist/audit/retention.d.ts +83 -0
- package/dist/audit/retention.d.ts.map +1 -0
- package/dist/audit/retention.js +142 -0
- package/dist/audit/retention.js.map +1 -0
- package/dist/audit/source-ip.d.ts +32 -0
- package/dist/audit/source-ip.d.ts.map +1 -0
- package/dist/audit/source-ip.js +164 -0
- package/dist/audit/source-ip.js.map +1 -0
- package/dist/audit/types.d.ts +143 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +33 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/user-agent.d.ts +28 -0
- package/dist/audit/user-agent.d.ts.map +1 -0
- package/dist/audit/user-agent.js +63 -0
- package/dist/audit/user-agent.js.map +1 -0
- package/dist/auth/capabilities.d.ts +28 -0
- package/dist/auth/capabilities.d.ts.map +1 -0
- package/dist/auth/capabilities.js +101 -0
- package/dist/auth/capabilities.js.map +1 -0
- package/dist/auth/config.d.ts +109 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +221 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/errors.d.ts +72 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +78 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/factory.d.ts +43 -0
- package/dist/auth/factory.d.ts.map +1 -0
- package/dist/auth/factory.js +48 -0
- package/dist/auth/factory.js.map +1 -0
- package/dist/auth/index.d.ts +21 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/ip-match.d.ts +29 -0
- package/dist/auth/ip-match.d.ts.map +1 -0
- package/dist/auth/ip-match.js +162 -0
- package/dist/auth/ip-match.js.map +1 -0
- package/dist/auth/provider.d.ts +76 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +2 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/providers/aws-cognito.d.ts +55 -0
- package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
- package/dist/auth/providers/aws-cognito.js +114 -0
- package/dist/auth/providers/aws-cognito.js.map +1 -0
- package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
- package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
- package/dist/auth/providers/azure-easy-auth.js +48 -0
- package/dist/auth/providers/azure-easy-auth.js.map +1 -0
- package/dist/auth/providers/cloudflare-access.d.ts +71 -0
- package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
- package/dist/auth/providers/cloudflare-access.js +120 -0
- package/dist/auth/providers/cloudflare-access.js.map +1 -0
- package/dist/auth/providers/forwarded-user.d.ts +31 -0
- package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
- package/dist/auth/providers/forwarded-user.js +72 -0
- package/dist/auth/providers/forwarded-user.js.map +1 -0
- package/dist/auth/providers/none.d.ts +6 -0
- package/dist/auth/providers/none.d.ts.map +1 -0
- package/dist/auth/providers/none.js +19 -0
- package/dist/auth/providers/none.js.map +1 -0
- package/dist/auth/providers/tailscale.d.ts +7 -0
- package/dist/auth/providers/tailscale.d.ts.map +1 -0
- package/dist/auth/providers/tailscale.js +30 -0
- package/dist/auth/providers/tailscale.js.map +1 -0
- package/dist/auth/role-resolver.d.ts +38 -0
- package/dist/auth/role-resolver.d.ts.map +1 -0
- package/dist/auth/role-resolver.js +92 -0
- package/dist/auth/role-resolver.js.map +1 -0
- package/dist/auth/types.d.ts +150 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +60 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cache/errors.d.ts +41 -0
- package/dist/cache/errors.d.ts.map +1 -0
- package/dist/cache/errors.js +44 -0
- package/dist/cache/errors.js.map +1 -0
- package/dist/cache/factories.d.ts +17 -0
- package/dist/cache/factories.d.ts.map +1 -0
- package/dist/cache/factories.js +17 -0
- package/dist/cache/factories.js.map +1 -0
- package/dist/cache/keys.d.ts +63 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +145 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/memory.d.ts +51 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +204 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/per-site.d.ts +22 -0
- package/dist/cache/per-site.d.ts.map +1 -0
- package/dist/cache/per-site.js +114 -0
- package/dist/cache/per-site.js.map +1 -0
- package/dist/cache/types.d.ts +142 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +33 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/archive.d.ts +44 -0
- package/dist/cli/archive.d.ts.map +1 -0
- package/dist/cli/archive.js +310 -0
- package/dist/cli/archive.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +15 -8
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +59 -23
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/dev-template-watcher.d.ts +29 -0
- package/dist/cli/dev-template-watcher.d.ts.map +1 -0
- package/dist/cli/dev-template-watcher.js +38 -0
- package/dist/cli/dev-template-watcher.js.map +1 -0
- package/dist/cli/history.d.ts.map +1 -1
- package/dist/cli/history.js +5 -3
- package/dist/cli/history.js.map +1 -1
- package/dist/cli/index.js +712 -395
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/validate-flags.d.ts +29 -0
- package/dist/cli/validate-flags.d.ts.map +1 -0
- package/dist/cli/validate-flags.js +49 -0
- package/dist/cli/validate-flags.js.map +1 -0
- package/dist/compare.d.ts +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +25 -23
- package/dist/compare.js.map +1 -1
- package/dist/component-ids.d.ts +25 -0
- package/dist/component-ids.d.ts.map +1 -0
- package/dist/component-ids.js +83 -0
- package/dist/component-ids.js.map +1 -0
- package/dist/config/define.d.ts +61 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/define.js +64 -0
- package/dist/config/define.js.map +1 -0
- package/dist/config/errors.d.ts +32 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +40 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +20 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +105 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +265 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schemas.d.ts +89 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +172 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/types.d.ts +32 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +15 -0
- package/dist/config/types.js.map +1 -0
- package/dist/deploy/cloudflare-workers.d.ts +46 -0
- package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
- package/dist/deploy/cloudflare-workers.js +213 -0
- package/dist/deploy/cloudflare-workers.js.map +1 -0
- package/dist/deploy/errors.d.ts +66 -0
- package/dist/deploy/errors.d.ts.map +1 -0
- package/dist/deploy/errors.js +82 -0
- package/dist/deploy/errors.js.map +1 -0
- package/dist/deploy/index.d.ts +9 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +3 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/deploy/types.d.ts +162 -0
- package/dist/deploy/types.d.ts.map +1 -0
- package/dist/deploy/types.js +2 -0
- package/dist/deploy/types.js.map +1 -0
- package/dist/fragments/create.d.ts +70 -0
- package/dist/fragments/create.d.ts.map +1 -0
- package/dist/fragments/create.js +93 -0
- package/dist/fragments/create.js.map +1 -0
- package/dist/fragments/publish.d.ts +37 -0
- package/dist/fragments/publish.d.ts.map +1 -0
- package/dist/fragments/publish.js +52 -0
- package/dist/fragments/publish.js.map +1 -0
- package/dist/fragments/save.d.ts +81 -0
- package/dist/fragments/save.d.ts.map +1 -0
- package/dist/fragments/save.js +105 -0
- package/dist/fragments/save.js.map +1 -0
- package/dist/history-recorder.d.ts +5 -5
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +4 -4
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.js +2 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/hooks/audit-emitter.d.ts +73 -0
- package/dist/hooks/audit-emitter.d.ts.map +1 -0
- package/dist/hooks/audit-emitter.js +13 -0
- package/dist/hooks/audit-emitter.js.map +1 -0
- package/dist/hooks/context.d.ts +78 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +56 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/contribution.d.ts +90 -0
- package/dist/hooks/contribution.d.ts.map +1 -0
- package/dist/hooks/contribution.js +2 -0
- package/dist/hooks/contribution.js.map +1 -0
- package/dist/hooks/dispatch.d.ts +30 -0
- package/dist/hooks/dispatch.d.ts.map +1 -0
- package/dist/hooks/dispatch.js +252 -0
- package/dist/hooks/dispatch.js.map +1 -0
- package/dist/hooks/errors.d.ts +100 -0
- package/dist/hooks/errors.d.ts.map +1 -0
- package/dist/hooks/errors.js +103 -0
- package/dist/hooks/errors.js.map +1 -0
- package/dist/hooks/index.d.ts +15 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/registry.d.ts +53 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +139 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/storage.d.ts +43 -0
- package/dist/hooks/storage.d.ts.map +1 -0
- package/dist/hooks/storage.js +2 -0
- package/dist/hooks/storage.js.map +1 -0
- package/dist/hooks/types.d.ts +324 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +26 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -5
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +5 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +6 -2
- package/dist/locale.js.map +1 -1
- package/dist/manifest-save.d.ts +255 -0
- package/dist/manifest-save.d.ts.map +1 -0
- package/dist/manifest-save.js +260 -0
- package/dist/manifest-save.js.map +1 -0
- package/dist/manifest.d.ts +1 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +43 -44
- package/dist/manifest.js.map +1 -1
- package/dist/node-floor.d.ts +3 -0
- package/dist/node-floor.d.ts.map +1 -0
- package/dist/node-floor.js +3 -0
- package/dist/node-floor.js.map +1 -0
- package/dist/pages/create.d.ts +103 -0
- package/dist/pages/create.d.ts.map +1 -0
- package/dist/pages/create.js +117 -0
- package/dist/pages/create.js.map +1 -0
- package/dist/pages/publish.d.ts +59 -0
- package/dist/pages/publish.d.ts.map +1 -0
- package/dist/pages/publish.js +78 -0
- package/dist/pages/publish.js.map +1 -0
- package/dist/pages/save.d.ts +97 -0
- package/dist/pages/save.d.ts.map +1 -0
- package/dist/pages/save.js +138 -0
- package/dist/pages/save.js.map +1 -0
- package/dist/providers/factories.d.ts +65 -0
- package/dist/providers/factories.d.ts.map +1 -0
- package/dist/providers/factories.js +189 -0
- package/dist/providers/factories.js.map +1 -0
- package/dist/publish-item.d.ts +225 -0
- package/dist/publish-item.d.ts.map +1 -0
- package/dist/publish-item.js +210 -0
- package/dist/publish-item.js.map +1 -0
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +75 -6
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish-renderers.d.ts +132 -0
- package/dist/publish-renderers.d.ts.map +1 -0
- package/dist/publish-renderers.js +240 -0
- package/dist/publish-renderers.js.map +1 -0
- package/dist/publish-run.d.ts +223 -0
- package/dist/publish-run.d.ts.map +1 -0
- package/dist/publish-run.js +307 -0
- package/dist/publish-run.js.map +1 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +1 -10
- package/dist/publish.js.map +1 -1
- package/dist/render-for-analysis.d.ts +24 -0
- package/dist/render-for-analysis.d.ts.map +1 -0
- package/dist/render-for-analysis.js +146 -0
- package/dist/render-for-analysis.js.map +1 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +47 -23
- package/dist/resolver.js.map +1 -1
- package/dist/runtime/archive-marker.d.ts +62 -0
- package/dist/runtime/archive-marker.d.ts.map +1 -0
- package/dist/runtime/archive-marker.js +88 -0
- package/dist/runtime/archive-marker.js.map +1 -0
- package/dist/runtime/capability-gap-warnings.d.ts +42 -0
- package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
- package/dist/runtime/capability-gap-warnings.js +28 -0
- package/dist/runtime/capability-gap-warnings.js.map +1 -0
- package/dist/runtime/redirects-emit.d.ts +93 -0
- package/dist/runtime/redirects-emit.d.ts.map +1 -0
- package/dist/runtime/redirects-emit.js +89 -0
- package/dist/runtime/redirects-emit.js.map +1 -0
- package/dist/runtime/runtime-capabilities.d.ts +79 -0
- package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
- package/dist/runtime/runtime-capabilities.js +60 -0
- package/dist/runtime/runtime-capabilities.js.map +1 -0
- package/dist/save-etag.d.ts +69 -0
- package/dist/save-etag.d.ts.map +1 -0
- package/dist/save-etag.js +118 -0
- package/dist/save-etag.js.map +1 -0
- package/dist/site-loader.d.ts +42 -4
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +27 -8
- package/dist/site-loader.js.map +1 -1
- package/dist/targets.d.ts +21 -12
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +27 -95
- package/dist/targets.js.map +1 -1
- package/dist/testing/admin-cache-contract.d.ts +52 -0
- package/dist/testing/admin-cache-contract.d.ts.map +1 -0
- package/dist/testing/admin-cache-contract.js +203 -0
- package/dist/testing/admin-cache-contract.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transforms/factories.d.ts +16 -0
- package/dist/transforms/factories.d.ts.map +1 -0
- package/dist/transforms/factories.js +18 -0
- package/dist/transforms/factories.js.map +1 -0
- package/dist/transforms/index.d.ts +10 -17
- package/dist/transforms/index.d.ts.map +1 -1
- package/dist/transforms/index.js +4 -28
- package/dist/transforms/index.js.map +1 -1
- package/dist/transforms/sharp.d.ts +15 -1
- package/dist/transforms/sharp.d.ts.map +1 -1
- package/dist/transforms/sharp.js +34 -20
- package/dist/transforms/sharp.js.map +1 -1
- package/dist/types.d.ts +379 -52
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -1
- package/dist/types.js.map +1 -1
- package/dist/validation/alt-required-walker.d.ts +27 -0
- package/dist/validation/alt-required-walker.d.ts.map +1 -0
- package/dist/validation/alt-required-walker.js +108 -0
- package/dist/validation/alt-required-walker.js.map +1 -0
- package/dist/validation/default-registry.d.ts +12 -0
- package/dist/validation/default-registry.d.ts.map +1 -0
- package/dist/validation/default-registry.js +55 -0
- package/dist/validation/default-registry.js.map +1 -0
- package/dist/validation/publish-audit.d.ts +44 -0
- package/dist/validation/publish-audit.d.ts.map +1 -0
- package/dist/validation/publish-audit.js +64 -0
- package/dist/validation/publish-audit.js.map +1 -0
- package/dist/validation/registry.d.ts +23 -0
- package/dist/validation/registry.d.ts.map +1 -0
- package/dist/validation/registry.js +15 -0
- package/dist/validation/registry.js.map +1 -0
- package/dist/validation/save-delta.d.ts +46 -0
- package/dist/validation/save-delta.d.ts.map +1 -0
- package/dist/validation/save-delta.js +57 -0
- package/dist/validation/save-delta.js.map +1 -0
- package/dist/validation/scanner.d.ts +91 -0
- package/dist/validation/scanner.d.ts.map +1 -0
- package/dist/validation/scanner.js +327 -0
- package/dist/validation/scanner.js.map +1 -0
- package/dist/validation/template-impact.d.ts +52 -0
- package/dist/validation/template-impact.d.ts.map +1 -0
- package/dist/validation/template-impact.js +53 -0
- package/dist/validation/template-impact.js.map +1 -0
- package/dist/validation/types.d.ts +123 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +7 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/validators/accessibility.d.ts +3 -0
- package/dist/validation/validators/accessibility.d.ts.map +1 -0
- package/dist/validation/validators/accessibility.js +106 -0
- package/dist/validation/validators/accessibility.js.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
- package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
- package/dist/validation/validators/alt-required.d.ts +3 -0
- package/dist/validation/validators/alt-required.d.ts.map +1 -0
- package/dist/validation/validators/alt-required.js +118 -0
- package/dist/validation/validators/alt-required.js.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
- package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
- package/dist/validation/validators/broken-links.d.ts +3 -0
- package/dist/validation/validators/broken-links.d.ts.map +1 -0
- package/dist/validation/validators/broken-links.js +190 -0
- package/dist/validation/validators/broken-links.js.map +1 -0
- package/dist/validation/validators/circular-alias.d.ts +36 -0
- package/dist/validation/validators/circular-alias.d.ts.map +1 -0
- package/dist/validation/validators/circular-alias.js +63 -0
- package/dist/validation/validators/circular-alias.js.map +1 -0
- package/dist/validation/validators/circular-fragment.d.ts +15 -0
- package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
- package/dist/validation/validators/circular-fragment.js +97 -0
- package/dist/validation/validators/circular-fragment.js.map +1 -0
- package/dist/validation/validators/dangling-alias.d.ts +38 -0
- package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
- package/dist/validation/validators/dangling-alias.js +31 -0
- package/dist/validation/validators/dangling-alias.js.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.js +32 -0
- package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.js +80 -0
- package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
- package/dist/validation/validators/html-validity.d.ts +3 -0
- package/dist/validation/validators/html-validity.d.ts.map +1 -0
- package/dist/validation/validators/html-validity.js +89 -0
- package/dist/validation/validators/html-validity.js.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.js +84 -0
- package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
- package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.js +80 -0
- package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.js +52 -0
- package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
- package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
- package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-template-exists.js +74 -0
- package/dist/validation/validators/referenced-template-exists.js.map +1 -0
- package/dist/validation/validators/schema-conformance.d.ts +17 -0
- package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
- package/dist/validation/validators/schema-conformance.js +94 -0
- package/dist/validation/validators/schema-conformance.js.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.js +37 -0
- package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
- package/dist/validation/validators/unused-fragment.d.ts +16 -0
- package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
- package/dist/validation/validators/unused-fragment.js +86 -0
- package/dist/validation/validators/unused-fragment.js.map +1 -0
- package/package.json +54 -31
- package/admin-dist/assets/index-BO9-CXmW.css +0 -1
- package/admin-dist/assets/index-Ufu8zZH_.js +0 -668
- package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
- package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
- package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
- package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
- package/dist/publish-locale.d.ts +0 -44
- package/dist/publish-locale.d.ts.map +0 -1
- package/dist/publish-locale.js +0 -103
- package/dist/publish-locale.js.map +0 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit context — the per-request helper handlers call to record
|
|
3
|
+
* events. Constructed once per `createAdminApp` boot from the
|
|
4
|
+
* resolved `admin.audit` config; injected into Hono's request
|
|
5
|
+
* context as `c.var.audit` by middleware.
|
|
6
|
+
*
|
|
7
|
+
* # Why a context object, not a free function
|
|
8
|
+
*
|
|
9
|
+
* Recording an event takes the principal (per-request), the
|
|
10
|
+
* configured providers (per-app), the privacy modes (per-app),
|
|
11
|
+
* and the source-IP / userAgent (per-request). A free function
|
|
12
|
+
* would force every handler to thread the per-app config alongside
|
|
13
|
+
* the per-request data — boilerplate every handler repeats.
|
|
14
|
+
*
|
|
15
|
+
* The context wraps both: `c.var.audit.record({ action, outcome,
|
|
16
|
+
* scope, metadata? })` is all the handler writes. The middleware
|
|
17
|
+
* pre-binds the per-app config + per-request principal/headers.
|
|
18
|
+
*
|
|
19
|
+
* # SOLID lenses
|
|
20
|
+
*
|
|
21
|
+
* - SRP: this module owns the recording-site-facing helper. The
|
|
22
|
+
* recorder dispatcher (Cut 3), pseudonymization (Cut 4), and
|
|
23
|
+
* individual providers (Cut 2) are independent concerns.
|
|
24
|
+
* - DIP: handlers depend on the `AuditContext` interface, not on
|
|
25
|
+
* `recordToAll` or specific providers.
|
|
26
|
+
*/
|
|
27
|
+
import type { AuditAction, AuditOutcome, AuditProvider, AuditScope } from './index.js';
|
|
28
|
+
import type { ActorPseudonymMode } from './pseudonymize.js';
|
|
29
|
+
import type { SourceIpMode } from './source-ip.js';
|
|
30
|
+
import type { UserAgentMode } from './user-agent.js';
|
|
31
|
+
import type { AuditFailureLogger, RecordResult } from './recorder.js';
|
|
32
|
+
import type { Principal } from '../auth/index.js';
|
|
33
|
+
/**
|
|
34
|
+
* What the handler supplies. Everything else (actor, sourceIp,
|
|
35
|
+
* userAgent, timestamp) the context derives from per-request +
|
|
36
|
+
* per-app data.
|
|
37
|
+
*/
|
|
38
|
+
export interface RecordEventInput {
|
|
39
|
+
action: AuditAction;
|
|
40
|
+
outcome: AuditOutcome;
|
|
41
|
+
scope: AuditScope;
|
|
42
|
+
/** Provider-specific extras: missingCapabilities, source target, restoredFrom, etc. */
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
export interface AuditContext {
|
|
46
|
+
/**
|
|
47
|
+
* Record an event. Returns the recorder result so strict-mode
|
|
48
|
+
* callers can branch on `result.failed > 0` (per design-audit.md
|
|
49
|
+
* "Strict mode opt-in"). Non-strict callers ignore the return.
|
|
50
|
+
*
|
|
51
|
+
* Never throws (per Universal Provider Requirement #5). Failures
|
|
52
|
+
* surface in the result + structured log.
|
|
53
|
+
*/
|
|
54
|
+
record(input: RecordEventInput): Promise<RecordResult>;
|
|
55
|
+
/**
|
|
56
|
+
* True when the operator has opted into strict mode. Handlers
|
|
57
|
+
* check this to decide whether to abort the write on failed
|
|
58
|
+
* recording.
|
|
59
|
+
*/
|
|
60
|
+
readonly strict: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface AuditContextOptions {
|
|
63
|
+
/** Configured providers (in fan-out order). */
|
|
64
|
+
providers: ReadonlyArray<AuditProvider>;
|
|
65
|
+
/** Strict mode flag from `admin.audit.strict`. */
|
|
66
|
+
strict: boolean;
|
|
67
|
+
/** Pseudonymization mode for actor.id. */
|
|
68
|
+
actorPseudonym: ActorPseudonymMode;
|
|
69
|
+
/** Pseudonymization salt — required when actorPseudonym is sha256. */
|
|
70
|
+
actorSalt?: string;
|
|
71
|
+
/** Source-IP recording mode. */
|
|
72
|
+
recordSourceIp: SourceIpMode;
|
|
73
|
+
/** Source-IP hash salt — required when recordSourceIp is hashed. */
|
|
74
|
+
sourceIpSalt?: string;
|
|
75
|
+
/** Trusted proxy count for X-Forwarded-For mode dispatch. */
|
|
76
|
+
trustedProxyCount?: number;
|
|
77
|
+
/** User-agent recording mode. */
|
|
78
|
+
recordUserAgent: UserAgentMode;
|
|
79
|
+
/**
|
|
80
|
+
* Per-request data. Bound by the middleware before each route
|
|
81
|
+
* runs.
|
|
82
|
+
*/
|
|
83
|
+
principal: Principal;
|
|
84
|
+
/** Per-request headers (lowercase keys). */
|
|
85
|
+
headers: ReadonlyMap<string, string>;
|
|
86
|
+
/** Per-request peer IP (when available). */
|
|
87
|
+
peerIp?: string;
|
|
88
|
+
/** Failure logger. */
|
|
89
|
+
logFailure?: AuditFailureLogger;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Build a context for one request. Production wiring: middleware
|
|
93
|
+
* runs after `principalMiddleware` (so c.var.principal is populated)
|
|
94
|
+
* + before route handlers; constructs the context with the request's
|
|
95
|
+
* principal + headers and stores it on `c.var.audit`.
|
|
96
|
+
*/
|
|
97
|
+
export declare function createAuditContext(opts: AuditContextOptions): AuditContext;
|
|
98
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/audit/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAc,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAClG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,KAAK,EAA6B,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,YAAY,CAAA;IACrB,KAAK,EAAE,UAAU,CAAA;IACjB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACtD;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IACvC,kDAAkD;IAClD,MAAM,EAAE,OAAO,CAAA;IACf,0CAA0C;IAC1C,cAAc,EAAE,kBAAkB,CAAA;IAClC,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,cAAc,EAAE,YAAY,CAAA;IAC5B,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iCAAiC;IACjC,eAAe,EAAE,aAAa,CAAA;IAC9B;;;OAGG;IACH,SAAS,EAAE,SAAS,CAAA;IACpB,4CAA4C;IAC5C,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAA;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CA2C1E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { recordToAll } from './recorder.js';
|
|
2
|
+
import { pseudonymizeActor } from './pseudonymize.js';
|
|
3
|
+
import { extractSourceIp, processSourceIp } from './source-ip.js';
|
|
4
|
+
import { processUserAgent } from './user-agent.js';
|
|
5
|
+
/**
|
|
6
|
+
* Build a context for one request. Production wiring: middleware
|
|
7
|
+
* runs after `principalMiddleware` (so c.var.principal is populated)
|
|
8
|
+
* + before route handlers; constructs the context with the request's
|
|
9
|
+
* principal + headers and stores it on `c.var.audit`.
|
|
10
|
+
*/
|
|
11
|
+
export function createAuditContext(opts) {
|
|
12
|
+
return {
|
|
13
|
+
strict: opts.strict,
|
|
14
|
+
async record(input) {
|
|
15
|
+
// Apply pseudonymization to the actor BEFORE constructing
|
|
16
|
+
// the event. Cuts a class of bugs where the pre-pseudonym
|
|
17
|
+
// actor leaks via metadata or per-provider serialization.
|
|
18
|
+
const actor = pseudonymizeActor(opts.principal, opts.actorPseudonym, opts.actorSalt);
|
|
19
|
+
// Source IP — extract per trust mode, then process per
|
|
20
|
+
// operator's mode. Both are pure functions; either step
|
|
21
|
+
// returns null → omit the field.
|
|
22
|
+
const sourceIpCtx = {
|
|
23
|
+
trustMode: opts.principal.trustMode,
|
|
24
|
+
headers: opts.headers,
|
|
25
|
+
peerIp: opts.peerIp,
|
|
26
|
+
trustedProxyCount: opts.trustedProxyCount,
|
|
27
|
+
};
|
|
28
|
+
const rawIp = extractSourceIp(sourceIpCtx);
|
|
29
|
+
const sourceIp = processSourceIp(rawIp, opts.recordSourceIp, opts.sourceIpSalt) ?? undefined;
|
|
30
|
+
// User agent — same dispatch.
|
|
31
|
+
const rawUa = opts.headers.get('user-agent');
|
|
32
|
+
const userAgent = processUserAgent(rawUa, opts.recordUserAgent) ?? undefined;
|
|
33
|
+
const event = {
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
actor,
|
|
36
|
+
action: input.action,
|
|
37
|
+
outcome: input.outcome,
|
|
38
|
+
scope: input.scope,
|
|
39
|
+
...(sourceIp !== undefined ? { sourceIp } : {}),
|
|
40
|
+
...(userAgent !== undefined ? { userAgent } : {}),
|
|
41
|
+
...(input.metadata !== undefined ? { metadata: input.metadata } : {}),
|
|
42
|
+
};
|
|
43
|
+
return recordToAll(event, {
|
|
44
|
+
providers: opts.providers,
|
|
45
|
+
strict: opts.strict,
|
|
46
|
+
logFailure: opts.logFailure,
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/audit/context.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AA+DlD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,CAAC,MAAM,CAAC,KAAuB;YAClC,0DAA0D;YAC1D,0DAA0D;YAC1D,0DAA0D;YAC1D,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAEpF,uDAAuD;YACvD,wDAAwD;YACxD,iCAAiC;YACjC,MAAM,WAAW,GAA8B;gBAC7C,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;aAC1C,CAAA;YACD,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;YAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS,CAAA;YAE5F,8BAA8B;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YAC5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,SAAS,CAAA;YAE5E,MAAM,KAAK,GAAe;gBACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtE,CAAA;YAED,OAAO,WAAW,CAAC,KAAK,EAAE;gBACxB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit error taxonomy. Per `design-plugins.md`'s Universal Provider
|
|
3
|
+
* Requirements, every provider surface gets its own error classes
|
|
4
|
+
* so consumers can branch on the failure category.
|
|
5
|
+
*
|
|
6
|
+
* # Error taxonomy
|
|
7
|
+
*
|
|
8
|
+
* - `AuditError` — base class for all audit failures
|
|
9
|
+
* - `AuditConfigurationError` — invalid `admin.audit` config
|
|
10
|
+
* (unknown provider name, missing required field). Surfaces
|
|
11
|
+
* at admin boot; admin won't start.
|
|
12
|
+
* - `AuditTransportError` — provider couldn't reach its sink
|
|
13
|
+
* (network blip, 5xx from CloudWatch, etc.). Per Universal
|
|
14
|
+
* Provider Requirement #5: NEVER thrown — providers log and
|
|
15
|
+
* fall back to local-only recording. The class exists so
|
|
16
|
+
* transport-failure structured-log entries can carry a typed
|
|
17
|
+
* reason field.
|
|
18
|
+
*
|
|
19
|
+
* # Why no `AuditAuthorizationError`
|
|
20
|
+
*
|
|
21
|
+
* Audit READS gate on `read:audit-log` capability via the standard
|
|
22
|
+
* capability middleware (`requireCapability` from auth/RBAC) — the
|
|
23
|
+
* 403 surfaces as `AuthorizationError` from the existing taxonomy,
|
|
24
|
+
* not a new audit-specific error class.
|
|
25
|
+
*
|
|
26
|
+
* # SOLID lenses
|
|
27
|
+
*
|
|
28
|
+
* - SRP: error classes own only error identity; route handlers
|
|
29
|
+
* map to JSON via the existing error-response infrastructure.
|
|
30
|
+
* - LSP: subclasses extend `AuditError` so consumers can
|
|
31
|
+
* `instanceof AuditError` for catch-all handling.
|
|
32
|
+
*/
|
|
33
|
+
/** Base class for all audit-related errors. */
|
|
34
|
+
export declare class AuditError extends Error {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
/** HTTP status the route should return when this error reaches one. */
|
|
37
|
+
readonly httpStatus: number;
|
|
38
|
+
constructor(message: string);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Thrown at config-load time when `admin.audit` is malformed
|
|
42
|
+
* (unknown provider, missing required field, invalid retention).
|
|
43
|
+
* Admin won't start — operator sees the failure before any request
|
|
44
|
+
* is served.
|
|
45
|
+
*/
|
|
46
|
+
export declare class AuditConfigurationError extends AuditError {
|
|
47
|
+
readonly name = "AuditConfigurationError";
|
|
48
|
+
readonly httpStatus = 500;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Tagged transport failure. Per Universal Provider Requirement #5,
|
|
52
|
+
* audit providers never throw on transport errors — they catch
|
|
53
|
+
* internally and log via this category. The class exists so the
|
|
54
|
+
* structured-log entries the recorder emits can carry a typed
|
|
55
|
+
* reason field; route handlers never see this.
|
|
56
|
+
*/
|
|
57
|
+
export declare class AuditTransportError extends AuditError {
|
|
58
|
+
readonly name = "AuditTransportError";
|
|
59
|
+
readonly httpStatus = 500;
|
|
60
|
+
/**
|
|
61
|
+
* Categorical failure type for log-aggregator filtering.
|
|
62
|
+
*
|
|
63
|
+
* - `transport` — network / HTTP failure on a provider with an
|
|
64
|
+
* external sink (CloudWatch outage, webhook timeout)
|
|
65
|
+
* - `serialize` — event couldn't be serialized to the provider's
|
|
66
|
+
* wire format
|
|
67
|
+
* - `quota` — provider's storage tier rejected the write
|
|
68
|
+
* (CloudWatch log group full, file-cache disk full)
|
|
69
|
+
*/
|
|
70
|
+
readonly category: 'transport' | 'serialize' | 'quota';
|
|
71
|
+
constructor(message: string, category: 'transport' | 'serialize' | 'quota');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/audit/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+CAA+C;AAC/C,qBAAa,UAAW,SAAQ,KAAK;IACnC,SAAkB,IAAI,EAAE,MAAM,CAAe;IAC7C,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAM;gBACrB,OAAO,EAAE,MAAM;CAG5B;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,SAAkB,IAAI,6BAA4B;IAClD,SAAkB,UAAU,OAAM;CACnC;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,SAAkB,IAAI,yBAAwB;IAC9C,SAAkB,UAAU,OAAM;IAClC;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO,CAAA;gBAC1C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO;CAI3E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit error taxonomy. Per `design-plugins.md`'s Universal Provider
|
|
3
|
+
* Requirements, every provider surface gets its own error classes
|
|
4
|
+
* so consumers can branch on the failure category.
|
|
5
|
+
*
|
|
6
|
+
* # Error taxonomy
|
|
7
|
+
*
|
|
8
|
+
* - `AuditError` — base class for all audit failures
|
|
9
|
+
* - `AuditConfigurationError` — invalid `admin.audit` config
|
|
10
|
+
* (unknown provider name, missing required field). Surfaces
|
|
11
|
+
* at admin boot; admin won't start.
|
|
12
|
+
* - `AuditTransportError` — provider couldn't reach its sink
|
|
13
|
+
* (network blip, 5xx from CloudWatch, etc.). Per Universal
|
|
14
|
+
* Provider Requirement #5: NEVER thrown — providers log and
|
|
15
|
+
* fall back to local-only recording. The class exists so
|
|
16
|
+
* transport-failure structured-log entries can carry a typed
|
|
17
|
+
* reason field.
|
|
18
|
+
*
|
|
19
|
+
* # Why no `AuditAuthorizationError`
|
|
20
|
+
*
|
|
21
|
+
* Audit READS gate on `read:audit-log` capability via the standard
|
|
22
|
+
* capability middleware (`requireCapability` from auth/RBAC) — the
|
|
23
|
+
* 403 surfaces as `AuthorizationError` from the existing taxonomy,
|
|
24
|
+
* not a new audit-specific error class.
|
|
25
|
+
*
|
|
26
|
+
* # SOLID lenses
|
|
27
|
+
*
|
|
28
|
+
* - SRP: error classes own only error identity; route handlers
|
|
29
|
+
* map to JSON via the existing error-response infrastructure.
|
|
30
|
+
* - LSP: subclasses extend `AuditError` so consumers can
|
|
31
|
+
* `instanceof AuditError` for catch-all handling.
|
|
32
|
+
*/
|
|
33
|
+
/** Base class for all audit-related errors. */
|
|
34
|
+
export class AuditError extends Error {
|
|
35
|
+
name = 'AuditError';
|
|
36
|
+
/** HTTP status the route should return when this error reaches one. */
|
|
37
|
+
httpStatus = 500;
|
|
38
|
+
constructor(message) {
|
|
39
|
+
super(message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Thrown at config-load time when `admin.audit` is malformed
|
|
44
|
+
* (unknown provider, missing required field, invalid retention).
|
|
45
|
+
* Admin won't start — operator sees the failure before any request
|
|
46
|
+
* is served.
|
|
47
|
+
*/
|
|
48
|
+
export class AuditConfigurationError extends AuditError {
|
|
49
|
+
name = 'AuditConfigurationError';
|
|
50
|
+
httpStatus = 500;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Tagged transport failure. Per Universal Provider Requirement #5,
|
|
54
|
+
* audit providers never throw on transport errors — they catch
|
|
55
|
+
* internally and log via this category. The class exists so the
|
|
56
|
+
* structured-log entries the recorder emits can carry a typed
|
|
57
|
+
* reason field; route handlers never see this.
|
|
58
|
+
*/
|
|
59
|
+
export class AuditTransportError extends AuditError {
|
|
60
|
+
name = 'AuditTransportError';
|
|
61
|
+
httpStatus = 500;
|
|
62
|
+
/**
|
|
63
|
+
* Categorical failure type for log-aggregator filtering.
|
|
64
|
+
*
|
|
65
|
+
* - `transport` — network / HTTP failure on a provider with an
|
|
66
|
+
* external sink (CloudWatch outage, webhook timeout)
|
|
67
|
+
* - `serialize` — event couldn't be serialized to the provider's
|
|
68
|
+
* wire format
|
|
69
|
+
* - `quota` — provider's storage tier rejected the write
|
|
70
|
+
* (CloudWatch log group full, file-cache disk full)
|
|
71
|
+
*/
|
|
72
|
+
category;
|
|
73
|
+
constructor(message, category) {
|
|
74
|
+
super(message);
|
|
75
|
+
this.category = category;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/audit/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+CAA+C;AAC/C,MAAM,OAAO,UAAW,SAAQ,KAAK;IACjB,IAAI,GAAW,YAAY,CAAA;IAC7C,uEAAuE;IAC9D,UAAU,GAAW,GAAG,CAAA;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;IAChB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IACnC,IAAI,GAAG,yBAAyB,CAAA;IAChC,UAAU,GAAG,GAAG,CAAA;CACnC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IAC/B,IAAI,GAAG,qBAAqB,CAAA;IAC5B,UAAU,GAAG,GAAG,CAAA;IAClC;;;;;;;;;OASG;IACM,QAAQ,CAAqC;IACtD,YAAY,OAAe,EAAE,QAA6C;QACxE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit barrel export. Cuts 2-9 add to this surface (`AuditProvider`
|
|
3
|
+
* interface, `HistoryAuditProvider`, recorder, query route).
|
|
4
|
+
*/
|
|
5
|
+
export type { AuditAction, AuditActor, AuditEvent, AuditOutcome, AuditQuery, AuditScope } from './types.js';
|
|
6
|
+
export { AuditError, AuditConfigurationError, AuditTransportError } from './errors.js';
|
|
7
|
+
export { AuditConfigSchema, DEFAULT_AUDIT_CONFIG, type AuditConfig } from './config.js';
|
|
8
|
+
export type { AuditProvider } from './provider.js';
|
|
9
|
+
export { createHistoryAuditProvider, type HistoryAuditProviderOptions } from './providers/history.js';
|
|
10
|
+
export { recordToAll, type AuditFailureLog, type AuditFailureLogger, type RecordResult, type RecordToAllOptions, } from './recorder.js';
|
|
11
|
+
export { computePseudonymizedId, pseudonymizeActor, type ActorPseudonymMode } from './pseudonymize.js';
|
|
12
|
+
export { extractSourceIp, processSourceIp, type SourceIpExtractionContext, type SourceIpMode, } from './source-ip.js';
|
|
13
|
+
export { processUserAgent, type UserAgentMode } from './user-agent.js';
|
|
14
|
+
export { pruneAuditEvents, type AuditRetentionConfig, type PruneResult } from './retention.js';
|
|
15
|
+
export { createAuditContext, type AuditContext, type AuditContextOptions, type RecordEventInput, } from './context.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC3G,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtF,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AACvF,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,0BAA0B,EAAE,KAAK,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AACrG,OAAO,EACL,WAAW,EACX,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtG,OAAO,EACL,eAAe,EACf,eAAe,EACf,KAAK,yBAAyB,EAC9B,KAAK,YAAY,GAClB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC9F,OAAO,EACL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { AuditError, AuditConfigurationError, AuditTransportError } from './errors.js';
|
|
2
|
+
export { AuditConfigSchema, DEFAULT_AUDIT_CONFIG } from './config.js';
|
|
3
|
+
export { createHistoryAuditProvider } from './providers/history.js';
|
|
4
|
+
export { recordToAll, } from './recorder.js';
|
|
5
|
+
export { computePseudonymizedId, pseudonymizeActor } from './pseudonymize.js';
|
|
6
|
+
export { extractSourceIp, processSourceIp, } from './source-ip.js';
|
|
7
|
+
export { processUserAgent } from './user-agent.js';
|
|
8
|
+
export { pruneAuditEvents } from './retention.js';
|
|
9
|
+
export { createAuditContext, } from './context.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtF,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAoB,MAAM,aAAa,CAAA;AAEvF,OAAO,EAAE,0BAA0B,EAAoC,MAAM,wBAAwB,CAAA;AACrG,OAAO,EACL,WAAW,GAKZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAA2B,MAAM,mBAAmB,CAAA;AACtG,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAsB,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAA+C,MAAM,gBAAgB,CAAA;AAC9F,OAAO,EACL,kBAAkB,GAInB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AuditProvider` — the seam between Gazetta's recording sites
|
|
3
|
+
* (save/publish/delete/restore handlers, capability middleware,
|
|
4
|
+
* principal middleware) and the operator's chosen audit sink.
|
|
5
|
+
*
|
|
6
|
+
* # The contract
|
|
7
|
+
*
|
|
8
|
+
* Per `design-audit.md`'s "Surface-specific contract":
|
|
9
|
+
*
|
|
10
|
+
* - `record(event)` — write an `AuditEvent` to the sink. MUST
|
|
11
|
+
* NOT throw on transport errors; falls back to local-only
|
|
12
|
+
* recording on failure (the dispatcher in Cut 3 catches +
|
|
13
|
+
* logs via `AuditTransportError`).
|
|
14
|
+
* - `query(filter)` — optional. Providers that own queryable
|
|
15
|
+
* storage implement this; external-sink providers (webhook,
|
|
16
|
+
* OTel) omit it.
|
|
17
|
+
* - `queryUrl()` — optional. Returns a deep-link to the
|
|
18
|
+
* operator's destination console (CloudWatch / Azure Monitor
|
|
19
|
+
* URLs). Providers that own queryable storage typically omit.
|
|
20
|
+
*
|
|
21
|
+
* # Plugin promotion path
|
|
22
|
+
*
|
|
23
|
+
* Per ADR-0009 + `design-plugins.md`: external audit providers
|
|
24
|
+
* ship as npm packages exporting factory functions returning
|
|
25
|
+
* `AuditProvider`. Operators import + invoke at the audit config
|
|
26
|
+
* field (Pattern 3 — multi-provider fan-out via `auditChain([...])`
|
|
27
|
+
* when shipped). No runtime register method.
|
|
28
|
+
*
|
|
29
|
+
* # SOLID lenses
|
|
30
|
+
*
|
|
31
|
+
* - SRP: each provider owns one sink's mechanics; no cross-cutting
|
|
32
|
+
* concerns.
|
|
33
|
+
* - LSP: every provider returns events shaped by `AuditEvent`;
|
|
34
|
+
* consumers branch only on `outcome` / `action` for behavior.
|
|
35
|
+
* - DIP: recorder + drawer depend on this interface, never on
|
|
36
|
+
* concrete classes.
|
|
37
|
+
* - ISP: interface stays narrow — record + optional query + optional
|
|
38
|
+
* queryUrl. No capability-detection methods every provider must
|
|
39
|
+
* stub out.
|
|
40
|
+
*/
|
|
41
|
+
import type { AuditEvent, AuditQuery } from './types.js';
|
|
42
|
+
export interface AuditProvider {
|
|
43
|
+
/**
|
|
44
|
+
* Stable name. Used in failure log entries and in the audit
|
|
45
|
+
* drawer's "View in {name}" deep-link button. Convention:
|
|
46
|
+
* lowercase-kebab-case (`'history'`, `'cloudwatch'`,
|
|
47
|
+
* `'http-webhook'`).
|
|
48
|
+
*/
|
|
49
|
+
readonly name: string;
|
|
50
|
+
/**
|
|
51
|
+
* Record an audit event. MUST NOT throw on transport errors;
|
|
52
|
+
* fall back to local recording on failure. Audit failures never
|
|
53
|
+
* block writes (fail-open default; strict mode opt-in via
|
|
54
|
+
* `admin.audit.strict: true` — handled by the recorder dispatcher
|
|
55
|
+
* in Cut 3).
|
|
56
|
+
*/
|
|
57
|
+
record(event: AuditEvent): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Optional — providers that own queryable storage implement this.
|
|
60
|
+
* External-sink providers that push events elsewhere (CloudWatch,
|
|
61
|
+
* webhook, OTel) omit it; the audit drawer falls back to a deep
|
|
62
|
+
* link from `queryUrl()` in those cases.
|
|
63
|
+
*/
|
|
64
|
+
query?(filter: AuditQuery): Promise<AuditEvent[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Optional — providers that push to an external destination
|
|
67
|
+
* return a deep-link to the operator's destination console.
|
|
68
|
+
* Returning `null` means "configured but no link available."
|
|
69
|
+
* Providers that own queryable storage typically omit this.
|
|
70
|
+
*/
|
|
71
|
+
queryUrl?(): string | null;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/audit/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAExD,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC;;;;;OAKG;IACH,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,MAAM,GAAG,IAAI,CAAA;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/audit/provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `HistoryAuditProvider` — v1 in-tree audit provider that stores
|
|
3
|
+
* events in the target's `.gazetta/audit/events.jsonl` file.
|
|
4
|
+
*
|
|
5
|
+
* # Why JSONL, not extending Revisions
|
|
6
|
+
*
|
|
7
|
+
* Per `design-audit.md`: "Audit and history are conceptually peer
|
|
8
|
+
* surfaces. v1 ships them unified in HistoryAuditProvider (writes a
|
|
9
|
+
* revision on success; writes an audit event on every outcome)."
|
|
10
|
+
*
|
|
11
|
+
* The simplest unified shape: history-recorder keeps writing
|
|
12
|
+
* Revisions for the success path (existing primitive, unchanged);
|
|
13
|
+
* audit events live in a parallel JSONL file under the same
|
|
14
|
+
* `.gazetta/` namespace. Failure outcomes (forbidden /
|
|
15
|
+
* validation-failed / unauthenticated) write only to the audit log
|
|
16
|
+
* (no content snapshot — there was no successful write to record).
|
|
17
|
+
* Success outcomes write to BOTH (revision in `.gazetta/history/`,
|
|
18
|
+
* audit event in `.gazetta/audit/events.jsonl`); the audit-event
|
|
19
|
+
* carries the actor + outcome + scope context the revision shape
|
|
20
|
+
* predates.
|
|
21
|
+
*
|
|
22
|
+
* The alternative — extending `Revision` with `actor` + `outcome` —
|
|
23
|
+
* forces the existing history machinery to handle audit-only
|
|
24
|
+
* revisions (no snapshot). Rather than complicate history-recorder
|
|
25
|
+
* with optional-snapshot revision flow, the audit log gets its own
|
|
26
|
+
* append-only file. v1 validation: simpler shape; same multi-instance
|
|
27
|
+
* guarantees.
|
|
28
|
+
*
|
|
29
|
+
* # Multi-instance correctness
|
|
30
|
+
*
|
|
31
|
+
* One file per instance. Each admin process writes to
|
|
32
|
+
* `events-{instance-id}.jsonl` so concurrent appends don't race.
|
|
33
|
+
* Reads aggregate via `readDir` + concat. Same pattern as
|
|
34
|
+
* design-audit.md "v2 reserved" notes for `FileAuditProvider`:
|
|
35
|
+
* "filesystem POSIX `O_APPEND` for small writes; R2/S3/Azure use
|
|
36
|
+
* per-instance file (`events.{instance-id}.jsonl`)".
|
|
37
|
+
*
|
|
38
|
+
* v1 is per-instance file unconditionally — no special-casing
|
|
39
|
+
* filesystem vs cloud storage. Filesystem operators pay one extra
|
|
40
|
+
* file per process (negligible); cloud-storage operators get the
|
|
41
|
+
* concurrency safety they need.
|
|
42
|
+
*
|
|
43
|
+
* # SOLID lenses
|
|
44
|
+
*
|
|
45
|
+
* - SRP: this provider only writes/reads JSONL. Recording dispatch,
|
|
46
|
+
* pseudonymization, and source-IP extraction live elsewhere.
|
|
47
|
+
* - LSP: implements `AuditProvider`; consumers don't know it's
|
|
48
|
+
* filesystem-backed.
|
|
49
|
+
* - DIP: takes a `StorageProvider` instance — works against
|
|
50
|
+
* filesystem, R2, S3, Azure Blob uniformly.
|
|
51
|
+
*/
|
|
52
|
+
import type { StorageProvider } from '../../types.js';
|
|
53
|
+
import type { AuditProvider } from '../provider.js';
|
|
54
|
+
export interface HistoryAuditProviderOptions {
|
|
55
|
+
/** Storage provider for the target. Audit events live under `.gazetta/audit/`. */
|
|
56
|
+
storage: StorageProvider;
|
|
57
|
+
/**
|
|
58
|
+
* Per-process instance identifier. Disambiguates JSONL file
|
|
59
|
+
* names for multi-instance correctness. Production resolves
|
|
60
|
+
* this from K_REVISION (Cloud Run) → os.hostname() → random
|
|
61
|
+
* 8-char hex (per design-logging.md conventions).
|
|
62
|
+
*/
|
|
63
|
+
instance: string;
|
|
64
|
+
}
|
|
65
|
+
export declare function createHistoryAuditProvider(opts: HistoryAuditProviderOptions): AuditProvider;
|
|
66
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/audit/providers/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD,MAAM,WAAW,2BAA2B;IAC1C,kFAAkF;IAClF,OAAO,EAAE,eAAe,CAAA;IACxB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAA;CACjB;AAID,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,2BAA2B,GAAG,aAAa,CA0F3F"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
const AUDIT_DIR = '.gazetta/audit';
|
|
2
|
+
export function createHistoryAuditProvider(opts) {
|
|
3
|
+
const { storage, instance } = opts;
|
|
4
|
+
const eventsPath = `${AUDIT_DIR}/events-${instance}.jsonl`;
|
|
5
|
+
async function appendEvent(event) {
|
|
6
|
+
// Read-modify-write per call. JSONL append-only on filesystem
|
|
7
|
+
// would be cheaper, but cloud StorageProvider (R2/S3/Azure)
|
|
8
|
+
// doesn't expose append — every write is whole-object replace.
|
|
9
|
+
// The per-instance file scoping makes RMW safe (no other
|
|
10
|
+
// instance writes to this file); the cost is one extra read
|
|
11
|
+
// per event. Acceptable for v1 latency budget (50-200ms).
|
|
12
|
+
let existing = '';
|
|
13
|
+
try {
|
|
14
|
+
existing = await storage.readFile(eventsPath);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// First write — file doesn't exist yet. Create the directory
|
|
18
|
+
// if the storage provider needs it (filesystem mkdir).
|
|
19
|
+
await storage.mkdir(AUDIT_DIR).catch(() => {
|
|
20
|
+
// Provider may not require mkdir (S3/R2 have no concept);
|
|
21
|
+
// swallow.
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const line = JSON.stringify(event) + '\n';
|
|
25
|
+
await storage.writeFile(eventsPath, existing + line);
|
|
26
|
+
}
|
|
27
|
+
async function readAllEvents() {
|
|
28
|
+
// List all instance files + concat. readDir returns DirEntry
|
|
29
|
+
// shapes; we filter to the events-*.jsonl pattern so unrelated
|
|
30
|
+
// files (audit-index sidecars in the future) don't get parsed
|
|
31
|
+
// as events.
|
|
32
|
+
let entries;
|
|
33
|
+
try {
|
|
34
|
+
entries = await storage.readDir(AUDIT_DIR);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// No audit directory yet — nothing to read.
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const events = [];
|
|
41
|
+
for (const entry of entries) {
|
|
42
|
+
if (entry.isDirectory)
|
|
43
|
+
continue;
|
|
44
|
+
if (!entry.name.startsWith('events-') || !entry.name.endsWith('.jsonl'))
|
|
45
|
+
continue;
|
|
46
|
+
const content = await storage.readFile(`${AUDIT_DIR}/${entry.name}`);
|
|
47
|
+
for (const line of content.split('\n')) {
|
|
48
|
+
const trimmed = line.trim();
|
|
49
|
+
if (!trimmed)
|
|
50
|
+
continue;
|
|
51
|
+
try {
|
|
52
|
+
events.push(JSON.parse(trimmed));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Malformed line — skip. A corrupt single line shouldn't
|
|
56
|
+
// poison the whole query. Future: structured-log this.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return events;
|
|
61
|
+
}
|
|
62
|
+
function matchesFilter(event, filter) {
|
|
63
|
+
if (filter.action && event.action !== filter.action)
|
|
64
|
+
return false;
|
|
65
|
+
if (filter.outcome && event.outcome !== filter.outcome)
|
|
66
|
+
return false;
|
|
67
|
+
if (filter.scope?.kind && event.scope.kind !== filter.scope.kind)
|
|
68
|
+
return false;
|
|
69
|
+
if (filter.scope?.name && event.scope.name !== filter.scope.name)
|
|
70
|
+
return false;
|
|
71
|
+
if (filter.actor) {
|
|
72
|
+
const needle = filter.actor.toLowerCase();
|
|
73
|
+
const idMatch = event.actor.id.toLowerCase().includes(needle);
|
|
74
|
+
const emailMatch = event.actor.email?.toLowerCase().includes(needle) ?? false;
|
|
75
|
+
if (!idMatch && !emailMatch)
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (filter.since && event.timestamp < filter.since)
|
|
79
|
+
return false;
|
|
80
|
+
if (filter.until && event.timestamp >= filter.until)
|
|
81
|
+
return false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
name: 'history',
|
|
86
|
+
async record(event) {
|
|
87
|
+
await appendEvent(event);
|
|
88
|
+
},
|
|
89
|
+
async query(filter) {
|
|
90
|
+
const all = await readAllEvents();
|
|
91
|
+
// Sort newest-first per audit-drawer convention. Stable sort
|
|
92
|
+
// by timestamp (string compare on ISO-8601 works correctly).
|
|
93
|
+
all.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
94
|
+
const matched = all.filter(e => matchesFilter(e, filter));
|
|
95
|
+
const limit = filter.limit ?? 100;
|
|
96
|
+
return matched.slice(0, Math.min(limit, 1000));
|
|
97
|
+
},
|
|
98
|
+
// queryUrl intentionally omitted — HistoryAuditProvider has
|
|
99
|
+
// queryable storage; the drawer reads via query() directly.
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/audit/providers/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AuditActor } from './types.js';
|
|
2
|
+
export type ActorPseudonymMode = 'none' | 'sha256';
|
|
3
|
+
/**
|
|
4
|
+
* Apply the configured pseudonymization mode to an actor snapshot.
|
|
5
|
+
*
|
|
6
|
+
* - `'none'` (default) — pass through unchanged.
|
|
7
|
+
* - `'sha256'` — replace `id` with the salted hash prefix; drop
|
|
8
|
+
* `email`.
|
|
9
|
+
*
|
|
10
|
+
* The original `actor` is never mutated; returns a new object.
|
|
11
|
+
*
|
|
12
|
+
* Throws when `mode === 'sha256'` and `salt` is empty/undefined —
|
|
13
|
+
* pseudonymization without a salt is a misconfiguration that would
|
|
14
|
+
* silently produce reversible-by-rainbow-table hashes. Caller (Cut
|
|
15
|
+
* 5's wiring) should catch this at boot via `AuditConfigurationError`
|
|
16
|
+
* when the env var is missing.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pseudonymizeActor(actor: AuditActor, mode: ActorPseudonymMode, salt?: string): AuditActor;
|
|
19
|
+
/**
|
|
20
|
+
* Compute the pseudonymized id for an actor — exposed for forensic
|
|
21
|
+
* queries: an operator who knows the upstream sub + salt can
|
|
22
|
+
* compute the pseudonymized id and search the audit log without
|
|
23
|
+
* the recorder being involved.
|
|
24
|
+
*/
|
|
25
|
+
export declare function computePseudonymizedId(rawSub: string, salt: string): string;
|
|
26
|
+
//# sourceMappingURL=pseudonymize.d.ts.map
|