@caelo-cms/shared 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/ai-tools.d.ts +571 -0
  2. package/dist/ai-tools.d.ts.map +1 -0
  3. package/dist/ai-tools.js +696 -0
  4. package/dist/ai-tools.js.map +1 -0
  5. package/dist/auth-forms.d.ts +24 -0
  6. package/dist/auth-forms.d.ts.map +1 -0
  7. package/dist/auth-forms.js +27 -0
  8. package/dist/auth-forms.js.map +1 -0
  9. package/dist/cap-failures.d.ts +17 -0
  10. package/dist/cap-failures.d.ts.map +1 -0
  11. package/dist/cap-failures.js +58 -0
  12. package/dist/cap-failures.js.map +1 -0
  13. package/dist/content.d.ts +111 -0
  14. package/dist/content.d.ts.map +1 -0
  15. package/dist/content.js +137 -0
  16. package/dist/content.js.map +1 -0
  17. package/dist/context.d.ts +40 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +3 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/i18n.d.ts +49 -0
  22. package/dist/i18n.d.ts.map +1 -0
  23. package/dist/i18n.js +154 -0
  24. package/dist/i18n.js.map +1 -0
  25. package/dist/index.d.ts +20 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +21 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/logger.d.ts +56 -0
  30. package/dist/logger.d.ts.map +1 -0
  31. package/dist/logger.js +84 -0
  32. package/dist/logger.js.map +1 -0
  33. package/dist/media.d.ts +143 -0
  34. package/dist/media.d.ts.map +1 -0
  35. package/dist/media.js +168 -0
  36. package/dist/media.js.map +1 -0
  37. package/dist/preview-compose.d.ts +84 -0
  38. package/dist/preview-compose.d.ts.map +1 -0
  39. package/dist/preview-compose.js +385 -0
  40. package/dist/preview-compose.js.map +1 -0
  41. package/dist/preview-scanner.d.ts +44 -0
  42. package/dist/preview-scanner.d.ts.map +1 -0
  43. package/dist/preview-scanner.js +177 -0
  44. package/dist/preview-scanner.js.map +1 -0
  45. package/dist/result.d.ts +21 -0
  46. package/dist/result.d.ts.map +1 -0
  47. package/dist/result.js +14 -0
  48. package/dist/result.js.map +1 -0
  49. package/dist/seo.d.ts +128 -0
  50. package/dist/seo.d.ts.map +1 -0
  51. package/dist/seo.js +176 -0
  52. package/dist/seo.js.map +1 -0
  53. package/dist/skills.d.ts +88 -0
  54. package/dist/skills.d.ts.map +1 -0
  55. package/dist/skills.js +127 -0
  56. package/dist/skills.js.map +1 -0
  57. package/dist/snapshots.d.ts +54 -0
  58. package/dist/snapshots.d.ts.map +1 -0
  59. package/dist/snapshots.js +59 -0
  60. package/dist/snapshots.js.map +1 -0
  61. package/dist/structured-sets.d.ts +116 -0
  62. package/dist/structured-sets.d.ts.map +1 -0
  63. package/dist/structured-sets.js +154 -0
  64. package/dist/structured-sets.js.map +1 -0
  65. package/dist/subagents.d.ts +123 -0
  66. package/dist/subagents.d.ts.map +1 -0
  67. package/dist/subagents.js +202 -0
  68. package/dist/subagents.js.map +1 -0
  69. package/dist/translation.d.ts +127 -0
  70. package/dist/translation.d.ts.map +1 -0
  71. package/dist/translation.js +208 -0
  72. package/dist/translation.js.map +1 -0
  73. package/dist/version.d.ts +46 -0
  74. package/dist/version.d.ts.map +1 -0
  75. package/dist/version.js +46 -0
  76. package/dist/version.js.map +1 -0
  77. package/package.json +38 -0
