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.
Files changed (70) hide show
  1. package/dist/core/registry.d.ts +11 -0
  2. package/dist/core/registry.d.ts.map +1 -1
  3. package/dist/core/registry.js +16 -0
  4. package/dist/core/registry.js.map +1 -1
  5. package/dist/middleware/policy/bootstrap.d.ts +32 -0
  6. package/dist/middleware/policy/bootstrap.d.ts.map +1 -1
  7. package/dist/middleware/policy/bootstrap.js +11 -0
  8. package/dist/middleware/policy/bootstrap.js.map +1 -1
  9. package/dist/middleware/policy/co-located/loader.d.ts.map +1 -1
  10. package/dist/middleware/policy/co-located/loader.js +79 -6
  11. package/dist/middleware/policy/co-located/loader.js.map +1 -1
  12. package/dist/middleware/policy/co-located/resolver.d.ts +25 -0
  13. package/dist/middleware/policy/co-located/resolver.d.ts.map +1 -1
  14. package/dist/middleware/policy/co-located/resolver.js +24 -1
  15. package/dist/middleware/policy/co-located/resolver.js.map +1 -1
  16. package/dist/middleware/policy/co-located-accumulator.d.ts +63 -0
  17. package/dist/middleware/policy/co-located-accumulator.d.ts.map +1 -0
  18. package/dist/middleware/policy/co-located-accumulator.js +148 -0
  19. package/dist/middleware/policy/co-located-accumulator.js.map +1 -0
  20. package/dist/middleware/policy/schema.d.ts +54 -0
  21. package/dist/middleware/policy/schema.d.ts.map +1 -1
  22. package/dist/middleware/policy/schema.js +45 -0
  23. package/dist/middleware/policy/schema.js.map +1 -1
  24. package/dist/middleware/policy/types.d.ts +60 -0
  25. package/dist/middleware/policy/types.d.ts.map +1 -1
  26. package/dist/server/builder/policy-bridges.d.ts +41 -0
  27. package/dist/server/builder/policy-bridges.d.ts.map +1 -0
  28. package/dist/server/builder/policy-bridges.js +96 -0
  29. package/dist/server/builder/policy-bridges.js.map +1 -0
  30. package/dist/server/builder/programmatic-registration.d.ts +43 -0
  31. package/dist/server/builder/programmatic-registration.d.ts.map +1 -0
  32. package/dist/server/builder/programmatic-registration.js +261 -0
  33. package/dist/server/builder/programmatic-registration.js.map +1 -0
  34. package/dist/server/builder.d.ts.map +1 -1
  35. package/dist/server/builder.js +68 -312
  36. package/dist/server/builder.js.map +1 -1
  37. package/dist/server/discovery-utils.d.ts +20 -1
  38. package/dist/server/discovery-utils.d.ts.map +1 -1
  39. package/dist/server/discovery-utils.js +72 -51
  40. package/dist/server/discovery-utils.js.map +1 -1
  41. package/dist/server/fs-routes/co-located-attach.d.ts +32 -0
  42. package/dist/server/fs-routes/co-located-attach.d.ts.map +1 -0
  43. package/dist/server/fs-routes/co-located-attach.js +69 -0
  44. package/dist/server/fs-routes/co-located-attach.js.map +1 -0
  45. package/dist/server/fs-routes/loader.d.ts.map +1 -1
  46. package/dist/server/fs-routes/loader.js +2 -232
  47. package/dist/server/fs-routes/loader.js.map +1 -1
  48. package/dist/server/fs-routes/route-naming.d.ts +61 -0
  49. package/dist/server/fs-routes/route-naming.d.ts.map +1 -0
  50. package/dist/server/fs-routes/route-naming.js +191 -0
  51. package/dist/server/fs-routes/route-naming.js.map +1 -0
  52. package/dist/server/orchestration/registration.d.ts +6 -2
  53. package/dist/server/orchestration/registration.d.ts.map +1 -1
  54. package/dist/server/orchestration/registration.js +9 -3
  55. package/dist/server/orchestration/registration.js.map +1 -1
  56. package/dist/ui/core/registry.d.ts +11 -0
  57. package/dist/ui/core/registry.d.ts.map +1 -1
  58. package/dist/ui/middleware/policy/co-located/loader.d.ts.map +1 -1
  59. package/dist/ui/middleware/policy/co-located/resolver.d.ts +25 -0
  60. package/dist/ui/middleware/policy/co-located/resolver.d.ts.map +1 -1
  61. package/dist/ui/middleware/policy/schema.d.ts +54 -0
  62. package/dist/ui/middleware/policy/schema.d.ts.map +1 -1
  63. package/dist/ui/middleware/policy/types.d.ts +60 -0
  64. package/dist/ui/middleware/policy/types.d.ts.map +1 -1
  65. package/dist/ui/server/fs-routes/co-located-attach.d.ts +32 -0
  66. package/dist/ui/server/fs-routes/co-located-attach.d.ts.map +1 -0
  67. package/dist/ui/server/fs-routes/loader.d.ts.map +1 -1
  68. package/dist/ui/server/fs-routes/route-naming.d.ts +61 -0
  69. package/dist/ui/server/fs-routes/route-naming.d.ts.map +1 -0
  70. package/package.json +1 -1
@@ -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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"}
@@ -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":"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"}
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;AAM7E,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAEhF,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;CAClF;AAED,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,CAyFxB"}
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":"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"}
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,EAGV,eAAe,EAChB,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;AAiDD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA0C9B"}
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 = Array.isArray(parsed) ? parsed : [parsed];
90
- const policies = items.map((item, i) => materializePolicy(candidate, i, item, customConditions));
91
- files.push({ filePath: candidate, policies, kind: 'sibling' });
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 = Array.isArray(parsed) ? parsed : [parsed];
110
- const policies = items.map((item, i) => materializePolicy(candidate, i, item, customConditions));
111
- files.push({ filePath: candidate, policies, kind: 'folder', dir });
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":"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"}
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;CACb;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,CAuCzB;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"}
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
- for (const dir of ancestorDirs(route.filePath)) {
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":"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"}
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"}