@zhin.js/gateway 0.0.0-stage → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -2
- package/lib/config/ai-config-loader.d.ts +22 -0
- package/lib/config/ai-config-loader.js +96 -0
- package/lib/config/configuration-chat-policy.d.ts +57 -0
- package/lib/config/configuration-chat-policy.js +423 -0
- package/lib/config/configuration-patch.d.ts +16 -0
- package/lib/config/configuration-patch.js +105 -0
- package/lib/config/configuration-path.d.ts +6 -0
- package/lib/config/configuration-path.js +40 -0
- package/lib/config/configuration-projection.d.ts +6 -0
- package/lib/config/configuration-projection.js +28 -0
- package/lib/config/configuration-redaction.d.ts +24 -0
- package/lib/config/configuration-redaction.js +128 -0
- package/lib/config/configuration.d.ts +81 -0
- package/lib/config/configuration.js +686 -0
- package/lib/config/console-schema.d.ts +11 -0
- package/lib/config/console-schema.js +222 -0
- package/lib/config/environment-files.d.ts +2 -0
- package/lib/config/environment-files.js +21 -0
- package/lib/config/plugin-package-map.d.ts +2 -0
- package/lib/config/plugin-package-map.js +14 -0
- package/lib/config/plugin-schema-catalog.d.ts +22 -0
- package/lib/config/plugin-schema-catalog.js +262 -0
- package/lib/config.d.ts +12 -0
- package/lib/config.js +12 -0
- package/lib/database/config.d.ts +22 -0
- package/lib/database/config.js +159 -0
- package/lib/database/index.d.ts +2 -0
- package/lib/database/index.js +2 -0
- package/lib/database/project-database.d.ts +31 -0
- package/lib/database/project-database.js +130 -0
- package/lib/database.d.ts +2 -0
- package/lib/database.js +2 -0
- package/lib/http/console-rpc.d.ts +19 -0
- package/lib/http/console-rpc.js +51 -0
- package/lib/http/gateway-console.d.ts +63 -0
- package/lib/http/gateway-console.js +309 -0
- package/lib/http/gateway-events.d.ts +35 -0
- package/lib/http/gateway-events.js +172 -0
- package/lib/http/gateway-http-server.d.ts +95 -0
- package/lib/http/gateway-http-server.js +518 -0
- package/lib/http/local-principal.d.ts +2 -0
- package/lib/http/local-principal.js +16 -0
- package/lib/http/run-gateway.d.ts +43 -0
- package/lib/http/run-gateway.js +268 -0
- package/lib/http/start-gateway.d.ts +114 -0
- package/lib/http/start-gateway.js +220 -0
- package/lib/http-response.d.ts +6 -0
- package/lib/http-response.js +25 -0
- package/lib/http.d.ts +6 -0
- package/lib/http.js +6 -0
- package/lib/iam/crypto.d.ts +12 -0
- package/lib/iam/crypto.js +58 -0
- package/lib/iam/index.d.ts +8 -0
- package/lib/iam/index.js +8 -0
- package/lib/iam/install.d.ts +36 -0
- package/lib/iam/install.js +74 -0
- package/lib/iam/local-admin.d.ts +27 -0
- package/lib/iam/local-admin.js +102 -0
- package/lib/iam/rate-limit.d.ts +15 -0
- package/lib/iam/rate-limit.js +52 -0
- package/lib/iam/routes.d.ts +23 -0
- package/lib/iam/routes.js +157 -0
- package/lib/iam/rpc.d.ts +14 -0
- package/lib/iam/rpc.js +100 -0
- package/lib/iam/service.d.ts +203 -0
- package/lib/iam/service.js +784 -0
- package/lib/iam/setup-service.d.ts +83 -0
- package/lib/iam/setup-service.js +206 -0
- package/lib/iam/tables.d.ts +20 -0
- package/lib/iam/tables.js +82 -0
- package/lib/iam.d.ts +2 -0
- package/lib/iam.js +2 -0
- package/lib/index.d.ts +22 -0
- package/lib/index.js +22 -0
- package/lib/local/client.d.ts +71 -0
- package/lib/local/client.js +296 -0
- package/lib/local/handler.d.ts +30 -0
- package/lib/local/handler.js +86 -0
- package/lib/local/local-socket.d.ts +55 -0
- package/lib/local/local-socket.js +232 -0
- package/lib/local/paths.d.ts +34 -0
- package/lib/local/paths.js +58 -0
- package/lib/local/protocol.d.ts +140 -0
- package/lib/local/protocol.js +90 -0
- package/lib/local/state-file.d.ts +8 -0
- package/lib/local/state-file.js +45 -0
- package/lib/local.d.ts +10 -0
- package/lib/local.js +10 -0
- package/lib/onboarding/allowlist.d.ts +54 -0
- package/lib/onboarding/allowlist.js +106 -0
- package/lib/onboarding/errors.d.ts +7 -0
- package/lib/onboarding/errors.js +17 -0
- package/lib/onboarding/index.d.ts +6 -0
- package/lib/onboarding/index.js +6 -0
- package/lib/onboarding/install.d.ts +99 -0
- package/lib/onboarding/install.js +132 -0
- package/lib/onboarding/package-manager.d.ts +47 -0
- package/lib/onboarding/package-manager.js +179 -0
- package/lib/onboarding/service.d.ts +53 -0
- package/lib/onboarding/service.js +144 -0
- package/lib/onboarding/state-store.d.ts +26 -0
- package/lib/onboarding/state-store.js +97 -0
- package/lib/onboarding.d.ts +2 -0
- package/lib/onboarding.js +2 -0
- package/lib/packages/authorization.d.ts +23 -0
- package/lib/packages/authorization.js +109 -0
- package/lib/packages/errors.d.ts +11 -0
- package/lib/packages/errors.js +26 -0
- package/lib/packages/index.d.ts +5 -0
- package/lib/packages/index.js +5 -0
- package/lib/packages/rpc.d.ts +30 -0
- package/lib/packages/rpc.js +155 -0
- package/lib/packages/service.d.ts +121 -0
- package/lib/packages/service.js +441 -0
- package/lib/packages/snapshot.d.ts +14 -0
- package/lib/packages/snapshot.js +73 -0
- package/lib/packages.d.ts +2 -0
- package/lib/packages.js +2 -0
- package/lib/plugin-management/activity.d.ts +6 -0
- package/lib/plugin-management/activity.js +14 -0
- package/lib/plugin-management/config-explanation.d.ts +6 -0
- package/lib/plugin-management/config-explanation.js +113 -0
- package/lib/plugin-management/use-cases.d.ts +15 -0
- package/lib/plugin-management/use-cases.js +120 -0
- package/lib/plugin-management/workflow.d.ts +92 -0
- package/lib/plugin-management/workflow.js +772 -0
- package/lib/plugin-management.d.ts +5 -0
- package/lib/plugin-management.js +5 -0
- package/lib/project/config-file.d.ts +6 -0
- package/lib/project/config-file.js +58 -0
- package/lib/project/environment.d.ts +13 -0
- package/lib/project/environment.js +52 -0
- package/lib/project/instance-declarations.d.ts +55 -0
- package/lib/project/instance-declarations.js +542 -0
- package/lib/project/legacy-config.d.ts +25 -0
- package/lib/project/legacy-config.js +70 -0
- package/lib/project/node-requirements.d.ts +7 -0
- package/lib/project/node-requirements.js +20 -0
- package/lib/project/tsx-module-loader.d.ts +7 -0
- package/lib/project/tsx-module-loader.js +29 -0
- package/lib/project.d.ts +7 -0
- package/lib/project.js +7 -0
- package/lib/server.d.ts +11 -0
- package/lib/server.js +11 -0
- package/lib/supervisor/instance-logs.d.ts +39 -0
- package/lib/supervisor/instance-logs.js +152 -0
- package/lib/supervisor/instance-supervisor.d.ts +140 -0
- package/lib/supervisor/instance-supervisor.js +408 -0
- package/lib/supervisor/run-instance.d.ts +35 -0
- package/lib/supervisor/run-instance.js +161 -0
- package/lib/supervisor/terminal-state.d.ts +30 -0
- package/lib/supervisor/terminal-state.js +57 -0
- package/lib/supervisor.d.ts +4 -0
- package/lib/supervisor.js +4 -0
- package/lib/terminal/backends.d.ts +38 -0
- package/lib/terminal/backends.js +193 -0
- package/lib/terminal/config.d.ts +63 -0
- package/lib/terminal/config.js +237 -0
- package/lib/terminal/host.d.ts +26 -0
- package/lib/terminal/host.js +76 -0
- package/lib/terminal/index.d.ts +60 -0
- package/lib/terminal/index.js +135 -0
- package/lib/terminal/modules.d.ts +87 -0
- package/lib/terminal/modules.js +44 -0
- package/lib/terminal/service.d.ts +101 -0
- package/lib/terminal/service.js +455 -0
- package/lib/terminal/tickets.d.ts +46 -0
- package/lib/terminal/tickets.js +76 -0
- package/lib/terminal.d.ts +3 -0
- package/lib/terminal.js +3 -0
- package/lib/usage/aggregate.d.ts +87 -0
- package/lib/usage/aggregate.js +212 -0
- package/lib/usage.d.ts +2 -0
- package/lib/usage.js +2 -0
- package/package.json +116 -3
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const unsupportedApplicators = Object.freeze([
|
|
2
|
+
'if', 'then', 'else', 'not', 'contains', 'dependencies', 'dependentSchemas',
|
|
3
|
+
'$dynamicRef', '$recursiveRef', '$dynamicAnchor', 'unevaluatedProperties', 'unevaluatedItems',
|
|
4
|
+
]);
|
|
5
|
+
/** Shared proof limit: these branches/resources need a resolver we do not provide. */
|
|
6
|
+
export function isUnknownConfigurationSchemaBoundary(schema, root) {
|
|
7
|
+
return schema !== root && Object.hasOwn(schema, '$id')
|
|
8
|
+
|| unsupportedApplicators.some(keyword => Object.hasOwn(schema, keyword))
|
|
9
|
+
|| schema.$ref !== undefined && (typeof schema.$ref !== 'string' || !schema.$ref.startsWith('#/') || /~(?![01])/u.test(schema.$ref));
|
|
10
|
+
}
|
|
11
|
+
/** Credential names, excluding ordinary budgets such as maxTokens and tokenLimit. */
|
|
12
|
+
export function sensitiveConfigKey(key) {
|
|
13
|
+
const normalized = key.replace(/[^a-z0-9]/giu, '').toLowerCase();
|
|
14
|
+
return /(?:password|passwd|secret|apikey|accesskey|privatekey|encrypt(?:ion)?key|encodingaeskey|credential|authorization|cookie)/u.test(normalized)
|
|
15
|
+
|| normalized === 'pwd' || /(?:^|api|access|refresh|auth|bearer|bot|oauth|session|private|client|app|verify|verification)tokens?(?:v[0-9]+)?$/u.test(normalized);
|
|
16
|
+
}
|
|
17
|
+
export const REDACTED_CONFIG_VALUE = '[redacted]';
|
|
18
|
+
const MAX_DEPTH = 32;
|
|
19
|
+
// Retain uncertainty without changing the non-strict masker's best-effort behavior.
|
|
20
|
+
const unresolvedSchema = Object.freeze({});
|
|
21
|
+
function record(value) {
|
|
22
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
23
|
+
}
|
|
24
|
+
function sensitiveSchema(schema) {
|
|
25
|
+
const metadata = schema['x-zhin-config'];
|
|
26
|
+
// `hidden` mirrors the configuration explanation contract: hidden fields are never echoed.
|
|
27
|
+
return schema.writeOnly === true || schema.secret === true || schema.hidden === true
|
|
28
|
+
|| schema.format === 'password' || schema.component === 'password'
|
|
29
|
+
|| record(metadata) && (metadata.secret === true || metadata.hidden === true || metadata.component === 'password');
|
|
30
|
+
}
|
|
31
|
+
/** Expands local `$ref` and every combinator branch; any branch's annotation applies. */
|
|
32
|
+
function expand(node, root, seen = new Set()) {
|
|
33
|
+
if (!record(node) || seen.has(node) || seen.size > MAX_DEPTH)
|
|
34
|
+
return [unresolvedSchema];
|
|
35
|
+
const nextSeen = new Set([...seen, node]);
|
|
36
|
+
const nodes = [node];
|
|
37
|
+
if (typeof node.$ref === 'string' && node.$ref.startsWith('#/')) {
|
|
38
|
+
let referenced = root;
|
|
39
|
+
for (const raw of node.$ref.slice(2).split('/')) {
|
|
40
|
+
const key = raw.replaceAll('~1', '/').replaceAll('~0', '~');
|
|
41
|
+
referenced = record(referenced) && Object.hasOwn(referenced, key) ? referenced[key] : undefined;
|
|
42
|
+
}
|
|
43
|
+
nodes.push(...expand(referenced, root, nextSeen));
|
|
44
|
+
}
|
|
45
|
+
for (const keyword of ['allOf', 'anyOf', 'oneOf']) {
|
|
46
|
+
const branches = node[keyword];
|
|
47
|
+
if (Array.isArray(branches))
|
|
48
|
+
for (const branch of branches)
|
|
49
|
+
nodes.push(...expand(branch, root, nextSeen));
|
|
50
|
+
}
|
|
51
|
+
return nodes;
|
|
52
|
+
}
|
|
53
|
+
function children(nodes, key, root) {
|
|
54
|
+
const next = [];
|
|
55
|
+
for (const node of nodes) {
|
|
56
|
+
let matched = false;
|
|
57
|
+
if (record(node.properties) && Object.hasOwn(node.properties, key)) {
|
|
58
|
+
next.push(...expand(node.properties[key], root));
|
|
59
|
+
matched = true;
|
|
60
|
+
}
|
|
61
|
+
if (record(node.patternProperties)) {
|
|
62
|
+
for (const [pattern, child] of Object.entries(node.patternProperties)) {
|
|
63
|
+
let test = false;
|
|
64
|
+
try {
|
|
65
|
+
test = new RegExp(pattern, 'u').test(key);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
test = false;
|
|
69
|
+
}
|
|
70
|
+
if (test) {
|
|
71
|
+
next.push(...expand(child, root));
|
|
72
|
+
matched = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (!matched && record(node.additionalProperties))
|
|
77
|
+
next.push(...expand(node.additionalProperties, root));
|
|
78
|
+
if (/^(?:0|[1-9][0-9]*)$/u.test(key)) {
|
|
79
|
+
const index = Number(key);
|
|
80
|
+
if (Array.isArray(node.prefixItems) && index < node.prefixItems.length)
|
|
81
|
+
next.push(...expand(node.prefixItems[index], root));
|
|
82
|
+
else if (record(node.items))
|
|
83
|
+
next.push(...expand(node.items, root));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return next;
|
|
87
|
+
}
|
|
88
|
+
function maskTree(value, nodes, root, depth, hidden) {
|
|
89
|
+
if (nodes.some(hidden))
|
|
90
|
+
return REDACTED_CONFIG_VALUE;
|
|
91
|
+
if (typeof value === 'string')
|
|
92
|
+
return /\$\{|^env:\/\//u.test(value) ? REDACTED_CONFIG_VALUE : value;
|
|
93
|
+
if (value === null || typeof value !== 'object')
|
|
94
|
+
return value;
|
|
95
|
+
if (depth >= MAX_DEPTH)
|
|
96
|
+
return REDACTED_CONFIG_VALUE;
|
|
97
|
+
if (Array.isArray(value)) {
|
|
98
|
+
return Object.freeze(value.map((item, index) => maskTree(item, children(nodes, String(index), root), root, depth + 1, hidden)));
|
|
99
|
+
}
|
|
100
|
+
return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, item]) => [key,
|
|
101
|
+
sensitiveConfigKey(key) ? REDACTED_CONFIG_VALUE : maskTree(item, children(nodes, key, root), root, depth + 1, hidden)])));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Masks `value`, stored at `path` (first segment is the section) under `sectionSchema`.
|
|
105
|
+
* A missing schema still applies key and environment-reference masking.
|
|
106
|
+
* `unknownSchema: 'redact'` (project reads and conflict evidence) also replaces any value under a schema
|
|
107
|
+
* boundary this masker cannot prove (`if`/`not`/`contains`/…, nested `$id`, non-local
|
|
108
|
+
* `$ref`; the chat policy's {@link isUnknownConfigurationSchemaBoundary}), since a secret
|
|
109
|
+
* annotation could hide behind it.
|
|
110
|
+
*/
|
|
111
|
+
export function maskConfigValue(sectionSchema, path, value, options = {}) {
|
|
112
|
+
const root = record(sectionSchema) ? sectionSchema : {};
|
|
113
|
+
const hidden = options.unknownSchema === 'redact'
|
|
114
|
+
? node => node === unresolvedSchema || sensitiveSchema(node) || isUnknownConfigurationSchemaBoundary(node, root) : sensitiveSchema;
|
|
115
|
+
let nodes = record(sectionSchema) ? expand(sectionSchema, root) : [];
|
|
116
|
+
if (path.length > 0 && sensitiveConfigKey(path[0]))
|
|
117
|
+
return REDACTED_CONFIG_VALUE;
|
|
118
|
+
if (nodes.some(hidden))
|
|
119
|
+
return REDACTED_CONFIG_VALUE;
|
|
120
|
+
for (const key of path.slice(1)) {
|
|
121
|
+
if (sensitiveConfigKey(key))
|
|
122
|
+
return REDACTED_CONFIG_VALUE;
|
|
123
|
+
nodes = children(nodes, key, root);
|
|
124
|
+
if (nodes.some(hidden))
|
|
125
|
+
return REDACTED_CONFIG_VALUE;
|
|
126
|
+
}
|
|
127
|
+
return maskTree(value, nodes, root, 0, hidden);
|
|
128
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type ConsoleConfigApplication, type ConsoleConfigApplicationStatus, type ConsoleConfigApplyResult, type ConsoleConfigPatchRequest, type ConsoleConfigPatchResult, type ConsoleConfigProjectPatchResult, type ConsoleConfigProjectRead, type ConsoleConfigProjectReadRequest, type ConsoleConfigSource } from '@zhin.js/console-protocol';
|
|
2
|
+
import type { PluginConfigValidation } from '@zhin.js/host-http';
|
|
3
|
+
import { type RuntimeConfigDocument } from '@zhin.js/plugin-runtime';
|
|
4
|
+
import { type ConfigFileDocument, type EnvStore } from '@zhin.js/runtime';
|
|
5
|
+
export interface ChatConfigurationField {
|
|
6
|
+
readonly path: readonly string[];
|
|
7
|
+
readonly type: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface ChatConfigurationRead {
|
|
10
|
+
readonly revision: string;
|
|
11
|
+
/** `get`: the single leaf value (already proven non-sensitive). */
|
|
12
|
+
readonly value?: unknown;
|
|
13
|
+
/** `fields`: chat-manageable leaves under the scope; never values. */
|
|
14
|
+
readonly fields?: readonly ChatConfigurationField[];
|
|
15
|
+
}
|
|
16
|
+
/** A Host-classified rejection before this operation attempted any commit. */
|
|
17
|
+
export declare class ConfigChatRequestRejectedError extends Error {
|
|
18
|
+
readonly code = "configuration_request_rejected";
|
|
19
|
+
constructor();
|
|
20
|
+
}
|
|
21
|
+
/** Owns one project's Console configuration projection over the Root config authority. */
|
|
22
|
+
export declare class ConsoleConfigurationStore {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(options: {
|
|
25
|
+
readonly projectRoot: string;
|
|
26
|
+
readonly document: ConfigFileDocument;
|
|
27
|
+
readonly configDeclarations?: () => ReadonlyMap<string, Readonly<Record<string, unknown>>> | Promise<ReadonlyMap<string, Readonly<Record<string, unknown>>>>;
|
|
28
|
+
readonly environmentName?: string | (() => string);
|
|
29
|
+
readonly environmentForPlugin?: (pluginName: string) => Pick<EnvStore, 'has'> | undefined;
|
|
30
|
+
readonly applyConfiguration?: (expectedRevision?: string) => Promise<ConsoleConfigApplication>;
|
|
31
|
+
readonly readApplication?: () => ConsoleConfigApplication | undefined;
|
|
32
|
+
readonly validateConfiguration?: (document: RuntimeConfigDocument) => Promise<void>;
|
|
33
|
+
});
|
|
34
|
+
readSource(): Promise<ConsoleConfigSource>;
|
|
35
|
+
readDocument(): Promise<Record<string, unknown>>;
|
|
36
|
+
replaceSource(source: string, expectedRevision: string): Promise<{
|
|
37
|
+
readonly revision: string;
|
|
38
|
+
readonly restartRequired: boolean;
|
|
39
|
+
} & ConsoleConfigApplicationStatus>;
|
|
40
|
+
setKey(pluginName: string, data: unknown): Promise<{
|
|
41
|
+
restartRequired: boolean;
|
|
42
|
+
} & ConsoleConfigApplicationStatus>;
|
|
43
|
+
removeKey(pluginName: string): Promise<{
|
|
44
|
+
restartRequired: boolean;
|
|
45
|
+
} & ConsoleConfigApplicationStatus>;
|
|
46
|
+
/**
|
|
47
|
+
* Scoped, revision-checked path writes (`config:patch`). Paths outside the caller's
|
|
48
|
+
* allowlist are rejected before reading values; a stale revision returns the latest
|
|
49
|
+
* values instead of overwriting; every touched section is validated by its schema.
|
|
50
|
+
*/
|
|
51
|
+
patch(request: ConsoleConfigPatchRequest): Promise<ConsoleConfigPatchResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Trusted project administration (`config:patch-project`, full scope only). Same
|
|
54
|
+
* single-CAS core as {@link patch}, without the page allowlist; it does not widen
|
|
55
|
+
* `config:patch` / `HOST_CONFIG_PATCH_PATHS`. Declaration writes are rejected as
|
|
56
|
+
* `invalid`, conflict values are masked, and a thrown commit is `unconfirmed`.
|
|
57
|
+
*/
|
|
58
|
+
patchProject(request: Omit<ConsoleConfigPatchRequest, 'instanceKey'>): Promise<ConsoleConfigProjectPatchResult>;
|
|
59
|
+
/** Host-authenticated owner chat. Policy checks share the mutation's CAS boundary. */
|
|
60
|
+
patchChat(request: Omit<ConsoleConfigPatchRequest, 'instanceKey'>): Promise<ConsoleConfigPatchResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Trusted project read (`config:get-project`, full scope only). Values are masked by
|
|
63
|
+
* section schema, secret-like keys and unexpanded environment references unless the
|
|
64
|
+
* caller explicitly asks to `reveal`; a section whose schema cannot be read is masked whole.
|
|
65
|
+
*/
|
|
66
|
+
readProject(request?: ConsoleConfigProjectReadRequest): Promise<ConsoleConfigProjectRead>;
|
|
67
|
+
/**
|
|
68
|
+
* Host-authenticated owner chat reads (C1). `get` returns one proven-safe leaf;
|
|
69
|
+
* `fields` lists manageable leaves and their types without values. Denials carry
|
|
70
|
+
* only a reason code.
|
|
71
|
+
*/
|
|
72
|
+
readChat(path: readonly string[], mode: 'get' | 'fields'): Promise<ChatConfigurationRead>;
|
|
73
|
+
apply(expectedRevision: string): Promise<ConsoleConfigApplyResult>;
|
|
74
|
+
readEnvironmentFile(filename: string): Promise<string>;
|
|
75
|
+
writeEnvironmentFile(filename: string, content: string): Promise<void>;
|
|
76
|
+
readSchema(pluginName?: string): Promise<unknown>;
|
|
77
|
+
validatePluginConfig(pluginName: string, data: unknown, capturedDocument?: RuntimeConfigDocument): Promise<PluginConfigValidation>;
|
|
78
|
+
readAllSchemas(): Promise<Record<string, unknown>>;
|
|
79
|
+
listKeys(): Promise<string[]>;
|
|
80
|
+
}
|
|
81
|
+
export { configKeyPatch, configKeyRemovePatch, flattenConfigDocument } from './configuration-projection.js';
|