@nifrajs/core 2.1.0 → 2.3.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/README.md +2 -2
- package/dist/assurance.d.ts +48 -4
- package/dist/assurance.d.ts.map +1 -1
- package/dist/assurance.js +87 -9
- package/dist/assurance.js.map +1 -1
- package/dist/binary.d.ts +54 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +90 -0
- package/dist/binary.js.map +1 -0
- package/dist/budget.d.ts +1 -1
- package/dist/budget.js +1 -1
- package/dist/capabilities.d.ts +19 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +60 -8
- package/dist/capabilities.js.map +1 -1
- package/dist/classification.d.ts +1 -1
- package/dist/classification.js +1 -1
- package/dist/diff.d.ts +6 -6
- package/dist/diff.js +6 -6
- package/dist/durable-adapters.d.ts.map +1 -1
- package/dist/durable-adapters.js +36 -70
- package/dist/durable-adapters.js.map +1 -1
- package/dist/durable-execution.d.ts +2 -2
- package/dist/durable-execution.js +2 -2
- package/dist/idempotency.d.ts +3 -3
- package/dist/idempotency.js +4 -4
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/internal/brand.d.ts +1 -1
- package/dist/internal/brand.js +1 -1
- package/dist/internal/route-catalog.d.ts +58 -0
- package/dist/internal/route-catalog.d.ts.map +1 -0
- package/dist/internal/route-catalog.js +58 -0
- package/dist/internal/route-catalog.js.map +1 -0
- package/dist/internal/route-execution.d.ts +75 -0
- package/dist/internal/route-execution.d.ts.map +1 -0
- package/dist/internal/route-execution.js +2 -0
- package/dist/internal/route-execution.js.map +1 -0
- package/dist/internal/same-origin.d.ts +29 -0
- package/dist/internal/same-origin.d.ts.map +1 -0
- package/dist/internal/same-origin.js +47 -0
- package/dist/internal/same-origin.js.map +1 -0
- package/dist/internal/secret.d.ts +1 -1
- package/dist/internal/secret.js +1 -1
- package/dist/ledger.d.ts +9 -9
- package/dist/ledger.js +5 -5
- package/dist/reflection.d.ts +1 -1
- package/dist/router/pattern.d.ts +26 -1
- package/dist/router/pattern.d.ts.map +1 -1
- package/dist/router/pattern.js +164 -8
- package/dist/router/pattern.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +52 -4
- package/dist/router/router.js.map +1 -1
- package/dist/schema/standard.d.ts +2 -2
- package/dist/schema/standard.js +2 -2
- package/dist/seo.d.ts +3 -3
- package/dist/seo.js +4 -4
- package/dist/server/body.d.ts +2 -2
- package/dist/server/body.js +2 -2
- package/dist/server/context.d.ts +18 -18
- package/dist/server/contract.d.ts +7 -7
- package/dist/server/contract.js +3 -3
- package/dist/server/cookies.d.ts +4 -4
- package/dist/server/cookies.js +8 -8
- package/dist/server/edge.d.ts +83 -0
- package/dist/server/edge.d.ts.map +1 -0
- package/dist/server/edge.js +71 -0
- package/dist/server/edge.js.map +1 -0
- package/dist/server/install.d.ts +2 -0
- package/dist/server/install.d.ts.map +1 -1
- package/dist/server/install.js +2 -0
- package/dist/server/install.js.map +1 -1
- package/dist/server/logger.d.ts +7 -7
- package/dist/server/logger.js +4 -4
- package/dist/server/registry.d.ts +5 -5
- package/dist/server/response-contract-lane.d.ts +91 -0
- package/dist/server/response-contract-lane.d.ts.map +1 -0
- package/dist/server/response-contract-lane.js +81 -0
- package/dist/server/response-contract-lane.js.map +1 -0
- package/dist/server/server.d.ts +52 -91
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +130 -186
- package/dist/server/server.js.map +1 -1
- package/dist/server/sse.d.ts +4 -4
- package/dist/server/sse.js +7 -7
- package/dist/server/webhook.d.ts +1 -1
- package/dist/server/webhook.js +5 -5
- package/dist/server/websocket.d.ts +19 -19
- package/dist/server/websocket.js +9 -9
- package/dist/server/ws-bun.d.ts +4 -4
- package/dist/server/ws-bun.js +3 -3
- package/dist/server.d.ts +3 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/dist/transport-codec.d.ts +13 -1
- package/dist/transport-codec.d.ts.map +1 -1
- package/dist/transport-codec.js +48 -9
- package/dist/transport-codec.js.map +1 -1
- package/package.json +12 -2
- package/src/assurance.ts +154 -8
- package/src/binary.ts +128 -0
- package/src/budget.ts +1 -1
- package/src/capabilities.ts +71 -9
- package/src/classification.ts +1 -1
- package/src/diff.ts +8 -8
- package/src/durable-adapters.ts +40 -70
- package/src/durable-execution.ts +2 -2
- package/src/idempotency.ts +4 -4
- package/src/index.ts +3 -3
- package/src/internal/brand.ts +1 -1
- package/src/internal/route-catalog.ts +94 -0
- package/src/internal/route-execution.ts +106 -0
- package/src/internal/same-origin.ts +43 -0
- package/src/internal/secret.ts +1 -1
- package/src/ledger.ts +11 -11
- package/src/reflection.ts +1 -1
- package/src/router/pattern.ts +179 -8
- package/src/router/router.ts +80 -6
- package/src/schema/standard.ts +2 -2
- package/src/seo.ts +6 -6
- package/src/server/body.ts +2 -2
- package/src/server/context.ts +18 -18
- package/src/server/contract.ts +13 -13
- package/src/server/cookies.ts +8 -8
- package/src/server/edge.ts +150 -0
- package/src/server/install.ts +5 -0
- package/src/server/logger.ts +8 -8
- package/src/server/registry.ts +5 -5
- package/src/server/response-contract-lane.ts +164 -0
- package/src/server/server.ts +159 -366
- package/src/server/sse.ts +11 -11
- package/src/server/webhook.ts +5 -5
- package/src/server/websocket.ts +22 -22
- package/src/server/ws-bun.ts +4 -4
- package/src/server.ts +8 -5
- package/src/transport-codec.ts +63 -10
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ import { defineAssurancePolicy } from "@nifrajs/core/assurance"
|
|
|
30
30
|
|
|
31
31
|
- **Inline or contract-first.** Write routes inline (types inferred from the
|
|
32
32
|
builder), or `defineContract(...)` + `implement(...)` for a decoupled, versionable
|
|
33
|
-
surface
|
|
33
|
+
surface - handlers lift over unchanged.
|
|
34
34
|
- **Validation at the boundary.** Per-route `body`/`query` is any
|
|
35
35
|
[Standard Schema](https://standardschema.dev) (zod/valibot/arktype, or `@nifrajs/schema`'s
|
|
36
36
|
`t`); invalid input is rejected with a structured `422` before the handler runs.
|
|
@@ -96,7 +96,7 @@ ESM-only; requires Bun at runtime. MIT.
|
|
|
96
96
|
|
|
97
97
|
## For AI agents
|
|
98
98
|
|
|
99
|
-
Start with [`LLM.md`](./LLM.md)
|
|
99
|
+
Start with [`LLM.md`](./LLM.md) - this package's contract card (the exports you call + its footguns),
|
|
100
100
|
one cheap read instead of the whole corpus. For the wider framework: the repo's
|
|
101
101
|
[`AGENTS.md`](../../AGENTS.md) is the copy-paste quick reference, and
|
|
102
102
|
[`llms-full.txt`](../../llms-full.txt) is the full machine-readable corpus. Run `nifra check` as the
|
package/dist/assurance.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Route assurance: reflection-time proof that every route is classified and carries the enforcement
|
|
3
3
|
* evidence its policy requires. Evaluation is pure and never runs on the request hot path.
|
|
4
4
|
*/
|
|
5
|
-
import { type CapabilityAssuranceReport, type CapabilityPolicy } from "./capabilities.js";
|
|
5
|
+
import { type CapabilityAccess, type CapabilityAssuranceReport, type CapabilityDefinition, type CapabilityPolicy, type CapabilityZone } from "./capabilities.js";
|
|
6
6
|
import type { AssuranceDeclaration, AssuranceEvidence, AssuranceScope } from "./internal/route-assurance.js";
|
|
7
7
|
import { withRouteAssurance } from "./internal/route-assurance.js";
|
|
8
8
|
import type { NifraManifestSigner } from "./manifest.js";
|
|
@@ -30,6 +30,44 @@ export interface AssuranceRouteSelector {
|
|
|
30
30
|
readonly paths?: readonly string[];
|
|
31
31
|
/** Restrict the rule to MCP tool routes (`true`) or non-tool routes (`false`). */
|
|
32
32
|
readonly tools?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Match routes declaring ANY of these capability tokens.
|
|
35
|
+
*
|
|
36
|
+
* Lets a policy be written about what a route DOES rather than where it lives: "anything that writes
|
|
37
|
+
* to the database must be authenticated" survives a route being moved or renamed, which a path glob
|
|
38
|
+
* does not. Reflection already carries the declared tokens, so this reads what the route said about
|
|
39
|
+
* itself.
|
|
40
|
+
*
|
|
41
|
+
* Naming exact tokens is precise but closed: a rule listing `db.write` does not cover `storage.write`,
|
|
42
|
+
* and a capability added next year escapes it in silence. Prefer `access`/`zone` for a rule that is
|
|
43
|
+
* meant to hold for a CLASS of effect.
|
|
44
|
+
*/
|
|
45
|
+
readonly capabilities?: readonly string[];
|
|
46
|
+
/**
|
|
47
|
+
* Match routes declaring any capability whose definition has this access.
|
|
48
|
+
*
|
|
49
|
+
* This is the selector to reach for when the rule is "anything that writes must prove who asked":
|
|
50
|
+
* it is keyed on what the capability IS rather than what it is called, so a token introduced later
|
|
51
|
+
* is covered the day it is declared instead of the day someone remembers to widen the rule.
|
|
52
|
+
*
|
|
53
|
+
* Requires capability definitions. A policy using it without them is refused rather than quietly
|
|
54
|
+
* matching nothing - a selector that matches nothing lets the route fall through to a laxer rule.
|
|
55
|
+
*/
|
|
56
|
+
readonly access?: CapabilityAccess;
|
|
57
|
+
/**
|
|
58
|
+
* Match routes declaring any capability in this zone. Combined with `access`, both must hold for the
|
|
59
|
+
* SAME capability, so `{ access: "write", zone: "domain" }` is "writes business state" and does not
|
|
60
|
+
* match a route that only writes an audit log.
|
|
61
|
+
*/
|
|
62
|
+
readonly zone?: CapabilityZone;
|
|
63
|
+
}
|
|
64
|
+
/** Extra inputs an assurance evaluation needs beyond the routes themselves. */
|
|
65
|
+
export interface AssuranceEvaluationOptions {
|
|
66
|
+
/**
|
|
67
|
+
* Capability definitions, required by any rule selecting on `access`/`zone`. Normally
|
|
68
|
+
* `config.capabilities.definitions`.
|
|
69
|
+
*/
|
|
70
|
+
readonly definitions?: readonly CapabilityDefinition[];
|
|
33
71
|
}
|
|
34
72
|
export interface AssuranceRule {
|
|
35
73
|
/** Stable human-readable classification included in diagnostics. */
|
|
@@ -100,8 +138,14 @@ export interface AssuranceConfig {
|
|
|
100
138
|
export declare function defineAssurancePolicy(policy: AssurancePolicy): AssurancePolicy;
|
|
101
139
|
/** Identity helper for a `nifra.assurance.ts` default export. */
|
|
102
140
|
export declare function defineAssuranceConfig(config: AssuranceConfig): AssuranceConfig;
|
|
103
|
-
/**
|
|
104
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Shared selector semantics for policy rules and framework adapters.
|
|
143
|
+
*
|
|
144
|
+
* `definitions` is only consulted by the `access`/`zone` selectors; every other selector reads
|
|
145
|
+
* reflection alone. A caller that omits it while the selector needs it gets no match, so callers that
|
|
146
|
+
* accept user policy must reject that combination up front - `defineAssuranceConfig` does.
|
|
147
|
+
*/
|
|
148
|
+
export declare function matchesAssuranceSelector(route: Pick<ReflectedRoute, "method" | "path" | "tool" | "capabilities">, selector: AssuranceRouteSelector, definitions?: ReadonlyMap<string, CapabilityDefinition>): boolean;
|
|
105
149
|
/** Evaluate reflected route evidence against the first matching policy rule. */
|
|
106
|
-
export declare function evaluateRouteAssurance(source: unknown, policyInput: AssurancePolicy): AssuranceReport;
|
|
150
|
+
export declare function evaluateRouteAssurance(source: unknown, policyInput: AssurancePolicy, options?: AssuranceEvaluationOptions): AssuranceReport;
|
|
107
151
|
//# sourceMappingURL=assurance.d.ts.map
|
package/dist/assurance.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assurance.d.ts","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"assurance.d.ts","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"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"}
|
package/dist/assurance.js
CHANGED
|
@@ -8,6 +8,16 @@ import { reflectRoutes } from "./reflection.js";
|
|
|
8
8
|
export { withRouteAssurance };
|
|
9
9
|
/** Canonical evidence ids emitted by Nifra's official middleware modules. */
|
|
10
10
|
export const NIFRA_ASSURANCE = NIFRA_ASSURANCE_IDS;
|
|
11
|
+
/** Selector keys that cannot be resolved from reflection alone. */
|
|
12
|
+
const CLASS_SELECTOR_KEYS = ["access", "zone"];
|
|
13
|
+
const usesClassSelector = (selector) => selector.access !== undefined || selector.zone !== undefined;
|
|
14
|
+
/** The rules whose selector needs capability definitions to mean anything. */
|
|
15
|
+
function rulesNeedingDefinitions(policy) {
|
|
16
|
+
return policy.rules.filter((rule) => usesClassSelector(rule.match)).map((rule) => rule.name);
|
|
17
|
+
}
|
|
18
|
+
function definitionMap(definitions) {
|
|
19
|
+
return new Map((definitions ?? []).map((definition) => [definition.id, definition]));
|
|
20
|
+
}
|
|
11
21
|
const nonEmpty = (value) => value.trim() !== "";
|
|
12
22
|
function normalizeEvidenceIds(values, label) {
|
|
13
23
|
const out = [];
|
|
@@ -46,6 +56,15 @@ export function defineAssurancePolicy(policy) {
|
|
|
46
56
|
if (names.has(name))
|
|
47
57
|
throw new Error(`route assurance: duplicate rule name ${JSON.stringify(name)}`);
|
|
48
58
|
names.add(name);
|
|
59
|
+
// The selector is rebuilt from known keys below, so an unrecognised one would be dropped in
|
|
60
|
+
// silence - and a selector that loses its only constraint matches EVERY route, making the rule
|
|
61
|
+
// swallow everything after it. A misspelled key is a policy hole, so it is refused here.
|
|
62
|
+
const unknown = Object.keys(rule.match).filter((key) => !["methods", "paths", "tools", "capabilities", ...CLASS_SELECTOR_KEYS].includes(key));
|
|
63
|
+
if (unknown.length > 0) {
|
|
64
|
+
throw new Error(`route assurance: rule ${JSON.stringify(rule.name)} has unknown selector key(s) ${unknown
|
|
65
|
+
.map((key) => JSON.stringify(key))
|
|
66
|
+
.join(", ")} - a dropped selector would match every route`);
|
|
67
|
+
}
|
|
49
68
|
if (rule.match.tools !== undefined && typeof rule.match.tools !== "boolean") {
|
|
50
69
|
throw new Error(`route assurance: rule ${JSON.stringify(name)} tools selector must be boolean`);
|
|
51
70
|
}
|
|
@@ -59,6 +78,18 @@ export function defineAssurancePolicy(policy) {
|
|
|
59
78
|
routeGlob(path);
|
|
60
79
|
return path;
|
|
61
80
|
});
|
|
81
|
+
const capabilities = rule.match.capabilities;
|
|
82
|
+
if (capabilities !== undefined && (!Array.isArray(capabilities) || capabilities.length === 0)) {
|
|
83
|
+
throw new Error(`route assurance: rule ${JSON.stringify(name)} capabilities selector must be a non-empty array`);
|
|
84
|
+
}
|
|
85
|
+
const access = rule.match.access;
|
|
86
|
+
if (access !== undefined && access !== "read" && access !== "write") {
|
|
87
|
+
throw new Error(`route assurance: rule ${JSON.stringify(name)} access selector must be "read" or "write"`);
|
|
88
|
+
}
|
|
89
|
+
const zone = rule.match.zone;
|
|
90
|
+
if (zone !== undefined && zone !== "domain" && zone !== "operational") {
|
|
91
|
+
throw new Error(`route assurance: rule ${JSON.stringify(name)} zone selector must be "domain" or "operational"`);
|
|
92
|
+
}
|
|
62
93
|
const required = normalizeEvidenceIds(rule.require, "required");
|
|
63
94
|
const forbidden = normalizeEvidenceIds(rule.forbid, "forbidden");
|
|
64
95
|
const overlap = required.find((id) => forbidden.includes(id));
|
|
@@ -71,6 +102,9 @@ export function defineAssurancePolicy(policy) {
|
|
|
71
102
|
...(methods !== undefined ? { methods: Object.freeze(methods) } : {}),
|
|
72
103
|
...(paths !== undefined ? { paths: Object.freeze(paths) } : {}),
|
|
73
104
|
...(rule.match.tools !== undefined ? { tools: rule.match.tools } : {}),
|
|
105
|
+
...(capabilities !== undefined ? { capabilities: Object.freeze([...capabilities]) } : {}),
|
|
106
|
+
...(access !== undefined ? { access } : {}),
|
|
107
|
+
...(zone !== undefined ? { zone } : {}),
|
|
74
108
|
}),
|
|
75
109
|
require: required,
|
|
76
110
|
forbid: forbidden,
|
|
@@ -94,12 +128,22 @@ export function defineAssuranceConfig(config) {
|
|
|
94
128
|
if (config.invariants !== undefined && typeof config.invariants.executor !== "function") {
|
|
95
129
|
throw new Error("route assurance: invariant executor must be a function");
|
|
96
130
|
}
|
|
131
|
+
const policy = defineAssurancePolicy(config.policy);
|
|
132
|
+
const capabilities = config.capabilities !== undefined ? defineCapabilityPolicy(config.capabilities) : undefined;
|
|
133
|
+
// An `access`/`zone` selector is resolved through the capability definitions. Without them it can
|
|
134
|
+
// only ever match nothing, and a rule that matches nothing does not fail - the route falls past it
|
|
135
|
+
// to whatever laxer rule comes next. Refuse the config here rather than ship a policy whose
|
|
136
|
+
// strictest rule is inert.
|
|
137
|
+
const needDefinitions = rulesNeedingDefinitions(policy);
|
|
138
|
+
if (needDefinitions.length > 0 && (capabilities?.definitions.length ?? 0) === 0) {
|
|
139
|
+
throw new Error(`route assurance: rule(s) ${needDefinitions
|
|
140
|
+
.map((name) => JSON.stringify(name))
|
|
141
|
+
.join(", ")} select on ${CLASS_SELECTOR_KEYS.join("/")}, which needs capability definitions - add a \`capabilities\` policy defining the tokens your routes declare`);
|
|
142
|
+
}
|
|
97
143
|
return Object.freeze({
|
|
98
144
|
source: config.source,
|
|
99
|
-
policy
|
|
100
|
-
...(
|
|
101
|
-
? { capabilities: defineCapabilityPolicy(config.capabilities) }
|
|
102
|
-
: {}),
|
|
145
|
+
policy,
|
|
146
|
+
...(capabilities !== undefined ? { capabilities } : {}),
|
|
103
147
|
...(config.manifest !== undefined
|
|
104
148
|
? {
|
|
105
149
|
manifest: Object.freeze({
|
|
@@ -113,20 +157,54 @@ export function defineAssuranceConfig(config) {
|
|
|
113
157
|
: {}),
|
|
114
158
|
});
|
|
115
159
|
}
|
|
116
|
-
/**
|
|
117
|
-
|
|
118
|
-
|
|
160
|
+
/**
|
|
161
|
+
* Shared selector semantics for policy rules and framework adapters.
|
|
162
|
+
*
|
|
163
|
+
* `definitions` is only consulted by the `access`/`zone` selectors; every other selector reads
|
|
164
|
+
* reflection alone. A caller that omits it while the selector needs it gets no match, so callers that
|
|
165
|
+
* accept user policy must reject that combination up front - `defineAssuranceConfig` does.
|
|
166
|
+
*/
|
|
167
|
+
export function matchesAssuranceSelector(route, selector, definitions) {
|
|
168
|
+
const { methods, paths, tools, capabilities, access, zone } = selector;
|
|
119
169
|
if (methods !== undefined && !methods.includes(route.method))
|
|
120
170
|
return false;
|
|
121
171
|
if (paths !== undefined && !paths.some((pattern) => routeGlob(pattern).test(route.path)))
|
|
122
172
|
return false;
|
|
123
173
|
if (tools !== undefined && (route.tool !== undefined) !== tools)
|
|
124
174
|
return false;
|
|
175
|
+
const declared = route.capabilities ?? [];
|
|
176
|
+
if (capabilities !== undefined && !capabilities.some((token) => declared.includes(token)))
|
|
177
|
+
return false;
|
|
178
|
+
if (access !== undefined || zone !== undefined) {
|
|
179
|
+
// Both constraints must hold for the SAME capability: a route that reads the database and writes
|
|
180
|
+
// an audit log must not satisfy "writes business state" by combining halves of two tokens.
|
|
181
|
+
const matched = declared.some((token) => {
|
|
182
|
+
const definition = definitions?.get(token);
|
|
183
|
+
if (definition === undefined)
|
|
184
|
+
return false;
|
|
185
|
+
if (access !== undefined && definition.access !== access)
|
|
186
|
+
return false;
|
|
187
|
+
if (zone !== undefined && definition.zone !== zone)
|
|
188
|
+
return false;
|
|
189
|
+
return true;
|
|
190
|
+
});
|
|
191
|
+
if (!matched)
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
125
194
|
return true;
|
|
126
195
|
}
|
|
127
196
|
/** Evaluate reflected route evidence against the first matching policy rule. */
|
|
128
|
-
export function evaluateRouteAssurance(source, policyInput) {
|
|
197
|
+
export function evaluateRouteAssurance(source, policyInput, options) {
|
|
129
198
|
const policy = defineAssurancePolicy(policyInput);
|
|
199
|
+
const definitions = definitionMap(options?.definitions);
|
|
200
|
+
// Same reasoning as `defineAssuranceConfig`, repeated for callers that evaluate a bare policy: a
|
|
201
|
+
// class selector with nothing to resolve against is an inert rule, not a lenient one.
|
|
202
|
+
const needDefinitions = rulesNeedingDefinitions(policy);
|
|
203
|
+
if (needDefinitions.length > 0 && definitions.size === 0) {
|
|
204
|
+
throw new Error(`route assurance: rule(s) ${needDefinitions
|
|
205
|
+
.map((name) => JSON.stringify(name))
|
|
206
|
+
.join(", ")} select on ${CLASS_SELECTOR_KEYS.join("/")} but no capability definitions were supplied`);
|
|
207
|
+
}
|
|
130
208
|
const findings = [];
|
|
131
209
|
const routes = [];
|
|
132
210
|
const reflected = reflectRoutes(source);
|
|
@@ -139,7 +217,7 @@ export function evaluateRouteAssurance(source, policyInput) {
|
|
|
139
217
|
});
|
|
140
218
|
}
|
|
141
219
|
for (const route of reflected) {
|
|
142
|
-
const rule = policy.rules.find((candidate) => matchesAssuranceSelector(route, candidate.match));
|
|
220
|
+
const rule = policy.rules.find((candidate) => matchesAssuranceSelector(route, candidate.match, definitions));
|
|
143
221
|
const evidence = route.assurance ?? [];
|
|
144
222
|
const evidenceIds = new Set(evidence.map((item) => item.id));
|
|
145
223
|
if (rule === undefined) {
|
package/dist/assurance.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assurance.js","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assurance.js","sourceRoot":"","sources":["../src/assurance.ts"],"names":[],"mappings":"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"}
|
package/dist/binary.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@nifrajs/core/binary` - a route that returns bytes, and says so in its type.
|
|
3
|
+
*
|
|
4
|
+
* A download route had no way to be part of the contract. Returning a raw `Response` is the only way
|
|
5
|
+
* to send bytes, and a raw `Response` is exactly what the typed client cannot describe - so the route
|
|
6
|
+
* needed a `// nifra-expect raw-response` pragma to quiet the advisory, and its caller got no type at
|
|
7
|
+
* all. One whole category of endpoint sat outside the thing the framework is otherwise strict about.
|
|
8
|
+
*
|
|
9
|
+
* import { bytes } from "@nifrajs/core/binary"
|
|
10
|
+
*
|
|
11
|
+
* app.get("/invoice.pdf", async (c) => bytes(await render(c.params.id), {
|
|
12
|
+
* type: "application/pdf",
|
|
13
|
+
* filename: "invoice.pdf",
|
|
14
|
+
* }))
|
|
15
|
+
*
|
|
16
|
+
* The client types `data` as `Blob` for that route, and gets the bytes intact.
|
|
17
|
+
*
|
|
18
|
+
* The brand is a phantom: `bytes()` returns a real `Response` and nothing is added to it at runtime.
|
|
19
|
+
* It exists so the type carries a fact the value cannot - that these bytes are the payload rather than
|
|
20
|
+
* a serialization accident - which is what lets `Jsonify` answer `Blob` instead of trying to describe
|
|
21
|
+
* a `Response`'s properties.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Marker on a binary response's TYPE. A unique symbol rather than a string key, so no ordinary object
|
|
25
|
+
* can satisfy it by accident, and declared required rather than optional - an optional brand is
|
|
26
|
+
* satisfied by every type that lacks it, which would make the check match `Response` itself.
|
|
27
|
+
*/
|
|
28
|
+
declare const NIFRA_BYTES: unique symbol;
|
|
29
|
+
/** Runtime marker paired with the type-only brand so clients do not have to guess from media type. */
|
|
30
|
+
export declare const NIFRA_BINARY_HEADER = "x-nifra-binary";
|
|
31
|
+
/** A `Response` a route declared as binary. `Jsonify` maps this to `Blob`. */
|
|
32
|
+
export type BinaryResponse = Response & {
|
|
33
|
+
readonly [NIFRA_BYTES]: true;
|
|
34
|
+
};
|
|
35
|
+
/** What can be sent as bytes without being re-encoded on the way out. */
|
|
36
|
+
export type BinaryBody = ArrayBuffer | ArrayBufferView | Blob | ReadableStream<Uint8Array>;
|
|
37
|
+
export interface BytesOptions {
|
|
38
|
+
/** Media type. Defaults to `application/octet-stream`, the honest answer for unlabelled bytes. */
|
|
39
|
+
readonly type?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Offer the body as a download under this name.
|
|
42
|
+
*
|
|
43
|
+
* A filename derived from user data is the ordinary case - an upload's original name, a document
|
|
44
|
+
* title - so this has to survive anything a person can type. Two things follow, and both are tested:
|
|
45
|
+
* a `"` or a newline cannot end the value and write further parameters, and a non-Latin-1 name is
|
|
46
|
+
* encoded rather than thrown on.
|
|
47
|
+
*/
|
|
48
|
+
readonly filename?: string;
|
|
49
|
+
readonly status?: number;
|
|
50
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
51
|
+
}
|
|
52
|
+
export declare function bytes(body: BinaryBody, options?: BytesOptions): BinaryResponse;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;GAIG;AACH,OAAO,CAAC,MAAM,WAAW,EAAE,OAAO,MAAM,CAAA;AAExC,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,CAAA;CAAE,CAAA;AAExE,yEAAyE;AACzE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AAE1F,MAAM,WAAW,YAAY;IAC3B,kGAAkG;IAClG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACpD;AAgDD,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc,CA0BlF"}
|
package/dist/binary.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@nifrajs/core/binary` - a route that returns bytes, and says so in its type.
|
|
3
|
+
*
|
|
4
|
+
* A download route had no way to be part of the contract. Returning a raw `Response` is the only way
|
|
5
|
+
* to send bytes, and a raw `Response` is exactly what the typed client cannot describe - so the route
|
|
6
|
+
* needed a `// nifra-expect raw-response` pragma to quiet the advisory, and its caller got no type at
|
|
7
|
+
* all. One whole category of endpoint sat outside the thing the framework is otherwise strict about.
|
|
8
|
+
*
|
|
9
|
+
* import { bytes } from "@nifrajs/core/binary"
|
|
10
|
+
*
|
|
11
|
+
* app.get("/invoice.pdf", async (c) => bytes(await render(c.params.id), {
|
|
12
|
+
* type: "application/pdf",
|
|
13
|
+
* filename: "invoice.pdf",
|
|
14
|
+
* }))
|
|
15
|
+
*
|
|
16
|
+
* The client types `data` as `Blob` for that route, and gets the bytes intact.
|
|
17
|
+
*
|
|
18
|
+
* The brand is a phantom: `bytes()` returns a real `Response` and nothing is added to it at runtime.
|
|
19
|
+
* It exists so the type carries a fact the value cannot - that these bytes are the payload rather than
|
|
20
|
+
* a serialization accident - which is what lets `Jsonify` answer `Blob` instead of trying to describe
|
|
21
|
+
* a `Response`'s properties.
|
|
22
|
+
*/
|
|
23
|
+
/** Runtime marker paired with the type-only brand so clients do not have to guess from media type. */
|
|
24
|
+
export const NIFRA_BINARY_HEADER = "x-nifra-binary";
|
|
25
|
+
/**
|
|
26
|
+
* Everything a header value may not contain: quotes, backslashes, and the CR/LF that would split the
|
|
27
|
+
* header. Replaced rather than rejected - a filename is cosmetic, and failing a download because a
|
|
28
|
+
* document was titled `Q1 "final"` would be worse than sending it with the quotes dropped.
|
|
29
|
+
*/
|
|
30
|
+
const UNSAFE_FILENAME = /["\\\r\n]/g;
|
|
31
|
+
/**
|
|
32
|
+
* Printable ASCII only.
|
|
33
|
+
*
|
|
34
|
+
* A header value is nominally Latin-1, but runtimes do not agree: Bun rejects `é` in a header outright,
|
|
35
|
+
* so "Latin-1 is fine" would have been a portability bug dressed as a standards reading. Printable
|
|
36
|
+
* ASCII is what every runtime and client accepts, and `filename*` carries everything else.
|
|
37
|
+
*/
|
|
38
|
+
const NON_ASCII = /[^\x20-\x7e]/g;
|
|
39
|
+
/**
|
|
40
|
+
* `Content-Disposition` for a name that may be anything a user typed.
|
|
41
|
+
*
|
|
42
|
+
* Setting a header containing `报告.pdf` or an emoji THROWS - which on a download route is a 500 for
|
|
43
|
+
* the ordinary act of naming a file in a language ASCII does not cover, and the name usually came from
|
|
44
|
+
* the user in the first place. RFC 6266 exists for exactly this: an ASCII `filename` every client
|
|
45
|
+
* understands, plus `filename*` carrying the real name UTF-8 percent-encoded, which browsers prefer.
|
|
46
|
+
*
|
|
47
|
+
* The ASCII fallback keeps the characters it can rather than substituting a placeholder, so
|
|
48
|
+
* `report 报告.pdf` still arrives as `report .pdf` on a client that ignores `filename*`.
|
|
49
|
+
*
|
|
50
|
+
* `filename*` is built from the SANITIZED name, not the raw one. Percent-encoding would make a hostile
|
|
51
|
+
* name inert either way, but round-tripping `"; attachment; filename="evil.exe` into the header - even
|
|
52
|
+
* encoded - puts an attacker's string somewhere a future reader has to reason about, and the second
|
|
53
|
+
* parameter is only there to carry characters ASCII cannot.
|
|
54
|
+
*/
|
|
55
|
+
function contentDisposition(filename) {
|
|
56
|
+
const safe = filename.toWellFormed().replace(UNSAFE_FILENAME, "");
|
|
57
|
+
const ascii = safe.replace(NON_ASCII, "");
|
|
58
|
+
const disposition = `attachment; filename="${ascii}"`;
|
|
59
|
+
// Only when it adds something: a name ASCII already carries needs no second parameter.
|
|
60
|
+
if (ascii === safe)
|
|
61
|
+
return disposition;
|
|
62
|
+
// encodeURIComponent leaves `'()*` untouched, but RFC 5987's attr-char grammar does not.
|
|
63
|
+
const encoded = encodeURIComponent(safe).replace(/['()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
64
|
+
return `${disposition}; filename*=UTF-8''${encoded}`;
|
|
65
|
+
}
|
|
66
|
+
export function bytes(body, options = {}) {
|
|
67
|
+
const headers = new Headers(options.headers);
|
|
68
|
+
headers.set("content-type", options.type ?? "application/octet-stream");
|
|
69
|
+
headers.set(NIFRA_BINARY_HEADER, "1");
|
|
70
|
+
// Response headers outside the CORS safelist are hidden from cross-origin clients unless exposed.
|
|
71
|
+
// Preserve an existing list and add the marker so the typed contract works cross-origin too.
|
|
72
|
+
const exposed = headers.get("access-control-expose-headers");
|
|
73
|
+
if (exposed !== "*") {
|
|
74
|
+
const names = exposed
|
|
75
|
+
?.split(",")
|
|
76
|
+
.map((name) => name.trim())
|
|
77
|
+
.filter(Boolean);
|
|
78
|
+
if (!names?.some((name) => name.toLowerCase() === NIFRA_BINARY_HEADER)) {
|
|
79
|
+
headers.set("access-control-expose-headers", [...(names ?? []), NIFRA_BINARY_HEADER].join(", "));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (options.filename !== undefined) {
|
|
83
|
+
headers.set("content-disposition", contentDisposition(options.filename));
|
|
84
|
+
}
|
|
85
|
+
return new Response(body, {
|
|
86
|
+
status: options.status ?? 200,
|
|
87
|
+
headers,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,sGAAsG;AACtG,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAwBnD;;;;GAIG;AACH,MAAM,eAAe,GAAG,YAAY,CAAA;AAEpC;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,eAAe,CAAA;AAEjC;;;;;;;;;;;;;;;GAeG;AACH,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IACzC,MAAM,WAAW,GAAG,yBAAyB,KAAK,GAAG,CAAA;IACrD,uFAAuF;IACvF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,WAAW,CAAA;IACtC,yFAAyF;IACzF,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,CAC9C,SAAS,EACT,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAC9D,CAAA;IACD,OAAO,GAAG,WAAW,sBAAsB,OAAO,EAAE,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAgB,EAAE,UAAwB,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAA6C,CAAC,CAAA;IAClF,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,IAAI,0BAA0B,CAAC,CAAA;IACvE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAA;IACrC,kGAAkG;IAClG,6FAA6F;IAC7F,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;IAC5D,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,OAAO;YACnB,EAAE,KAAK,CAAC,GAAG,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,mBAAmB,CAAC,EAAE,CAAC;YACvE,OAAO,CAAC,GAAG,CACT,+BAA+B,EAC/B,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACnD,CAAA;QACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,IAAiD,EAAE;QACrE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;QAC7B,OAAO;KACR,CAAmB,CAAA;AACtB,CAAC"}
|
package/dist/budget.d.ts
CHANGED
|
@@ -70,7 +70,7 @@ export declare class DeadlineExceededError extends Error {
|
|
|
70
70
|
}
|
|
71
71
|
/**
|
|
72
72
|
* Create a budget from an admitted absolute deadline. Wall time is sampled once; every subsequent
|
|
73
|
-
* `remaining()` call is monotonic. This function does not arm a timer
|
|
73
|
+
* `remaining()` call is monotonic. This function does not arm a timer-the owner of `signal` does.
|
|
74
74
|
*/
|
|
75
75
|
export declare function createRequestBudget(options: CreateRequestBudgetOptions): RequestBudget;
|
|
76
76
|
/** Create a local no-deadline view. Outbound header propagation deliberately omits it. */
|
package/dist/budget.js
CHANGED
|
@@ -79,7 +79,7 @@ class UnboundedRequestBudget {
|
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
81
|
* Create a budget from an admitted absolute deadline. Wall time is sampled once; every subsequent
|
|
82
|
-
* `remaining()` call is monotonic. This function does not arm a timer
|
|
82
|
+
* `remaining()` call is monotonic. This function does not arm a timer-the owner of `signal` does.
|
|
83
83
|
*/
|
|
84
84
|
export function createRequestBudget(options) {
|
|
85
85
|
assertDeadline(options.deadline);
|
package/dist/capabilities.d.ts
CHANGED
|
@@ -7,6 +7,23 @@ import { type EffectLifecycleObserver } from "./effect-lifecycle.js";
|
|
|
7
7
|
import { type AroundCapabilityOptions, type CapabilityApprovalGate, type CapabilityApprovalInput, type CapabilityExecutionIdentity, type CapabilityExecutionJournal, type CapabilityInterceptor, type CapabilityInterceptorEvent, type CapabilityInterceptorNext, type CapabilityUseEvent, validCapabilityId } from "./internal/capability-runtime.js";
|
|
8
8
|
import { type EffectCost, type EffectPhase } from "./ledger.js";
|
|
9
9
|
export type { AroundCapabilityOptions, CapabilityApprovalGate, CapabilityApprovalInput, CapabilityExecutionIdentity, CapabilityExecutionJournal, CapabilityInterceptor, CapabilityInterceptorEvent, CapabilityInterceptorNext, CapabilityUseEvent, EffectLifecycleObserver, };
|
|
10
|
+
/**
|
|
11
|
+
* Framework wiring: put a journal on a request context so every `executeCapability` on that request is
|
|
12
|
+
* journaled without each call site threading it. Not for application code - install the
|
|
13
|
+
* `durableCommand()` adapter, which calls this and declares the assurance evidence that goes with it.
|
|
14
|
+
*
|
|
15
|
+
* Symbol-keyed, mirroring `attachEffectLedger`: it cannot collide with an application field and does
|
|
16
|
+
* not show up in a context spread or a log of it.
|
|
17
|
+
*
|
|
18
|
+
* Deliberately here rather than beside the journal TYPE in `internal/capability-runtime.ts`. That
|
|
19
|
+
* module is reachable from a bare server - it holds the route-capability guard - so a seam living
|
|
20
|
+
* there ships to every app, while here it arrives only with `executeCapability`, the one thing that
|
|
21
|
+
* reads it. Measured rather than assumed: in the internal module this cost every bundle row in the
|
|
22
|
+
* size matrix 10-18 bytes gzip, enough to put `nifra-mcp` over its ceiling.
|
|
23
|
+
*/
|
|
24
|
+
export declare function attachCapabilityJournal(context: object, journal: CapabilityExecutionJournal): void;
|
|
25
|
+
/** The journal installed for this request, if any. */
|
|
26
|
+
export declare function capabilityJournalOf(context: object): CapabilityExecutionJournal | undefined;
|
|
10
27
|
export type CapabilityZone = "domain" | "operational";
|
|
11
28
|
export type CapabilityAccess = "read" | "write";
|
|
12
29
|
export type CapabilityIdempotency = "none" | "request" | "durable";
|
|
@@ -67,7 +84,7 @@ export interface RouteCapabilityEvidence {
|
|
|
67
84
|
export interface CapabilityEvidenceSet {
|
|
68
85
|
readonly routes: readonly RouteCapabilityEvidence[];
|
|
69
86
|
}
|
|
70
|
-
export type CapabilityFindingCode = "unknown-capability" | "provenance-uncovered" | "undeclared-capability-evidence" | "safe-method-domain-write" | "missing-request-idempotency" | "missing-durable-idempotency" | "forbidden-effect-import";
|
|
87
|
+
export type CapabilityFindingCode = "unknown-capability" | "provenance-uncovered" | "undeclared-capability-evidence" | "safe-method-domain-write" | "unconfined-write-reach" | "missing-request-idempotency" | "missing-durable-idempotency" | "forbidden-effect-import" | "provenance-truncated";
|
|
71
88
|
export interface CapabilityFinding {
|
|
72
89
|
readonly code: CapabilityFindingCode;
|
|
73
90
|
readonly method: string;
|
|
@@ -111,7 +128,7 @@ export declare function defineCapabilityPolicy(policy: CapabilityPolicy): Capabi
|
|
|
111
128
|
export declare function evaluateCapabilityAssurance(source: unknown, policyInput: CapabilityPolicy, evidenceSet: CapabilityEvidenceSet): CapabilityAssuranceReport;
|
|
112
129
|
/**
|
|
113
130
|
* Optional effect-ledger fields for one `useCapability` beacon. Token-only by design: an adapter
|
|
114
|
-
* names *what* it touched and *how much resource* it used
|
|
131
|
+
* names *what* it touched and *how much resource* it used - never the value it read or wrote.
|
|
115
132
|
*/
|
|
116
133
|
export interface UseCapabilityOptions {
|
|
117
134
|
/** Adapter/resource token recorded on the ledger entry (`repo:orders`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EAAE,KAAK,uBAAuB,EAAuB,MAAM,uBAAuB,CAAA;AAEzF,OAAO,EACL,KAAK,uBAAuB,EAE5B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAE/B,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EAEvB,iBAAiB,EAClB,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAGjB,MAAM,aAAa,CAAA;AAGpB,YAAY,EACV,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,GACxB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAA;AACrD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAA;AAC/C,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;AAElE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,mGAAmG;IACnG,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAA;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED,MAAM,WAAW,yBAAyB;IACxC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAA;IACvC,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAA;IACjD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC/D,8FAA8F;IAC9F,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAA;IACrD,yFAAyF;IACzF,QAAQ,CAAC,UAAU,EAAE,0BAA0B,CAAA;IAC/C,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEzD,oGAAoG;AACpG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAA;CACjD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAA;CACpD;AAED,MAAM,MAAM,qBAAqB,GAC7B,oBAAoB,GACpB,sBAAsB,GACtB,gCAAgC,GAChC,0BAA0B,GAC1B,6BAA6B,GAC7B,6BAA6B,GAC7B,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|