package/dist/i18n.js ADDED
@@ -0,0 +1,154 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * P9 — i18n primitives shared between the static generator, the
4
+ * preview op, and the admin UI:
5
+ *
6
+ * computeContentHash(page, modules) — sha256 of canonical-JSON
7
+ * content. Drives `pages.content_hash` + the translation_status
8
+ * recompute path.
9
+ *
10
+ * resolveLocaleUrl(locale, slug, defaultLocaleCode, siteBaseUrl) —
11
+ * builds the public URL for a (locale, slug) tuple given the
12
+ * locale's url_strategy + url_host. Used by:
13
+ * - hreflang emitter
14
+ * - sitemap.xml emitter (when extended for i18n)
15
+ * - language-selector module
16
+ *
17
+ * buildHreflangLinks(currentLocale, perLocaleUrls, defaultLocaleCode) —
18
+ * emits the `<link rel="alternate" hreflang=...>` markup.
19
+ *
20
+ * lintLocaleConfig(locales, advancedUrlRouting) — surfaces config
21
+ * warnings (mixed strategies, missing url_host for subdomain/
22
+ * domain, default locale using `none` alongside subdirectory
23
+ * siblings, advanced strategy chosen while toggle is off).
24
+ */
25
+ const TEXT_ENCODER = new TextEncoder();
26
+ /**
27
+ * Build a public-facing URL for a (locale, slug) tuple. Pure function —
28
+ * no DB access — so the static generator can call it for every page
29
+ * without round-trips.
30
+ *
31
+ * @param locale The target locale's full config row.
32
+ * @param slug Path component (e.g. "about", "blog/post-1"). No leading slash.
33
+ * @param siteBaseUrl Default base URL when the strategy is `none` or
34
+ * `subdirectory` (e.g. "https://example.com").
35
+ * @returns Absolute URL, including scheme + host.
36
+ */
37
+ export function resolveLocaleUrl(locale, slug, siteBaseUrl) {
38
+ const stripped = slug.replace(/^\/+|\/+$/g, "");
39
+ // Home slug + empty/index variants render as the locale root.
40
+ // Non-home slugs get a trailing slash so the URL matches what the
41
+ // static host serves (clean URLs: every page is `<slug>/index.html`,
42
+ // browsers request `<slug>/`). Without this, redirect rows insert
43
+ // `/de/about` while users navigate to `/de/about/` and 301 misses.
44
+ const isHome = stripped === "" || stripped === "home" || stripped === "index";
45
+ const tail = isHome ? "" : `${stripped}/`;
46
+ const base = siteBaseUrl.replace(/\/+$/, "");
47
+ switch (locale.urlStrategy) {
48
+ case "none":
49
+ return tail ? `${base}/${tail}` : `${base}/`;
50
+ case "subdirectory":
51
+ // Default locale with strategy `subdirectory` still gets the prefix
52
+ // unless the migration set strategy=none for it. The decision is
53
+ // explicit per locale row, not implicit on isDefault.
54
+ return tail ? `${base}/${locale.code}/${tail}` : `${base}/${locale.code}/`;
55
+ case "subdomain": {
56
+ if (!locale.urlHost) {
57
+ throw new Error(`locale '${locale.code}' uses url_strategy='subdomain' without url_host — config invalid`);
58
+ }
59
+ const protocol = base.startsWith("http://") ? "http://" : "https://";
60
+ return tail ? `${protocol}${locale.urlHost}/${tail}` : `${protocol}${locale.urlHost}/`;
61
+ }
62
+ case "domain": {
63
+ if (!locale.urlHost) {
64
+ throw new Error(`locale '${locale.code}' uses url_strategy='domain' without url_host — config invalid`);
65
+ }
66
+ const protocol = base.startsWith("http://") ? "http://" : "https://";
67
+ return tail ? `${protocol}${locale.urlHost}/${tail}` : `${protocol}${locale.urlHost}/`;
68
+ }
69
+ }
70
+ }
71
+ /**
72
+ * Emit `<link rel="alternate" hreflang="…">` tags for every locale
73
+ * that has a published variant of this page. The default locale also
74
+ * gets an `x-default` entry per Google's i18n guidance.
75
+ *
76
+ * Returned as a single string suitable for splicing into <head>.
77
+ */
78
+ export function buildHreflangLinks(perLocaleUrls) {
79
+ if (perLocaleUrls.length === 0)
80
+ return "";
81
+ const lines = [];
82
+ for (const v of perLocaleUrls) {
83
+ lines.push(`<link rel="alternate" hreflang="${escapeAttr(v.localeCode)}" href="${escapeAttr(v.url)}" />`);
84
+ }
85
+ const def = perLocaleUrls.find((v) => v.isDefault);
86
+ if (def) {
87
+ lines.push(`<link rel="alternate" hreflang="x-default" href="${escapeAttr(def.url)}" />`);
88
+ }
89
+ return lines.join("\n");
90
+ }
91
+ function escapeAttr(s) {
92
+ return s
93
+ .replace(/&/g, "&amp;")
94
+ .replace(/"/g, "&quot;")
95
+ .replace(/</g, "&lt;")
96
+ .replace(/>/g, "&gt;");
97
+ }
98
+ /**
99
+ * Canonical-JSON serializer + sha256 → hex. Stable across runs because
100
+ * keys are sorted. The output is used for `pages.content_hash` so that
101
+ * a Mode-2 translation can detect whether its source has changed.
102
+ */
103
+ export async function computeContentHash(value) {
104
+ const canonical = JSON.stringify(value, (_key, val) => {
105
+ if (val && typeof val === "object" && !Array.isArray(val)) {
106
+ const sorted = {};
107
+ for (const k of Object.keys(val).sort())
108
+ sorted[k] = val[k];
109
+ return sorted;
110
+ }
111
+ return val;
112
+ });
113
+ const digest = await crypto.subtle.digest("SHA-256", TEXT_ENCODER.encode(canonical));
114
+ return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
115
+ }
116
+ /**
117
+ * Cross-row config sanity checks. Run at:
118
+ * - propose-time (warnings stored on the proposal preview)
119
+ * - render-time (no fail-loudly per CLAUDE.md §2 since the renderer
120
+ * can still emit; surfaced in admin UI as banners)
121
+ */
122
+ export function lintLocaleConfig(locales, advancedUrlRouting) {
123
+ const warnings = [];
124
+ const usingAdvanced = locales.some((l) => l.urlStrategy === "subdomain" || l.urlStrategy === "domain");
125
+ if (usingAdvanced && !advancedUrlRouting) {
126
+ warnings.push({
127
+ code: "advanced-routing-disabled",
128
+ message: "one or more locales use 'subdomain' or 'domain' strategy but Advanced URL Routing is disabled — enable it under /security/locales",
129
+ });
130
+ }
131
+ for (const l of locales) {
132
+ if ((l.urlStrategy === "subdomain" || l.urlStrategy === "domain") && !l.urlHost) {
133
+ warnings.push({
134
+ code: "missing-url-host",
135
+ message: `locale '${l.code}' uses url_strategy='${l.urlStrategy}' without url_host`,
136
+ });
137
+ }
138
+ }
139
+ // Default-locale 'none' alongside subdirectory siblings is a common
140
+ // mixed config; surface it so users know the default's URL stays bare
141
+ // while siblings get prefixed.
142
+ const def = locales.find((l) => l.isDefault);
143
+ const subdirSiblings = locales.filter((l) => !l.isDefault && l.urlStrategy === "subdirectory");
144
+ if (def && def.urlStrategy === "none" && subdirSiblings.length > 0) {
145
+ warnings.push({
146
+ code: "mixed-default-none-subdir",
147
+ message: `default locale '${def.code}' uses 'none' while ${subdirSiblings
148
+ .map((l) => l.code)
149
+ .join(", ")} use 'subdirectory' — this is valid but unusual; verify hreflang renders correctly`,
150
+ });
151
+ }
152
+ return warnings;
153
+ }
154
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const PROJECT_NAME = "caelo-cms";
2
+ export * from "./ai-tools.js";
3
+ export * from "./auth-forms.js";
4
+ export * from "./cap-failures.js";
5
+ export * from "./content.js";
6
+ export * from "./context.js";
7
+ export * from "./i18n.js";
8
+ export { type LogContext, type Logger, type LoggerOptions, type LogLevel, makeLogger, mintRequestId, redact, type ServiceName, type StructuredLogEntry, } from "./logger.js";
9
+ export * from "./media.js";
10
+ export * from "./preview-compose.js";
11
+ export * from "./preview-scanner.js";
12
+ export * from "./result.js";
13
+ export * from "./seo.js";
14
+ export * from "./skills.js";
15
+ export * from "./snapshots.js";
16
+ export * from "./structured-sets.js";
17
+ export * from "./subagents.js";
18
+ export * from "./translation.js";
19
+ export { CAELO_VERSION, CALEO_VERSION, type CaeloVersion, parseVersion } from "./version.js";
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,cAAc,CAAC;AAExC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,UAAU,EACV,aAAa,EACb,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ export const PROJECT_NAME = "caelo-cms";
3
+ export * from "./ai-tools.js";
4
+ export * from "./auth-forms.js";
5
+ export * from "./cap-failures.js";
6
+ export * from "./content.js";
7
+ export * from "./context.js";
8
+ export * from "./i18n.js";
9
+ export { makeLogger, mintRequestId, redact, } from "./logger.js";
10
+ export * from "./media.js";
11
+ export * from "./preview-compose.js";
12
+ export * from "./preview-scanner.js";
13
+ export * from "./result.js";
14
+ export * from "./seo.js";
15
+ export * from "./skills.js";
16
+ export * from "./snapshots.js";
17
+ export * from "./structured-sets.js";
18
+ export * from "./subagents.js";
19
+ export * from "./translation.js";
20
+ export { CAELO_VERSION, CALEO_VERSION, parseVersion } from "./version.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AAExC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAKL,UAAU,EACV,aAAa,EACb,MAAM,GAGP,MAAM,aAAa,CAAC;AACrB,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAqB,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * P16 — structured logger. JSON-per-line to stderr; the host environment
3
+ * (operator's log aggregator: Loki/Datadog/CloudWatch/etc.) ships from
4
+ * there. Stable shape across every Caelo service so a single
5
+ * `request_id` query reconstructs the full timeline.
6
+ *
7
+ * Redaction pass replaces values for keys matching common-secret regex
8
+ * with `***` so a stray `{password: "..."}` extra never lands in logs.
9
+ *
10
+ * NOT a replacement for `audit_events` — audit captures intent (op,
11
+ * actor, succeeded), structured logs capture trace (request_id,
12
+ * service-to-service hops, latency, errors). Cross-correlate via the
13
+ * shared `request_id` column.
14
+ */
15
+ export type LogLevel = "debug" | "info" | "warn" | "error";
16
+ export type ServiceName = "admin" | "gateway" | "orchestrator" | "plugin-host" | "static-gen";
17
+ export interface LogContext {
18
+ readonly requestId: string;
19
+ readonly actorId?: string;
20
+ readonly actorKind?: "human" | "ai" | "system" | "plugin";
21
+ readonly opName?: string;
22
+ readonly chatSessionId?: string;
23
+ readonly pluginSlug?: string;
24
+ }
25
+ export interface StructuredLogEntry {
26
+ readonly ts: string;
27
+ readonly level: LogLevel;
28
+ readonly msg: string;
29
+ readonly service: ServiceName;
30
+ readonly env: string;
31
+ readonly ctx: LogContext;
32
+ readonly extra?: Record<string, unknown>;
33
+ }
34
+ export declare function redact(input: unknown): unknown;
35
+ export interface Logger {
36
+ with(ctx: Partial<LogContext>): Logger;
37
+ debug(msg: string, extra?: Record<string, unknown>): void;
38
+ info(msg: string, extra?: Record<string, unknown>): void;
39
+ warn(msg: string, extra?: Record<string, unknown>): void;
40
+ error(msg: string, extra?: Record<string, unknown>): void;
41
+ }
42
+ export interface LoggerOptions {
43
+ readonly service: ServiceName;
44
+ readonly env?: string;
45
+ /** Defaults to console.error so structured logs flow to stderr. */
46
+ readonly sink?: (entry: StructuredLogEntry) => void;
47
+ /** Minimum level to emit; default 'info' (suppresses 'debug'). */
48
+ readonly minLevel?: LogLevel;
49
+ }
50
+ export declare function makeLogger(opts: LoggerOptions): Logger;
51
+ /**
52
+ * Mint a fresh request_id at a request boundary. Caller threads through
53
+ * ExecutionContext + outbound HTTP headers (`X-Caelo-Request-Id`).
54
+ */
55
+ export declare function mintRequestId(): string;
56
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAQD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAc9C;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACvC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACpD,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CAC9B;AASD,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAqDtD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
package/dist/logger.js ADDED
@@ -0,0 +1,84 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ // Word-anchored — without the boundaries `key` would match `monkey`,
3
+ // `token` would match `tokenizer`, `secret` would match `secretary`.
4
+ // Whole-key match is the right semantic for log-field redaction.
5
+ const SECRET_KEY_RE = /^(password|passwd|secret|secrets|token|tokens|api[-_]?key|api[-_]?keys|cookie|cookies|authorization|bearer|x[-_]api[-_]?key|csrf[-_]?secret|cookie[-_]?secret)$/i;
6
+ export function redact(input) {
7
+ if (input === null || typeof input !== "object")
8
+ return input;
9
+ if (Array.isArray(input))
10
+ return input.map(redact);
11
+ const out = {};
12
+ for (const [k, v] of Object.entries(input)) {
13
+ if (SECRET_KEY_RE.test(k)) {
14
+ out[k] = "***";
15
+ }
16
+ else if (v && typeof v === "object") {
17
+ out[k] = redact(v);
18
+ }
19
+ else {
20
+ out[k] = v;
21
+ }
22
+ }
23
+ return out;
24
+ }
25
+ const LEVEL_RANK = {
26
+ debug: 10,
27
+ info: 20,
28
+ warn: 30,
29
+ error: 40,
30
+ };
31
+ export function makeLogger(opts) {
32
+ const env = opts.env ?? process.env.CAELO_ENV ?? "dev";
33
+ const minRank = LEVEL_RANK[opts.minLevel ?? "info"];
34
+ const sink = opts.sink ??
35
+ ((entry) => {
36
+ // biome-ignore lint/suspicious/noConsole: structured logger sink
37
+ process.stderr.write(`${JSON.stringify(entry)}\n`);
38
+ });
39
+ function emit(ctx, level, msg, extra) {
40
+ if (LEVEL_RANK[level] < minRank)
41
+ return;
42
+ const entry = {
43
+ ts: new Date().toISOString(),
44
+ level,
45
+ msg,
46
+ service: opts.service,
47
+ env,
48
+ ctx,
49
+ extra: extra ? redact(extra) : undefined,
50
+ };
51
+ sink(entry);
52
+ }
53
+ function buildLogger(ctx) {
54
+ return {
55
+ with(extraCtx) {
56
+ return buildLogger({ ...ctx, ...extraCtx });
57
+ },
58
+ debug(msg, extra) {
59
+ emit(ctx, "debug", msg, extra);
60
+ },
61
+ info(msg, extra) {
62
+ emit(ctx, "info", msg, extra);
63
+ },
64
+ warn(msg, extra) {
65
+ emit(ctx, "warn", msg, extra);
66
+ },
67
+ error(msg, extra) {
68
+ emit(ctx, "error", msg, extra);
69
+ },
70
+ };
71
+ }
72
+ // Default ctx has a synthetic request_id so a logger created outside
73
+ // of any request boundary still produces correlatable output (visible
74
+ // in the log stream as `synthetic-…`).
75
+ return buildLogger({ requestId: `synthetic-${crypto.randomUUID().slice(0, 8)}` });
76
+ }
77
+ /**
78
+ * Mint a fresh request_id at a request boundary. Caller threads through
79
+ * ExecutionContext + outbound HTTP headers (`X-Caelo-Request-Id`).
80
+ */
81
+ export function mintRequestId() {
82
+ return crypto.randomUUID();
83
+ }
84
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Media library — shared primitives.
3
+ *
4
+ * Browser-safe: Zod schemas, MIME allowlist, size caps, the variant
5
+ * convention. Sharp + filesystem adapters live in `@caelo-cms/admin-core`
6
+ * (server-only). The storage-key shape is stable here so the static
7
+ * generator's URL rewriter and the admin's iframe resolver agree on
8
+ * the canonical form `<sha>/<variant>.<ext>`.
9
+ */
10
+ import { z } from "zod";
11
+ /**
12
+ * Allowlisted MIME types. Anything outside this set is rejected at the
13
+ * upload endpoint with `415 Unsupported Media Type`. SVG is allowed
14
+ * but capped tight to discourage XSS via embedded scripts; the upload
15
+ * pipeline strips `<script>` and event-handler attributes before
16
+ * persisting (see {@link sanitizeSvg} in admin-core).
17
+ */
18
+ export declare const MEDIA_ALLOWED_MIMES: readonly ["image/jpeg", "image/png", "image/webp", "image/avif", "image/gif", "image/svg+xml", "application/pdf", "video/mp4"];
19
+ export type MediaMime = (typeof MEDIA_ALLOWED_MIMES)[number];
20
+ /** Per-MIME size caps (bytes). Server enforces; client display only. */
21
+ export declare const MEDIA_SIZE_CAPS: Record<MediaMime, number>;
22
+ /** Hard ceiling on the multipart body. Per-MIME caps narrow further. */
23
+ export declare const MEDIA_HARD_LIMIT_BYTES: number;
24
+ /**
25
+ * Variant tags. `orig` is always present (re-encoded only for SVG
26
+ * sanitisation). Image-only WebP variants are emitted at breakpoints
27
+ * the source can satisfy — a 600px-wide source skips webp-1200 +
28
+ * webp-1600 entirely.
29
+ */
30
+ export declare const MEDIA_VARIANT_TAGS: readonly ["orig", "webp-1600", "webp-1200", "webp-800", "webp-400"];
31
+ export type MediaVariantTag = (typeof MEDIA_VARIANT_TAGS)[number];
32
+ /** Width-in-pixels target for each WebP variant. */
33
+ export declare const MEDIA_VARIANT_WIDTHS: Record<Exclude<MediaVariantTag, "orig">, number>;
34
+ /**
35
+ * Renderer-agnostic asset URL used in module HTML. Both the SvelteKit
36
+ * admin endpoint and the static generator's media-pass parse this
37
+ * shape; the static generator rewrites to `/_assets/...` (or a CDN
38
+ * URL) at deploy time.
39
+ *
40
+ * Format: `/_caelo/media/<asset-id>/<variant>`. The asset id, not the
41
+ * sha, so URLs survive a re-upload of the same content under a new id.
42
+ */
43
+ export declare const MEDIA_URL_PREFIX = "/_caelo/media";
44
+ export declare function buildMediaUrl(assetId: string, variant: MediaVariantTag): string;
45
+ /**
46
+ * Extract every (assetId, variant) pair referenced in an HTML string.
47
+ * Used by the post-write usage-tracker and by the static-generator
48
+ * media-pass. Returns a deduped list to keep callers' work proportional
49
+ * to unique assets, not raw match count.
50
+ */
51
+ export declare function extractMediaRefs(html: string): {
52
+ assetId: string;
53
+ variant: string;
54
+ }[];
55
+ export declare const mediaUploadInputSchema: z.ZodObject<{
56
+ sha256: z.ZodString;
57
+ originalName: z.ZodString;
58
+ mime: z.ZodEnum<{
59
+ "image/jpeg": "image/jpeg";
60
+ "image/png": "image/png";
61
+ "image/webp": "image/webp";
62
+ "image/avif": "image/avif";
63
+ "image/gif": "image/gif";
64
+ "image/svg+xml": "image/svg+xml";
65
+ "application/pdf": "application/pdf";
66
+ "video/mp4": "video/mp4";
67
+ }>;
68
+ sizeBytes: z.ZodNumber;
69
+ width: z.ZodNullable<z.ZodNumber>;
70
+ height: z.ZodNullable<z.ZodNumber>;
71
+ alt: z.ZodDefault<z.ZodString>;
72
+ storageKey: z.ZodString;
73
+ storageProvider: z.ZodDefault<z.ZodString>;
74
+ variants: z.ZodArray<z.ZodObject<{
75
+ variant: z.ZodString;
76
+ format: z.ZodString;
77
+ width: z.ZodNullable<z.ZodNumber>;
78
+ height: z.ZodNullable<z.ZodNumber>;
79
+ sizeBytes: z.ZodNumber;
80
+ storageKey: z.ZodString;
81
+ }, z.core.$strip>>;
82
+ }, z.core.$strict>;
83
+ export type MediaUploadInput = z.infer<typeof mediaUploadInputSchema>;
84
+ export declare const mediaListInputSchema: z.ZodObject<{
85
+ query: z.ZodOptional<z.ZodString>;
86
+ mime: z.ZodOptional<z.ZodEnum<{
87
+ "image/jpeg": "image/jpeg";
88
+ "image/png": "image/png";
89
+ "image/webp": "image/webp";
90
+ "image/avif": "image/avif";
91
+ "image/gif": "image/gif";
92
+ "image/svg+xml": "image/svg+xml";
93
+ "application/pdf": "application/pdf";
94
+ "video/mp4": "video/mp4";
95
+ }>>;
96
+ sort: z.ZodDefault<z.ZodEnum<{
97
+ recent: "recent";
98
+ most_used: "most_used";
99
+ }>>;
100
+ limit: z.ZodDefault<z.ZodNumber>;
101
+ offset: z.ZodDefault<z.ZodNumber>;
102
+ }, z.core.$strict>;
103
+ export type MediaListInput = z.infer<typeof mediaListInputSchema>;
104
+ export declare const mediaUpdateAltInputSchema: z.ZodObject<{
105
+ assetId: z.ZodString;
106
+ alt: z.ZodString;
107
+ }, z.core.$strict>;
108
+ export type MediaUpdateAltInput = z.infer<typeof mediaUpdateAltInputSchema>;
109
+ export declare const mediaDeleteInputSchema: z.ZodObject<{
110
+ assetId: z.ZodString;
111
+ force: z.ZodDefault<z.ZodBoolean>;
112
+ }, z.core.$strict>;
113
+ export declare const mediaRecordUsageInputSchema: z.ZodObject<{
114
+ deltas: z.ZodRecord<z.ZodString, z.ZodNumber>;
115
+ }, z.core.$strict>;
116
+ export type MediaRecordUsageInput = z.infer<typeof mediaRecordUsageInputSchema>;
117
+ export declare const mediaRecentForAiInputSchema: z.ZodObject<{
118
+ limit: z.ZodDefault<z.ZodNumber>;
119
+ }, z.core.$strict>;
120
+ export declare const mediaSetCdnInputSchema: z.ZodObject<{
121
+ enabled: z.ZodBoolean;
122
+ threshold: z.ZodNumber;
123
+ }, z.core.$strict>;
124
+ export type MediaSetCdnInput = z.infer<typeof mediaSetCdnInputSchema>;
125
+ /**
126
+ * Object-storage abstraction. The DB never holds blob bytes — only
127
+ * metadata + the storage key. Adapters are responsible for the full
128
+ * key→bytes round-trip; the URL form they expose is renderer-agnostic
129
+ * (LocalVolumeAdapter returns `/_caelo/media/<assetId>/<variant>` so
130
+ * the SvelteKit endpoint can resolve; cloud adapters can return CDN
131
+ * URLs directly).
132
+ */
133
+ export interface MediaStorageAdapter {
134
+ put(key: string, body: Uint8Array, contentType: string): Promise<void>;
135
+ get(key: string): Promise<Uint8Array>;
136
+ delete(key: string): Promise<void>;
137
+ exists(key: string): Promise<boolean>;
138
+ /** Bytes-on-disk for capacity reporting. */
139
+ totalSizeBytes(): Promise<number>;
140
+ }
141
+ /** Build the canonical storage key for a given asset variant. */
142
+ export declare function buildStorageKey(sha256: string, variant: MediaVariantTag | string, ext: string): string;
143
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,gIAStB,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,wEAAwE;AACxE,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CASrD,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,qEAMrB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,CAKjF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAE/E;AAWD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAUrF;AAQD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyBxB,CAAC;AACZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;kBAQtB,CAAC;AACZ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,yBAAyB;;;kBAK3B,CAAC;AACZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,sBAAsB;;;kBAKxB,CAAC;AAEZ,eAAO,MAAM,2BAA2B;;kBAK7B,CAAC;AACZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,2BAA2B;;kBAI7B,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;kBAKxB,CAAC;AACZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAOtE;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,4CAA4C;IAC5C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GAAG,MAAM,EACjC,GAAG,EAAE,MAAM,GACV,MAAM,CAER"}