raffel 1.1.57 → 1.1.59-next.07e2952
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/dist/core/registry.d.ts +11 -0
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +16 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/middleware/policy/bootstrap.d.ts +32 -0
- package/dist/middleware/policy/bootstrap.d.ts.map +1 -1
- package/dist/middleware/policy/bootstrap.js +11 -0
- package/dist/middleware/policy/bootstrap.js.map +1 -1
- package/dist/middleware/policy/co-located/loader.d.ts.map +1 -1
- package/dist/middleware/policy/co-located/loader.js +79 -6
- package/dist/middleware/policy/co-located/loader.js.map +1 -1
- package/dist/middleware/policy/co-located/resolver.d.ts +25 -0
- package/dist/middleware/policy/co-located/resolver.d.ts.map +1 -1
- package/dist/middleware/policy/co-located/resolver.js +24 -1
- package/dist/middleware/policy/co-located/resolver.js.map +1 -1
- package/dist/middleware/policy/co-located-accumulator.d.ts +63 -0
- package/dist/middleware/policy/co-located-accumulator.d.ts.map +1 -0
- package/dist/middleware/policy/co-located-accumulator.js +148 -0
- package/dist/middleware/policy/co-located-accumulator.js.map +1 -0
- package/dist/middleware/policy/schema.d.ts +54 -0
- package/dist/middleware/policy/schema.d.ts.map +1 -1
- package/dist/middleware/policy/schema.js +45 -0
- package/dist/middleware/policy/schema.js.map +1 -1
- package/dist/middleware/policy/types.d.ts +60 -0
- package/dist/middleware/policy/types.d.ts.map +1 -1
- package/dist/server/builder/policy-bridges.d.ts +41 -0
- package/dist/server/builder/policy-bridges.d.ts.map +1 -0
- package/dist/server/builder/policy-bridges.js +96 -0
- package/dist/server/builder/policy-bridges.js.map +1 -0
- package/dist/server/builder/programmatic-registration.d.ts +43 -0
- package/dist/server/builder/programmatic-registration.d.ts.map +1 -0
- package/dist/server/builder/programmatic-registration.js +261 -0
- package/dist/server/builder/programmatic-registration.js.map +1 -0
- package/dist/server/builder.d.ts.map +1 -1
- package/dist/server/builder.js +68 -312
- package/dist/server/builder.js.map +1 -1
- package/dist/server/discovery-utils.d.ts +20 -1
- package/dist/server/discovery-utils.d.ts.map +1 -1
- package/dist/server/discovery-utils.js +72 -51
- package/dist/server/discovery-utils.js.map +1 -1
- package/dist/server/fs-routes/co-located-attach.d.ts +32 -0
- package/dist/server/fs-routes/co-located-attach.d.ts.map +1 -0
- package/dist/server/fs-routes/co-located-attach.js +69 -0
- package/dist/server/fs-routes/co-located-attach.js.map +1 -0
- package/dist/server/fs-routes/loader.d.ts.map +1 -1
- package/dist/server/fs-routes/loader.js +2 -232
- package/dist/server/fs-routes/loader.js.map +1 -1
- package/dist/server/fs-routes/route-naming.d.ts +61 -0
- package/dist/server/fs-routes/route-naming.d.ts.map +1 -0
- package/dist/server/fs-routes/route-naming.js +191 -0
- package/dist/server/fs-routes/route-naming.js.map +1 -0
- package/dist/server/orchestration/registration.d.ts +6 -2
- package/dist/server/orchestration/registration.d.ts.map +1 -1
- package/dist/server/orchestration/registration.js +9 -3
- package/dist/server/orchestration/registration.js.map +1 -1
- package/dist/ui/core/registry.d.ts +11 -0
- package/dist/ui/core/registry.d.ts.map +1 -1
- package/dist/ui/middleware/policy/co-located/loader.d.ts.map +1 -1
- package/dist/ui/middleware/policy/co-located/resolver.d.ts +25 -0
- package/dist/ui/middleware/policy/co-located/resolver.d.ts.map +1 -1
- package/dist/ui/middleware/policy/schema.d.ts +54 -0
- package/dist/ui/middleware/policy/schema.d.ts.map +1 -1
- package/dist/ui/middleware/policy/types.d.ts +60 -0
- package/dist/ui/middleware/policy/types.d.ts.map +1 -1
- package/dist/ui/server/fs-routes/co-located-attach.d.ts +32 -0
- package/dist/ui/server/fs-routes/co-located-attach.d.ts.map +1 -0
- package/dist/ui/server/fs-routes/loader.d.ts.map +1 -1
- package/dist/ui/server/fs-routes/route-naming.d.ts +61 -0
- package/dist/ui/server/fs-routes/route-naming.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/core/registry.d.ts
CHANGED
|
@@ -92,6 +92,17 @@ export interface Registry {
|
|
|
92
92
|
getEvent(name: string): RegisteredHandler<EventHandler> | undefined;
|
|
93
93
|
/** Check if a handler exists */
|
|
94
94
|
has(name: string): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Remove a handler by name. Returns `true` if a handler was removed,
|
|
97
|
+
* `false` if no handler with that name was registered.
|
|
98
|
+
*
|
|
99
|
+
* Use with care: removing a handler that another in-process component
|
|
100
|
+
* still references leaves those references dangling. Discovery is the
|
|
101
|
+
* primary consumer — it removes a route when the underlying file is
|
|
102
|
+
* deleted, while it never removes a handler registered programmatically
|
|
103
|
+
* via the builder API.
|
|
104
|
+
*/
|
|
105
|
+
remove(name: string): boolean;
|
|
95
106
|
/** List all registered handlers */
|
|
96
107
|
list(): HandlerMeta[];
|
|
97
108
|
/** List procedures only */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/core/registry.js
CHANGED
|
@@ -107,6 +107,22 @@ export function createRegistry() {
|
|
|
107
107
|
has(name) {
|
|
108
108
|
return procedures.has(name) || streams.has(name) || events.has(name);
|
|
109
109
|
},
|
|
110
|
+
/**
|
|
111
|
+
* Remove a handler by name. Returns `true` if a handler was removed,
|
|
112
|
+
* `false` if no handler with that name was registered. Used by
|
|
113
|
+
* discovery on hot reload to drop a route whose underlying file
|
|
114
|
+
* was deleted; explicit programmatic registrations are tracked
|
|
115
|
+
* separately and are never removed by discovery.
|
|
116
|
+
*/
|
|
117
|
+
remove(name) {
|
|
118
|
+
if (procedures.delete(name))
|
|
119
|
+
return true;
|
|
120
|
+
if (streams.delete(name))
|
|
121
|
+
return true;
|
|
122
|
+
if (events.delete(name))
|
|
123
|
+
return true;
|
|
124
|
+
return false;
|
|
125
|
+
},
|
|
110
126
|
// === Introspection ===
|
|
111
127
|
list() {
|
|
112
128
|
const results = new Array(procedures.size + streams.size + events.size);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import type { LoggerPort } from '../../ports/outbound/logger.js';
|
|
12
12
|
import type { Context, Interceptor } from '../../types/index.js';
|
|
13
13
|
import type { PolicyEnginePort } from '../../ports/outbound/policy-engine.js';
|
|
14
|
+
import { type CoLocatedAccumulator } from './co-located-accumulator.js';
|
|
14
15
|
import type { PolicyConfig, Principal, ProcedurePolicyConfig } from './types.js';
|
|
15
16
|
export interface PolicyCoverageEntry {
|
|
16
17
|
/** Operation/channel name as registered in the registry. */
|
|
@@ -52,7 +53,38 @@ export interface PolicyBootstrap {
|
|
|
52
53
|
* audit when `defaultMode: 'deny'` is configured.
|
|
53
54
|
*/
|
|
54
55
|
getCoverage: (registered: readonly PolicyCoverageEntry[]) => PolicyCoverageReport;
|
|
56
|
+
/**
|
|
57
|
+
* Accumulator for co-located policies (1.1.60+). Discovery calls
|
|
58
|
+
* `accumulator.add()` for every (route, policy) pair it surfaces; the
|
|
59
|
+
* application path (`applyDiscoveryResult`) calls `flush()` once at
|
|
60
|
+
* the end of a load to materialise one policy per cascade file with
|
|
61
|
+
* the union of route names in `scope.routes`, deduping the N-copy
|
|
62
|
+
* leak that earlier releases produced when a single cascade
|
|
63
|
+
* `_policy.yaml` was attached to N routes (Bug A from 1.1.58).
|
|
64
|
+
*
|
|
65
|
+
* `reset()` is called at the top of a hot reload so the next flush
|
|
66
|
+
* only contains the policies for the routes that survived the
|
|
67
|
+
* reload.
|
|
68
|
+
*/
|
|
69
|
+
coLocatedAccumulator: CoLocatedAccumulator;
|
|
55
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Per-server state for the co-located policy pipeline (1.1.60+).
|
|
73
|
+
*
|
|
74
|
+
* The accumulator exists so that a single cascade `_policy.yaml` shared
|
|
75
|
+
* by N routes produces ONE entry in the engine instead of N copies
|
|
76
|
+
* (one per route). Each `add()` records the route name against the
|
|
77
|
+
* policy's `(source, index)` key. `flush()` materialises one policy
|
|
78
|
+
* per key with `scope.routes` set to the union and commits to the
|
|
79
|
+
* engine. `reset()` clears the accumulator without touching the
|
|
80
|
+
* engine — used on hot reload so the next flush reflects only the
|
|
81
|
+
* routes that survived the reload.
|
|
82
|
+
*
|
|
83
|
+
* Imported from `./co-located-accumulator.js`. Re-exported here so
|
|
84
|
+
* existing call sites that imported the type from `bootstrap` keep
|
|
85
|
+
* working.
|
|
86
|
+
*/
|
|
87
|
+
export type { CoLocatedAccumulator } from './co-located-accumulator.js';
|
|
56
88
|
export interface CreatePolicyBootstrapOptions {
|
|
57
89
|
/** Fallback logger if `policy.logger` is not provided. */
|
|
58
90
|
logger: LoggerPort;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/middleware/policy/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/middleware/policy/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AAK7E,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAA;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAU,MAAM,YAAY,CAAA;AAExF,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAA;IACZ,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAA;IACZ,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;IACf,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAA;IACd,iFAAiF;IACjF,IAAI,EAAE,mBAAmB,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,MAAM,EAAE,gBAAgB,CAAA;IACxB,gEAAgE;IAChE,WAAW,EAAE,OAAO,GAAG,MAAM,CAAA;IAC7B,uEAAuE;IACvE,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,KAAK,WAAW,CAAA;IACzF,kEAAkE;IAClE,uBAAuB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,WAAW,CAAA;IAC/D;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IACtD;;;;OAIG;IACH,WAAW,EAAE,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,KAAK,oBAAoB,CAAA;IACjF;;;;;;;;;;;;OAYG;IACH,oBAAoB,EAAE,oBAAoB,CAAA;CAC3C;AAED;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAEvE,MAAM,WAAW,4BAA4B;IAC3C,0DAA0D;IAC1D,MAAM,EAAE,UAAU,CAAA;IAClB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,OAAO,EAAE,4BAA4B,GACpC,eAAe,GAAG,IAAI,CAoGxB"}
|
|
@@ -12,6 +12,7 @@ import { createDefaultEngine } from './engine/index.js';
|
|
|
12
12
|
import { createPolicyInterceptor, createNoPolicyDeclaredInterceptor } from './interceptor.js';
|
|
13
13
|
import { loadPoliciesFromDir, mergePolicies } from './loader.js';
|
|
14
14
|
import { createPrincipalResolver } from './principal/index.js';
|
|
15
|
+
import { createCoLocatedAccumulator, } from './co-located-accumulator.js';
|
|
15
16
|
import { setPolicyProvider } from '../../mcp/resources/index.js';
|
|
16
17
|
/**
|
|
17
18
|
* Wire the entire policy stack from a single call. Returns null if
|
|
@@ -57,6 +58,15 @@ export function createPolicyBootstrap(config, options) {
|
|
|
57
58
|
});
|
|
58
59
|
};
|
|
59
60
|
const noPolicyDeclaredFactory = (procedureName) => createNoPolicyDeclaredInterceptor(procedureName, productionErrorBody);
|
|
61
|
+
// Co-located policy accumulator (1.1.60+). Collects (source, index)
|
|
62
|
+
// → Set<routeName> across the load, then flushes ONE policy per
|
|
63
|
+
// (source, index) with `scope.routes` set to the union of routes.
|
|
64
|
+
// Without this, an unscoped cascade _policy.yaml shared by N
|
|
65
|
+
// routes produced N copies in the engine (Bug A from 1.1.58).
|
|
66
|
+
const coLocatedAccumulator = createCoLocatedAccumulator({
|
|
67
|
+
engine,
|
|
68
|
+
flushLogger: policyLogger,
|
|
69
|
+
});
|
|
60
70
|
const getCoverage = (registered) => {
|
|
61
71
|
const gaps = [];
|
|
62
72
|
let covered = 0;
|
|
@@ -95,6 +105,7 @@ export function createPolicyBootstrap(config, options) {
|
|
|
95
105
|
noPolicyDeclaredFactory,
|
|
96
106
|
resolvePrincipal: async (ctx) => principalResolver(ctx),
|
|
97
107
|
getCoverage,
|
|
108
|
+
coLocatedAccumulator,
|
|
98
109
|
};
|
|
99
110
|
}
|
|
100
111
|
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/middleware/policy/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/middleware/policy/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,KAAK,EAIV,eAAe,EAEhB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAEpF,OAAO,EAGL,KAAK,oBAAoB,EAE1B,MAAM,eAAe,CAAA;AAuBtB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,eAAe,CAAA;IACvB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IAClD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,oBAAoB,EAAE,CAAA;CAC9B;AAyID;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAyD9B"}
|
|
@@ -48,6 +48,64 @@ function parsePolicyText(file, raw) {
|
|
|
48
48
|
throw new Error(`co-located policy loader: ${file}: invalid ${ext === '.json' ? 'JSON' : 'YAML'} — ${err.message}`);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
function normalisePolicyFile(parsed) {
|
|
52
|
+
// Shape 3: { _meta, policies: [...] }
|
|
53
|
+
if (parsed !== null &&
|
|
54
|
+
typeof parsed === 'object' &&
|
|
55
|
+
!Array.isArray(parsed) &&
|
|
56
|
+
'policies' in parsed) {
|
|
57
|
+
const obj = parsed;
|
|
58
|
+
if (!Array.isArray(obj.policies)) {
|
|
59
|
+
throw new Error(`co-located policy loader: file wrapper must have a "policies" array (got ${typeof obj.policies})`);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
fileMeta: isPolicyFileMeta(obj._meta) ? obj._meta : undefined,
|
|
63
|
+
policies: obj.policies,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Shape 1 or 2: bare policy or array of policies
|
|
67
|
+
const items = Array.isArray(parsed) ? parsed : [parsed];
|
|
68
|
+
return { policies: items };
|
|
69
|
+
}
|
|
70
|
+
function isPolicyFileMeta(value) {
|
|
71
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
72
|
+
return false;
|
|
73
|
+
const v = value;
|
|
74
|
+
if ('mode' in v && v.mode !== 'cascade' && v.mode !== 'scope')
|
|
75
|
+
return false;
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
function isPolicyAuditMeta(value) {
|
|
79
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
80
|
+
return false;
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
function validateFileMeta(fileMeta, file) {
|
|
84
|
+
if (!fileMeta)
|
|
85
|
+
return;
|
|
86
|
+
if (fileMeta.mode !== undefined && fileMeta.mode !== 'cascade' && fileMeta.mode !== 'scope') {
|
|
87
|
+
throw new Error(`co-located policy loader: ${file}: _meta.mode must be "cascade" or "scope" (got "${fileMeta.mode}")`);
|
|
88
|
+
}
|
|
89
|
+
if (fileMeta.deprecation !== undefined && !/^\d{4}-\d{2}-\d{2}$/.test(fileMeta.deprecation)) {
|
|
90
|
+
throw new Error(`co-located policy loader: ${file}: _meta.deprecation must be ISO-8601 date YYYY-MM-DD (got "${fileMeta.deprecation}")`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function mergeFileMetaIntoPolicy(policy, fileMeta, index) {
|
|
94
|
+
if (!fileMeta)
|
|
95
|
+
return policy;
|
|
96
|
+
// Per-policy _meta (if any) wins over file-level _meta. We do not
|
|
97
|
+
// require the per-policy block to be present — it just overrides when
|
|
98
|
+
// it is.
|
|
99
|
+
const merged = {
|
|
100
|
+
...(fileMeta.owner ? { owner: fileMeta.owner } : {}),
|
|
101
|
+
...(fileMeta.ticket ? { ticket: fileMeta.ticket } : {}),
|
|
102
|
+
...(fileMeta.description ? { description: fileMeta.description } : {}),
|
|
103
|
+
...(fileMeta.deprecation ? { deprecation: fileMeta.deprecation } : {}),
|
|
104
|
+
...(isPolicyAuditMeta(policy._meta) ? policy._meta : {}),
|
|
105
|
+
};
|
|
106
|
+
const hasAny = Object.keys(merged).length > 0;
|
|
107
|
+
return { ...policy, ...(hasAny ? { _meta: merged } : {}), _index: index };
|
|
108
|
+
}
|
|
51
109
|
function materializePolicy(file, index, raw, customConditions) {
|
|
52
110
|
const validate = getValidator();
|
|
53
111
|
if (!validate(raw)) {
|
|
@@ -86,9 +144,16 @@ export async function loadCoLocatedPolicies(options) {
|
|
|
86
144
|
continue;
|
|
87
145
|
const text = await source.readText(candidate);
|
|
88
146
|
const parsed = parsePolicyText(candidate, text);
|
|
89
|
-
const items =
|
|
90
|
-
|
|
91
|
-
|
|
147
|
+
const { fileMeta, policies: items } = normalisePolicyFile(parsed);
|
|
148
|
+
validateFileMeta(fileMeta, candidate);
|
|
149
|
+
const policies = items.map((item, i) => materializePolicy(candidate, i, mergeFileMetaIntoPolicy(item, fileMeta, i), customConditions));
|
|
150
|
+
files.push({
|
|
151
|
+
filePath: candidate,
|
|
152
|
+
policies,
|
|
153
|
+
kind: 'sibling',
|
|
154
|
+
...(fileMeta?.mode ? { mode: fileMeta.mode } : {}),
|
|
155
|
+
...(fileMeta ? { fileMeta } : {}),
|
|
156
|
+
});
|
|
92
157
|
break;
|
|
93
158
|
}
|
|
94
159
|
}
|
|
@@ -106,9 +171,17 @@ export async function loadCoLocatedPolicies(options) {
|
|
|
106
171
|
continue;
|
|
107
172
|
const text = await source.readText(candidate);
|
|
108
173
|
const parsed = parsePolicyText(candidate, text);
|
|
109
|
-
const items =
|
|
110
|
-
|
|
111
|
-
|
|
174
|
+
const { fileMeta, policies: items } = normalisePolicyFile(parsed);
|
|
175
|
+
validateFileMeta(fileMeta, candidate);
|
|
176
|
+
const policies = items.map((item, i) => materializePolicy(candidate, i, mergeFileMetaIntoPolicy(item, fileMeta, i), customConditions));
|
|
177
|
+
files.push({
|
|
178
|
+
filePath: candidate,
|
|
179
|
+
policies,
|
|
180
|
+
kind: 'folder',
|
|
181
|
+
dir,
|
|
182
|
+
...(fileMeta?.mode ? { mode: fileMeta.mode } : {}),
|
|
183
|
+
...(fileMeta ? { fileMeta } : {}),
|
|
184
|
+
});
|
|
112
185
|
break;
|
|
113
186
|
}
|
|
114
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,uEAAuE;AACvE,0EAA0E;AAC1E,yEAAyE;AACzE,gCAAgC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAA8C,CAAA;AAC1E,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,18 @@ export interface RouteDescriptor {
|
|
|
18
18
|
filePath: string;
|
|
19
19
|
}
|
|
20
20
|
export type PolicyFileKind = 'sibling' | 'folder';
|
|
21
|
+
/**
|
|
22
|
+
* Cascade mode for a co-located policy file. Forwarded from the file-level
|
|
23
|
+
* `_meta.mode` field (1.1.59+); absent means the default (`cascade`).
|
|
24
|
+
*
|
|
25
|
+
* - `cascade` (default): the file's policies inherit from any ancestor
|
|
26
|
+
* `_policy.yaml` and cascade to children — pre-1.1.59 behaviour.
|
|
27
|
+
* - `scope`: the file's policies apply only to handlers in the file's
|
|
28
|
+
* directory. They do NOT inherit from ancestors, nor cascade to
|
|
29
|
+
* children. Use this for self-contained policy surfaces (e.g. a closed
|
|
30
|
+
* admin zone that should not be subject to broader tenant rules).
|
|
31
|
+
*/
|
|
32
|
+
export type PolicyFileMode = 'cascade' | 'scope';
|
|
21
33
|
export interface PolicyFileDescriptor {
|
|
22
34
|
/** Absolute path of the policy file. */
|
|
23
35
|
filePath: string;
|
|
@@ -30,6 +42,19 @@ export interface PolicyFileDescriptor {
|
|
|
30
42
|
* covers. Sibling files leave this undefined.
|
|
31
43
|
*/
|
|
32
44
|
dir?: string;
|
|
45
|
+
/**
|
|
46
|
+
* File-level cascade mode (1.1.59+). When `scope`, the resolver skips
|
|
47
|
+
* both ancestors and children when pairing this file with handlers.
|
|
48
|
+
* Defaults to `'cascade'` (omitted from the descriptor when unset).
|
|
49
|
+
*/
|
|
50
|
+
mode?: PolicyFileMode;
|
|
51
|
+
/**
|
|
52
|
+
* File-level audit metadata (1.1.59+). Surfaced through
|
|
53
|
+
* `server.policy.list()` and `policyCoverage()` for ownership and
|
|
54
|
+
* lifecycle tracking. Per-policy `_meta` overrides the file-level
|
|
55
|
+
* values field-by-field at materialization time.
|
|
56
|
+
*/
|
|
57
|
+
fileMeta?: import('../types.js').PolicyFileMeta;
|
|
33
58
|
}
|
|
34
59
|
export interface PolicySource {
|
|
35
60
|
filePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEjD,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,kDAAkD;IAClD,IAAI,EAAE,cAAc,CAAA;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAA;AAEhD,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,kDAAkD;IAClD,IAAI,EAAE,cAAc,CAAA;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,aAAa,EAAE,cAAc,CAAA;CAChD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gEAAgE;IAChE,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAC3C,qBAAqB,EAAE,CA8DzB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAGrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D"}
|
|
@@ -81,13 +81,36 @@ export function resolveCoLocatedPolicies(routes, policyFiles) {
|
|
|
81
81
|
for (const route of routes) {
|
|
82
82
|
const policies = [];
|
|
83
83
|
const sources = [];
|
|
84
|
-
|
|
84
|
+
// Cascade-mode handling (1.1.59+): walk ancestors from closest to
|
|
85
|
+
// broadest, stopping the first time we encounter a folder file
|
|
86
|
+
// declared with `mode: scope`. The scope file acts as the
|
|
87
|
+
// authoritative reset point for its subtree: its own policies and
|
|
88
|
+
// the policies of anything below it still apply, but ancestor
|
|
89
|
+
// policies do not flow through. Walking closer→broader lets us
|
|
90
|
+
// detect the scope file before processing the ancestors it
|
|
91
|
+
// supersedes.
|
|
92
|
+
let scopeHit;
|
|
93
|
+
const dirs = ancestorDirs(route.filePath).slice().reverse();
|
|
94
|
+
for (const dir of dirs) {
|
|
95
|
+
if (scopeHit !== undefined) {
|
|
96
|
+
// A scope file earlier in the walk (i.e. closer to the route)
|
|
97
|
+
// has sealed this branch — ancestor policies do not apply.
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
85
100
|
const folder = folderByDir.get(dir);
|
|
86
101
|
if (!folder)
|
|
87
102
|
continue;
|
|
88
103
|
policies.push(...folder.policies);
|
|
89
104
|
sources.push({ filePath: folder.filePath, kind: 'folder' });
|
|
105
|
+
if (folder.mode === 'scope') {
|
|
106
|
+
scopeHit = dir;
|
|
107
|
+
}
|
|
90
108
|
}
|
|
109
|
+
// Reverse back so the source ordering matches the legacy semantics
|
|
110
|
+
// (broader → closer), so coverage reports and existing tests keep
|
|
111
|
+
// their expected order.
|
|
112
|
+
policies.reverse();
|
|
113
|
+
sources.reverse();
|
|
91
114
|
const sibling = siblingByKey.get(handlerBaseKey(route.filePath));
|
|
92
115
|
if (sibling) {
|
|
93
116
|
policies.push(...sibling.policies);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../../src/middleware/policy/co-located/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Co-located policy accumulator (1.1.60+, fix for the 1.1.58 N-copy
|
|
3
|
+
* leak described in `coverage-gaps.int.test.ts > bug A`).
|
|
4
|
+
*
|
|
5
|
+
* Background: when a cascade `_policy.yaml` is shared by N routes
|
|
6
|
+
* under the discovery tree, the previous implementation materialised
|
|
7
|
+
* one policy copy per route and called `engine.addPolicies()` per
|
|
8
|
+
* route. The engine dedupes by id (the deterministic `co:<hash>:<id>`
|
|
9
|
+
* is the same across all calls), but the `scope.routes = [routeName]`
|
|
10
|
+
* differed per call. The engine's `addPolicies` REPLACES in place, so
|
|
11
|
+
* only the LAST route's scope survived. Other routes had no policy
|
|
12
|
+
* attached at all. The fix is to never call `engine.addPolicies()`
|
|
13
|
+
* from the per-route path; instead, accumulate `(source, index) →
|
|
14
|
+
* Set<routeName>` across the load and flush ONCE with the union of
|
|
15
|
+
* routes in `scope.routes`.
|
|
16
|
+
*
|
|
17
|
+
* The accumulator is stateful and per-bootstrap (per server). Hot
|
|
18
|
+
* reload calls `reset()` to drop the previous load's accumulation
|
|
19
|
+
* before the next flush.
|
|
20
|
+
*/
|
|
21
|
+
import type { LoggerPort } from '../../ports/outbound/logger.js';
|
|
22
|
+
import type { PolicyEnginePort } from '../../ports/outbound/policy-engine.js';
|
|
23
|
+
import type { PolicyCondition } from './types.js';
|
|
24
|
+
export interface CoLocatedAccumulator {
|
|
25
|
+
/**
|
|
26
|
+
* Record that `routeName` is covered by `rawPolicy` (the
|
|
27
|
+
* post-`_meta`-merge JSON policy, with `_source` and `_index`
|
|
28
|
+
* populated by the loader). The optional `condition` is the
|
|
29
|
+
* resolved `customCondition` function — the accumulator does not
|
|
30
|
+
* resolve it itself because the lookup table lives on the
|
|
31
|
+
* bootstrap.
|
|
32
|
+
*
|
|
33
|
+
* `applyRouteScope` (default `true`) controls whether the
|
|
34
|
+
* accumulator fills `scope.routes` with the union of route
|
|
35
|
+
* names it sees. Set `false` for protocol-bound surfaces
|
|
36
|
+
* (GraphQL, WebSocket channels) where the engine action is
|
|
37
|
+
* something other than the route name — for those, scope.routes
|
|
38
|
+
* would be the wrong dimension to constrain on.
|
|
39
|
+
*/
|
|
40
|
+
add(rawPolicy: unknown, routeName: string, condition?: PolicyCondition, applyRouteScope?: boolean): void;
|
|
41
|
+
/**
|
|
42
|
+
* Commit the accumulated policies to the engine. Each
|
|
43
|
+
* `(source, index)` produces ONE policy with `scope.routes` set to
|
|
44
|
+
* the union of every route that referenced it (unless the entry
|
|
45
|
+
* was added with `applyRouteScope: false`). Returns the number of
|
|
46
|
+
* distinct policies materialised.
|
|
47
|
+
*/
|
|
48
|
+
flush(): {
|
|
49
|
+
materialised: number;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Drop the accumulated state without touching the engine. Called
|
|
53
|
+
* at the top of a hot reload so the next flush reflects only the
|
|
54
|
+
* routes that survived the reload.
|
|
55
|
+
*/
|
|
56
|
+
reset(): void;
|
|
57
|
+
}
|
|
58
|
+
export interface CreateCoLocatedAccumulatorOptions {
|
|
59
|
+
engine: PolicyEnginePort;
|
|
60
|
+
flushLogger: LoggerPort;
|
|
61
|
+
}
|
|
62
|
+
export declare function createCoLocatedAccumulator(options: CreateCoLocatedAccumulatorOptions): CoLocatedAccumulator;
|
|
63
|
+
//# sourceMappingURL=co-located-accumulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"co-located-accumulator.d.ts","sourceRoot":"","sources":["../../../src/middleware/policy/co-located-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,EAAU,eAAe,EAAE,MAAM,YAAY,CAAA;AAgCzD,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;OAcG;IACH,GAAG,CACD,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,eAAe,EAC3B,eAAe,CAAC,EAAE,OAAO,GACxB,IAAI,CAAA;IACP;;;;;;OAMG;IACH,KAAK,IAAI;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC;;;;OAIG;IACH,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,iCAAiC;IAChD,MAAM,EAAE,gBAAgB,CAAA;IACxB,WAAW,EAAE,UAAU,CAAA;CACxB;AAmED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iCAAiC,GACzC,oBAAoB,CAoFtB"}
|