@krantho/config 0.0.0-stage → 1.0.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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/dist/defaults.d.ts +15 -0
  3. package/dist/defaults.d.ts.map +1 -0
  4. package/dist/defaults.js +148 -0
  5. package/dist/defaults.js.map +1 -0
  6. package/dist/define.d.ts +11 -0
  7. package/dist/define.d.ts.map +1 -0
  8. package/dist/define.js +12 -0
  9. package/dist/define.js.map +1 -0
  10. package/dist/derive.d.ts +12 -0
  11. package/dist/derive.d.ts.map +1 -0
  12. package/dist/derive.js +90 -0
  13. package/dist/derive.js.map +1 -0
  14. package/dist/env.d.ts +19 -0
  15. package/dist/env.d.ts.map +1 -0
  16. package/dist/env.js +89 -0
  17. package/dist/env.js.map +1 -0
  18. package/dist/errors.d.ts +6 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +11 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +17 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +12 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/leaves.d.ts +34 -0
  27. package/dist/leaves.d.ts.map +1 -0
  28. package/dist/leaves.js +724 -0
  29. package/dist/leaves.js.map +1 -0
  30. package/dist/llm-providers.d.ts +25 -0
  31. package/dist/llm-providers.d.ts.map +1 -0
  32. package/dist/llm-providers.js +41 -0
  33. package/dist/llm-providers.js.map +1 -0
  34. package/dist/node/index.d.ts +9 -0
  35. package/dist/node/index.d.ts.map +1 -0
  36. package/dist/node/index.js +4 -0
  37. package/dist/node/index.js.map +1 -0
  38. package/dist/node/load.d.ts +20 -0
  39. package/dist/node/load.d.ts.map +1 -0
  40. package/dist/node/load.js +48 -0
  41. package/dist/node/load.js.map +1 -0
  42. package/dist/node/route-slug.d.ts +9 -0
  43. package/dist/node/route-slug.d.ts.map +1 -0
  44. package/dist/node/route-slug.js +23 -0
  45. package/dist/node/route-slug.js.map +1 -0
  46. package/dist/node/seo-definitions.d.ts +8 -0
  47. package/dist/node/seo-definitions.d.ts.map +1 -0
  48. package/dist/node/seo-definitions.js +124 -0
  49. package/dist/node/seo-definitions.js.map +1 -0
  50. package/dist/object-path.d.ts +17 -0
  51. package/dist/object-path.d.ts.map +1 -0
  52. package/dist/object-path.js +75 -0
  53. package/dist/object-path.js.map +1 -0
  54. package/dist/production.d.ts +9 -0
  55. package/dist/production.d.ts.map +1 -0
  56. package/dist/production.js +22 -0
  57. package/dist/production.js.map +1 -0
  58. package/dist/public.d.ts +61 -0
  59. package/dist/public.d.ts.map +1 -0
  60. package/dist/public.js +65 -0
  61. package/dist/public.js.map +1 -0
  62. package/dist/reference.d.ts +8 -0
  63. package/dist/reference.d.ts.map +1 -0
  64. package/dist/reference.js +117 -0
  65. package/dist/reference.js.map +1 -0
  66. package/dist/resolve.d.ts +27 -0
  67. package/dist/resolve.d.ts.map +1 -0
  68. package/dist/resolve.js +87 -0
  69. package/dist/resolve.js.map +1 -0
  70. package/dist/schema.d.ts +437 -0
  71. package/dist/schema.d.ts.map +1 -0
  72. package/dist/schema.js +420 -0
  73. package/dist/schema.js.map +1 -0
  74. package/dist/sources.d.ts +10 -0
  75. package/dist/sources.d.ts.map +1 -0
  76. package/dist/sources.js +17 -0
  77. package/dist/sources.js.map +1 -0
  78. package/dist/types.d.ts +413 -0
  79. package/dist/types.d.ts.map +1 -0
  80. package/dist/types.js +10 -0
  81. package/dist/types.js.map +1 -0
  82. package/dist/webhook-events.d.ts +3 -0
  83. package/dist/webhook-events.d.ts.map +1 -0
  84. package/dist/webhook-events.js +3 -0
  85. package/dist/webhook-events.js.map +1 -0
  86. package/package.json +47 -3
  87. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Descoped
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,15 @@
1
+ import type { KranthoConfigInput } from './types.js';
2
+ /**
3
+ * Every default in the tree, in one place.
4
+ *
5
+ * Each value reproduces what the code did before the tree existed, so a site
6
+ * that sets nothing behaves exactly as it did. `site.domain`, `site.name`,
7
+ * `site.language` and `site.baseUrl` have no default — they identify the site
8
+ * and must come from code or the environment. `media.provider` has no default:
9
+ * media is off until a file store is chosen. `site.supportedLocales`,
10
+ * `site.defaultLocale`, `paths.seoGeneratedDir`, `persistence.sqlite.path`,
11
+ * `persistence.filesystem.contentPath`, `media.s3.publicUrl` and
12
+ * `media.gcs.publicUrl` are derived from other leaves; see `derive.ts`.
13
+ */
14
+ export declare const DEFAULTS: KranthoConfigInput;
15
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ,EAAE,kBAsItB,CAAA"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Every default in the tree, in one place.
3
+ *
4
+ * Each value reproduces what the code did before the tree existed, so a site
5
+ * that sets nothing behaves exactly as it did. `site.domain`, `site.name`,
6
+ * `site.language` and `site.baseUrl` have no default — they identify the site
7
+ * and must come from code or the environment. `media.provider` has no default:
8
+ * media is off until a file store is chosen. `site.supportedLocales`,
9
+ * `site.defaultLocale`, `paths.seoGeneratedDir`, `persistence.sqlite.path`,
10
+ * `persistence.filesystem.contentPath`, `media.s3.publicUrl` and
11
+ * `media.gcs.publicUrl` are derived from other leaves; see `derive.ts`.
12
+ */
13
+ export const DEFAULTS = {
14
+ site: { sameAs: [] },
15
+ paths: {
16
+ dataDir: '.krantho',
17
+ contentDir: 'content',
18
+ },
19
+ persistence: {
20
+ provider: 'sqlite',
21
+ sqlite: { busyTimeoutMs: 10000, walRetries: 10, walRetryDelayMs: 50 },
22
+ postgres: {},
23
+ filesystem: {},
24
+ },
25
+ content: {
26
+ cache: { enabled: true, ttlMs: 300000, maxEntries: 100 },
27
+ atNotation: true,
28
+ watch: false,
29
+ defaultStatus: { filesystem: 'published' },
30
+ list: {},
31
+ search: { minQueryLength: 2, defaultLimit: 200, maxLimit: 500 },
32
+ versions: { keep: 10 },
33
+ lock: { leaseMs: 300000 },
34
+ },
35
+ cache: {
36
+ pages: 'none',
37
+ cdn: {
38
+ provider: 'none',
39
+ sMaxAgeSec: 86400,
40
+ staleWhileRevalidateSec: 604800,
41
+ tagHeader: 'x-krantho-cache-tag',
42
+ cloudfront: {},
43
+ gcp: {},
44
+ },
45
+ shared: 'none',
46
+ },
47
+ auth: {
48
+ mode: 'none',
49
+ requireAuthForReads: false,
50
+ token: { email: 'admin@local', role: 'admin' },
51
+ oidc: {
52
+ postLogoutUri: '/studio/',
53
+ scopes: ['openid', 'email', 'profile'],
54
+ signup: 'closed',
55
+ studioEntry: 'login',
56
+ adminEmails: [],
57
+ newUserRole: 'viewer',
58
+ },
59
+ workload: { subjects: [] },
60
+ session: {
61
+ accessTtlSec: 900,
62
+ refreshTtlSec: 2592000,
63
+ cookiePrefix: 'krantho',
64
+ secure: 'auto',
65
+ sameSite: 'lax',
66
+ },
67
+ trustProxy: false,
68
+ },
69
+ secrets: { provider: 'local', local: {} },
70
+ media: {
71
+ local: { dir: 'public/uploads', urlPrefix: '/uploads' },
72
+ vercelBlob: {},
73
+ s3: { forcePathStyle: false },
74
+ gcs: {},
75
+ maxFileSize: 10485760,
76
+ allowedMimeTypes: [
77
+ 'image/jpeg',
78
+ 'image/png',
79
+ 'image/gif',
80
+ 'image/webp',
81
+ 'image/avif',
82
+ 'image/svg+xml',
83
+ ],
84
+ image: {
85
+ maxWidth: 2048,
86
+ quality: { jpeg: 82, webp: 80, avif: 65, normalize: 85 },
87
+ presets: { xs: 48, sm: 96, md: 256, lg: 512, xl: 1024, full: null },
88
+ cache: { maxEntries: 1000, maxMb: 256, ttiSec: 3600 },
89
+ },
90
+ },
91
+ llm: {
92
+ provider: 'anthropic',
93
+ anthropic: {},
94
+ openai: {},
95
+ gemini: {},
96
+ openrouter: {},
97
+ claudeCode: {},
98
+ profiles: {},
99
+ },
100
+ assistant: {
101
+ enabled: false,
102
+ role: 'editor',
103
+ confirmTtlSec: 600,
104
+ limits: {
105
+ maxTurns: 8,
106
+ maxToolCalls: 16,
107
+ maxTokens: 16000,
108
+ maxRequestTokens: 200000,
109
+ maxHistoryMessages: 40,
110
+ maxInputChars: 60000,
111
+ toolResultChars: 12000,
112
+ },
113
+ },
114
+ seo: {
115
+ collections: {},
116
+ routes: {},
117
+ richCollections: {},
118
+ richRoutes: {},
119
+ seedMode: 'seed',
120
+ readers: ['google', 'bing'],
121
+ indexNow: {},
122
+ enrichment: {
123
+ meta: { minChars: 120, maxChars: 155, contentCap: 2000, maxTokens: 1024 },
124
+ title: { maxChars: 70 },
125
+ archetype: { contentCap: 3000, maxTokens: 2048 },
126
+ },
127
+ },
128
+ webhooks: [],
129
+ tools: {
130
+ concurrency: 5,
131
+ enrich: {
132
+ serviceCap: 1500,
133
+ llmsDescriptionCap: 300,
134
+ faqMinPerRoute: 5,
135
+ // The kinds of field every site has: descriptions, navigation, footer, forms.
136
+ // A site's own field names are added in its krantho.config.ts.
137
+ skipFields: [
138
+ 'description',
139
+ 'meta-description',
140
+ 'meta-description-*',
141
+ 'nav-*',
142
+ 'footer-*',
143
+ 'form-*',
144
+ ],
145
+ },
146
+ },
147
+ };
148
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { KranthoConfigInput } from './types.js';
2
+ /**
3
+ * Declare a site's configuration.
4
+ *
5
+ * The call is a typed identity function: it gives `krantho.config.ts` its
6
+ * shape and its editor completions. Nothing is resolved here — the server and
7
+ * the tools hand the result to {@link resolveConfig}, which layers the
8
+ * environment on top and validates the whole tree once.
9
+ */
10
+ export declare function defineKranthoConfig(config: KranthoConfigInput): KranthoConfigInput;
11
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAElF"}
package/dist/define.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Declare a site's configuration.
3
+ *
4
+ * The call is a typed identity function: it gives `krantho.config.ts` its
5
+ * shape and its editor completions. Nothing is resolved here — the server and
6
+ * the tools hand the result to {@link resolveConfig}, which layers the
7
+ * environment on top and validates the whole tree once.
8
+ */
9
+ export function defineKranthoConfig(config) {
10
+ return config;
11
+ }
12
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA0B;IAC5D,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Fill the leaves whose default is computed from another leaf, then turn every
3
+ * filesystem path into an absolute one.
4
+ *
5
+ * Runs on the merged tree before validation, so a derived value is validated
6
+ * like any other and a site that sets nothing gets the same absolute paths the
7
+ * code produced before the tree existed.
8
+ */
9
+ export declare function derive(merged: Record<string, unknown>, cwd: string): Record<string, unknown>;
10
+ /** Dotted paths of every scalar the developer or the environment supplied */
11
+ export declare function suppliedPaths(source: unknown, prefix?: string): string[];
12
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"AA0CA;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8B5F;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAapE"}
package/dist/derive.js ADDED
@@ -0,0 +1,90 @@
1
+ import { isAbsolute, join, resolve as resolvePath } from 'node:path';
2
+ import { getPath, isPlainObject, setPath } from './object-path.js';
3
+ /** Paths holding a filesystem location that is resolved against the working directory */
4
+ const PATH_LEAVES = [
5
+ 'paths.dataDir',
6
+ 'paths.contentDir',
7
+ 'paths.seoGeneratedDir',
8
+ 'persistence.sqlite.path',
9
+ 'persistence.filesystem.contentPath',
10
+ 'media.local.dir',
11
+ 'seo.configDir',
12
+ ];
13
+ function fillIfAbsent(target, path, value) {
14
+ if (getPath(target, path) === undefined)
15
+ setPath(target, path, value);
16
+ }
17
+ /**
18
+ * SQLite reads `:memory:` and `file:` URIs as instructions, not as locations.
19
+ * Resolving them against the working directory would turn an in-memory database
20
+ * into a file called `:memory:` in the project root.
21
+ */
22
+ function isFilesystemLocation(value) {
23
+ return value !== ':memory:' && !value.startsWith('file:');
24
+ }
25
+ /** Public bucket URLs of the object stores that have a canonical one */
26
+ function deriveMediaPublicUrls(tree) {
27
+ const s3Bucket = getPath(tree, 'media.s3.bucket');
28
+ const s3Region = getPath(tree, 'media.s3.region');
29
+ const s3Endpoint = getPath(tree, 'media.s3.endpoint');
30
+ if (typeof s3Bucket === 'string' && typeof s3Region === 'string' && s3Endpoint === undefined) {
31
+ fillIfAbsent(tree, 'media.s3.publicUrl', `https://${s3Bucket}.s3.${s3Region}.amazonaws.com`);
32
+ }
33
+ const gcsBucket = getPath(tree, 'media.gcs.bucket');
34
+ if (typeof gcsBucket === 'string') {
35
+ fillIfAbsent(tree, 'media.gcs.publicUrl', `https://storage.googleapis.com/${gcsBucket}`);
36
+ }
37
+ }
38
+ /**
39
+ * Fill the leaves whose default is computed from another leaf, then turn every
40
+ * filesystem path into an absolute one.
41
+ *
42
+ * Runs on the merged tree before validation, so a derived value is validated
43
+ * like any other and a site that sets nothing gets the same absolute paths the
44
+ * code produced before the tree existed.
45
+ */
46
+ export function derive(merged, cwd) {
47
+ const tree = structuredClone(merged);
48
+ const language = getPath(tree, 'site.language');
49
+ if (typeof language === 'string') {
50
+ fillIfAbsent(tree, 'site.supportedLocales', [language]);
51
+ fillIfAbsent(tree, 'site.defaultLocale', language);
52
+ }
53
+ const dataDir = getPath(tree, 'paths.dataDir');
54
+ if (typeof dataDir === 'string') {
55
+ fillIfAbsent(tree, 'persistence.sqlite.path', join(dataDir, 'content.db'));
56
+ }
57
+ const contentDir = getPath(tree, 'paths.contentDir');
58
+ if (typeof contentDir === 'string') {
59
+ fillIfAbsent(tree, 'persistence.filesystem.contentPath', contentDir);
60
+ fillIfAbsent(tree, 'paths.seoGeneratedDir', join(contentDir, 'seo', 'generated'));
61
+ }
62
+ deriveMediaPublicUrls(tree);
63
+ for (const path of PATH_LEAVES) {
64
+ const value = getPath(tree, path);
65
+ if (typeof value !== 'string' || isAbsolute(value))
66
+ continue;
67
+ if (!isFilesystemLocation(value))
68
+ continue;
69
+ setPath(tree, path, resolvePath(cwd, value));
70
+ }
71
+ return tree;
72
+ }
73
+ /** Dotted paths of every scalar the developer or the environment supplied */
74
+ export function suppliedPaths(source, prefix = '') {
75
+ if (!isPlainObject(source))
76
+ return prefix ? [prefix] : [];
77
+ const paths = [];
78
+ for (const [key, value] of Object.entries(source)) {
79
+ if (value === undefined)
80
+ continue;
81
+ const path = prefix ? `${prefix}.${key}` : key;
82
+ if (isPlainObject(value)) {
83
+ paths.push(...suppliedPaths(value, path));
84
+ continue;
85
+ }
86
+ paths.push(path);
87
+ }
88
+ return paths;
89
+ }
90
+ //# sourceMappingURL=derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"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"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import type { LeafSpec } from './leaves.js';
2
+ /** A problem found while reading one environment variable */
3
+ export interface EnvIssue {
4
+ /** Variable that carried the bad value */
5
+ env: string;
6
+ /** Configuration path it feeds */
7
+ path: string;
8
+ message: string;
9
+ }
10
+ /** The overlay built from the environment, with the paths it set */
11
+ export interface EnvOverlay {
12
+ values: Record<string, unknown>;
13
+ /** Configuration paths this overlay supplies, mapped to the variable that supplied them */
14
+ origins: Map<string, string>;
15
+ issues: EnvIssue[];
16
+ }
17
+ /** Build the configuration overlay the environment contributes to the given leaves */
18
+ export declare function buildEnvOverlay(env: Record<string, string | undefined>, leaves?: readonly LeafSpec[]): EnvOverlay;
19
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI3C,6DAA6D;AAC7D,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,2FAA2F;IAC3F,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAA;CACnB;AA+DD,sFAAsF;AACtF,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,GAAE,SAAS,QAAQ,EAAW,GACnC,UAAU,CA2BZ"}
package/dist/env.js ADDED
@@ -0,0 +1,89 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { envNameFor, LEAVES } from './leaves.js';
3
+ import { setPath } from './object-path.js';
4
+ const TRUE_WORDS = new Set(['true', '1', 'yes', 'on']);
5
+ const FALSE_WORDS = new Set(['false', '0', 'no', 'off']);
6
+ function parseLeafValue(leaf, raw) {
7
+ switch (leaf.kind) {
8
+ case 'int': {
9
+ if (!/^-?\d+$/.test(raw.trim())) {
10
+ return { message: `expected an integer, got ${JSON.stringify(raw)}` };
11
+ }
12
+ return { value: Number.parseInt(raw.trim(), 10) };
13
+ }
14
+ case 'boolean': {
15
+ const word = raw.trim().toLowerCase();
16
+ if (TRUE_WORDS.has(word))
17
+ return { value: true };
18
+ if (FALSE_WORDS.has(word))
19
+ return { value: false };
20
+ return {
21
+ message: `expected a boolean (true/false, 1/0, yes/no, on/off), got ${JSON.stringify(raw)}`,
22
+ };
23
+ }
24
+ case 'list': {
25
+ return {
26
+ value: raw
27
+ .split(',')
28
+ .map((entry) => entry.trim())
29
+ .filter((entry) => entry.length > 0),
30
+ };
31
+ }
32
+ default:
33
+ return { value: raw };
34
+ }
35
+ }
36
+ /**
37
+ * Read a leaf's raw string from the environment.
38
+ *
39
+ * The variable itself wins; a secret leaf also accepts a `_FILE` suffix naming
40
+ * a file to read the value from. An empty value counts as unset.
41
+ */
42
+ function readRaw(leaf, name, env) {
43
+ const direct = env[name];
44
+ if (direct !== undefined && direct !== '')
45
+ return { raw: direct, from: name };
46
+ if (!leaf.secret)
47
+ return null;
48
+ const fileName = `${name}_FILE`;
49
+ const filePath = env[fileName];
50
+ if (filePath === undefined || filePath === '')
51
+ return null;
52
+ try {
53
+ const contents = readFileSync(filePath, 'utf8').trim();
54
+ if (contents === '')
55
+ return { message: `file ${filePath} is empty`, from: fileName };
56
+ return { raw: contents, from: fileName };
57
+ }
58
+ catch (err) {
59
+ const reason = err instanceof Error ? err.message : String(err);
60
+ return { message: `cannot read ${filePath}: ${reason}`, from: fileName };
61
+ }
62
+ }
63
+ /** Build the configuration overlay the environment contributes to the given leaves */
64
+ export function buildEnvOverlay(env, leaves = LEAVES) {
65
+ const values = {};
66
+ const origins = new Map();
67
+ const issues = [];
68
+ for (const leaf of leaves) {
69
+ const name = envNameFor(leaf);
70
+ if (name === null)
71
+ continue;
72
+ const read = readRaw(leaf, name, env);
73
+ if (read === null)
74
+ continue;
75
+ if ('message' in read) {
76
+ issues.push({ env: read.from, path: leaf.path, message: read.message });
77
+ continue;
78
+ }
79
+ const parsed = parseLeafValue(leaf, read.raw);
80
+ if ('message' in parsed) {
81
+ issues.push({ env: read.from, path: leaf.path, message: parsed.message });
82
+ continue;
83
+ }
84
+ setPath(values, leaf.path, parsed.value);
85
+ origins.set(leaf.path, read.from);
86
+ }
87
+ return { values, origins, issues };
88
+ }
89
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Every problem found while resolving the configuration, reported at once */
2
+ export declare class KranthoConfigError extends Error {
3
+ readonly issues: readonly string[];
4
+ constructor(issues: readonly string[]);
5
+ }
6
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;gBAEtB,MAAM,EAAE,SAAS,MAAM,EAAE;CAMtC"}
package/dist/errors.js ADDED
@@ -0,0 +1,11 @@
1
+ /** Every problem found while resolving the configuration, reported at once */
2
+ export class KranthoConfigError extends Error {
3
+ issues;
4
+ constructor(issues) {
5
+ const body = issues.map((issue) => ` - ${issue}`).join('\n');
6
+ super(`Invalid krantho configuration:\n${body}`);
7
+ this.name = 'KranthoConfigError';
8
+ this.issues = issues;
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAAmB;IAElC,YAAY,MAAyB;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7D,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export { DEFAULTS } from './defaults.js';
2
+ export { defineKranthoConfig } from './define.js';
3
+ export { KranthoConfigError } from './errors.js';
4
+ export type { LeafKind, LeafSpec } from './leaves.js';
5
+ export { envNameFor, LEAVES, leafByPath, mechanicalEnvName, SECRET_PATHS } from './leaves.js';
6
+ export type { LlmCredentialLeaf, LlmCredentialType, LlmProviderName } from './llm-providers.js';
7
+ export { claudeCodeTokenMissing, LLM_PROVIDERS, llmCredentialLeaf } from './llm-providers.js';
8
+ export { productionWarnings } from './production.js';
9
+ export type { PublicConfig } from './public.js';
10
+ export { REDACTED, redact, toPublicConfig } from './public.js';
11
+ export { envReference } from './reference.js';
12
+ export type { ResolveOptions } from './resolve.js';
13
+ export { resolveConfig, resolvePersistence } from './resolve.js';
14
+ export { isConfigured } from './sources.js';
15
+ export type { AssistantRole, AssistantSection, AuthMode, AuthSection, CacheCdnProvider, CacheSection, CdnSection, ConfigSource, ConfigSources, ContentSection, CookieSameSite, CookieSecurePolicy, DeepPartial, FilesystemPersistenceSection, GcsMediaSection, KranthoConfig, KranthoConfigInput, KranthoConfigTree, LlmModelProfile, LlmSection, LocalMediaSection, MediaProvider, MediaSection, PageCacheStrategy, PathsSection, PersistenceProvider, PersistenceSection, PostgresPersistenceSection, S3MediaSection, SecretsProvider, SecretsSection, SeedMode, SeoDefinitions, SeoEntityConfig, SeoScopeConfig, SeoSection, SeoStructureConfig, ServerConfig, SharedCacheStrategy, SignupMode, SiteSection, SqlitePersistenceSection, StudioEntry, ToolsSection, VercelBlobMediaSection, WebhookEvent, WebhookTarget, } from './types.js';
16
+ export { WEBHOOK_EVENTS } from './webhook-events.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC7F,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAC/F,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,4BAA4B,EAC5B,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,cAAc,EACd,eAAe,EACf,cAAc,EACd,QAAQ,EACR,cAAc,EACd,eAAe,EACf,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { DEFAULTS } from './defaults.js';
2
+ export { defineKranthoConfig } from './define.js';
3
+ export { KranthoConfigError } from './errors.js';
4
+ export { envNameFor, LEAVES, leafByPath, mechanicalEnvName, SECRET_PATHS } from './leaves.js';
5
+ export { claudeCodeTokenMissing, LLM_PROVIDERS, llmCredentialLeaf } from './llm-providers.js';
6
+ export { productionWarnings } from './production.js';
7
+ export { REDACTED, redact, toPublicConfig } from './public.js';
8
+ export { envReference } from './reference.js';
9
+ export { resolveConfig, resolvePersistence } from './resolve.js';
10
+ export { isConfigured } from './sources.js';
11
+ export { WEBHOOK_EVENTS } from './webhook-events.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE7F,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAkD3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,34 @@
1
+ /** How an environment variable's string is turned into a configuration value */
2
+ export type LeafKind = 'string' | 'int' | 'boolean' | 'list' | 'structured';
3
+ /** One configurable leaf of the tree */
4
+ export interface LeafSpec {
5
+ /** Dotted path into the resolved tree */
6
+ path: string;
7
+ kind: LeafKind;
8
+ /**
9
+ * Environment variable name. Omitted means the mechanical
10
+ * `KRANTHO_<SECTION>_<KEY>` form derived from {@link LeafSpec.path}.
11
+ * `structured` leaves have no environment override.
12
+ */
13
+ env?: string;
14
+ /** Secret leaves are redacted, never serialized to a browser, and accept a `_FILE` suffix */
15
+ secret?: true;
16
+ description: string;
17
+ }
18
+ /** Derive the mechanical environment variable name for a dotted path */
19
+ export declare function mechanicalEnvName(path: string): string;
20
+ /** The environment variable a leaf reads, or null when it has none */
21
+ export declare function envNameFor(leaf: LeafSpec): string | null;
22
+ /**
23
+ * Every leaf of the configuration tree.
24
+ *
25
+ * The `env` overrides are the variables that existed before the tree did, which
26
+ * keep their names so running deployments keep working, and the one credential
27
+ * whose name states what the token is. Everything else takes the mechanical form.
28
+ */
29
+ export declare const LEAVES: readonly LeafSpec[];
30
+ /** Look a leaf up by its dotted path */
31
+ export declare function leafByPath(path: string): LeafSpec | undefined;
32
+ /** Dotted paths of every secret leaf */
33
+ export declare const SECRET_PATHS: readonly string[];
34
+ //# sourceMappingURL=leaves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leaves.d.ts","sourceRoot":"","sources":["../src/leaves.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,CAAA;AAE3E,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;IACd;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,6FAA6F;IAC7F,MAAM,CAAC,EAAE,IAAI,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,SAAS,QAAQ,EA+uBrC,CAAA;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE7D;AAED,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAEzC,CAAA"}