@vantageos/cloud-identity 0.4.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -3,6 +3,30 @@
3
3
  All notable changes to `@vantageos/cloud-identity` are documented here.
4
4
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
5
 
6
+ ## [0.5.0]
7
+
8
+ **Additive — grant-aware scope filter.** Closes the other pole of the
9
+ fail-closed defect class: 0.3.0/0.4.0 closed "a right granted by ABSENCE"
10
+ (missing `oauthCtx` silently passing everything); this closes "a right
11
+ REFUSED by absence" — a per-row grant (a named mission agent/pilot, a
12
+ mandate's `fulfilledBy`) that IS present on the row but that
13
+ `passesScopeFilter`/`scopeFilterList`/`scopeFilterGet` were structurally
14
+ blind to, because they only ever consulted `createdBy`/`namespace`.
15
+
16
+ ### Added
17
+
18
+ - `passesScopeFilter`, `scopeFilterList`, `scopeFilterGet` (`src/scope-filter.ts`)
19
+ now accept an optional `grantFields: readonly string[]` parameter, defaulting
20
+ to `[]`. Each entry names a property on the row that the CALLER declares as
21
+ a per-row grant — the field's runtime value is treated as a single identity
22
+ (`string`, equality match) or multiple identities (`string[]`, any-element
23
+ match) against `oauthCtx.fromAllowList`. The package never hardcodes which
24
+ fields are grants for which table; that declaration is caller-supplied data.
25
+ - **Fail-closed regression preserved byte-for-byte:** omitting `grantFields`
26
+ (or passing `[]`) reproduces 0.4.0 behaviour exactly — this is a pure
27
+ widening, no existing caller's behaviour changes without an explicit
28
+ opt-in declaration at its own call site.
29
+
6
30
  ## [0.4.0]
7
31
 
8
32
  **Additive.** Two new primitives so one identity layer covers both deployment
@@ -5,6 +5,31 @@
5
5
  * implementation; the only change was replacing a framework-specific context
6
6
  * type with the framework-agnostic `OAuthCtx` from `./types`.
7
7
  *
8
+ * Contract (0.5.0 — additive, widening only, vs. 0.4.0):
9
+ * - Every exported predicate/filter now accepts an OPTIONAL `grantFields`
10
+ * parameter: `readonly string[]`, defaulting to `[]`. Each entry names a
11
+ * property on the row that the CALLER declares as a per-row grant (e.g.
12
+ * "agents", "pilot", "fulfilledBy"). The package never hardcodes which
13
+ * fields are grants for which table — that declaration is data supplied
14
+ * by the caller at the call site, not business knowledge baked into this
15
+ * shared module (no-hardcoded-business-knowledge).
16
+ * - A row passes for a non-master caller if createdBy/namespace already
17
+ * passed (0.4.0 behaviour, unchanged) OR if ANY declared grant field's
18
+ * value names an identity in `oauthCtx.fromAllowList` — the field may be
19
+ * a single string (e.g. "pilot") or a string[] (e.g. "agents"): a string
20
+ * value matches by equality, an array value matches if any element is in
21
+ * `fromAllowList`.
22
+ * - `grantFields` defaulting to `[]` means a caller that declares NO grants
23
+ * gets EXACTLY the 0.4.0 behaviour, byte-for-byte — this is a pure
24
+ * widening, no existing caller's behaviour changes without an explicit
25
+ * opt-in declaration at its own call site.
26
+ * - This closes the OTHER pole of the fail-closed defect: 0.3.0/0.4.0
27
+ * closed "a right granted by ABSENCE" (missing oauthCtx silently passing
28
+ * everything); this closes "a right REFUSED by absence" — a grant that
29
+ * IS present on the row (a named agent, pilot, or fulfiller) but that the
30
+ * filter was structurally blind to because it only ever consulted
31
+ * createdBy/namespace.
32
+ *
8
33
  * Contract (0.3.0 — BREAKING vs. 0.2.0):
9
34
  * - `oauthCtx` is now MANDATORY. A right is never granted by absence: the
10
35
  * 0.2.0 behaviour of `oauthCtx === undefined` silently passing everything
@@ -50,6 +75,18 @@ export type ScopeFilterable = {
50
75
  * `fromAllowList` contains the `"*"` sentinel.
51
76
  */
52
77
  export declare function isMasterScope(ctx: OAuthCtx): boolean;
78
+ /**
79
+ * Names of row properties the CALLER declares as per-row grants. Each named
80
+ * property's runtime value must be a `string` (single identity) or
81
+ * `string[]` (multiple identities) to be consulted — any other runtime shape
82
+ * is silently skipped (not a match), never thrown, since these are duck-typed
83
+ * against arbitrary Convex documents.
84
+ *
85
+ * This is DATA supplied by the call site, never a list hardcoded inside this
86
+ * package: the package does not and must not know that "agents" means
87
+ * missions or "fulfilledBy" means mandates.
88
+ */
89
+ export type GrantFieldDeclaration = readonly string[];
53
90
  /**
54
91
  * Core predicate. Returns true when the row is visible to the caller.
55
92
  *
@@ -57,6 +94,9 @@ export declare function isMasterScope(ctx: OAuthCtx): boolean;
57
94
  * - row.createdBy ∈ oauthCtx.fromAllowList → true
58
95
  * - row.namespace === prefix OR startsWith prefix+'/'
59
96
  * for any prefix ∈ oauthCtx.namespaceReadPrefixes → true
97
+ * - row[grantField] (for any declared grantField) names an identity in
98
+ * oauthCtx.fromAllowList, where the field is a string (equality) or a
99
+ * string[] (any-element membership) → true
60
100
  * - otherwise → false
61
101
  *
62
102
  * `oauthCtx` is mandatory (see module-level contract note above): an omitted
@@ -64,21 +104,32 @@ export declare function isMasterScope(ctx: OAuthCtx): boolean;
64
104
  * need the old legacy-bearer wildcard behaviour must pass `LEGACY_WILDCARD_CTX`
65
105
  * explicitly.
66
106
  *
107
+ * `grantFields` (0.5.0, optional, defaults to `[]`) lets a caller widen the
108
+ * predicate for its own table without this package hardcoding which fields
109
+ * are grants — see the module-level 0.5.0 contract note above. Omitting it
110
+ * (or passing `[]`) reproduces 0.4.0 behaviour exactly.
111
+ *
67
112
  * Substring matches that don't fall on a '/' boundary are explicitly rejected
68
113
  * (e.g. namespace="orchestrator/alphabet" does NOT match prefix
69
114
  * "orchestrator/alpha"). This avoids the classic prefix-isolation bypass.
70
115
  */
71
- export declare function passesScopeFilter(oauthCtx: OAuthCtx, row: ScopeFilterable): boolean;
116
+ export declare function passesScopeFilter<T extends ScopeFilterable>(oauthCtx: OAuthCtx, row: T, grantFields?: GrantFieldDeclaration): boolean;
72
117
  /**
73
118
  * Filter a list of rows (post-query). Used by list_* tools.
119
+ *
120
+ * `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
121
+ * behaviour).
74
122
  */
75
- export declare function scopeFilterList<T extends ScopeFilterable>(oauthCtx: OAuthCtx, rows: T[]): T[];
123
+ export declare function scopeFilterList<T extends ScopeFilterable>(oauthCtx: OAuthCtx, rows: T[], grantFields?: GrantFieldDeclaration): T[];
76
124
  /**
77
125
  * Assert a single row passes (get_* tools). Returns the row when allowed, null
78
126
  * otherwise — callers translate null to a 404-equivalent "not found" MCP error
79
127
  * to avoid leaking the difference between "absent" and "filtered out".
128
+ *
129
+ * `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
130
+ * behaviour).
80
131
  */
81
- export declare function scopeFilterGet<T extends ScopeFilterable>(oauthCtx: OAuthCtx, row: T | null | undefined): T | null;
132
+ export declare function scopeFilterGet<T extends ScopeFilterable>(oauthCtx: OAuthCtx, row: T | null | undefined, grantFields?: GrantFieldDeclaration): T | null;
82
133
  /**
83
134
  * Helper for callers that want a single "is master / legacy" predicate.
84
135
  */
@@ -1 +1 @@
1
- {"version":3,"file":"scope-filter.d.ts","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAKjC,CAAC;AAWF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAIpD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,eAAe,GACnB,OAAO,CAYT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,eAAe,EACvD,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,EAAE,GACR,CAAC,EAAE,CAGL;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,eAAe,EACtD,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GACxB,CAAC,GAAG,IAAI,CAIV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAGtD"}
1
+ {"version":3,"file":"scope-filter.d.ts","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAKjC,CAAC;AAWF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAIpD;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,MAAM,EAAE,CAAC;AActD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzD,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,CAAC,EACN,WAAW,GAAE,qBAAuC,GACnD,OAAO,CAgBT;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,eAAe,EACvD,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,EAAE,EACT,WAAW,GAAE,qBAAuC,GACnD,CAAC,EAAE,CAGL;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,eAAe,EACtD,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzB,WAAW,GAAE,qBAAuC,GACnD,CAAC,GAAG,IAAI,CAIV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAGtD"}
@@ -5,6 +5,31 @@
5
5
  * implementation; the only change was replacing a framework-specific context
6
6
  * type with the framework-agnostic `OAuthCtx` from `./types`.
7
7
  *
8
+ * Contract (0.5.0 — additive, widening only, vs. 0.4.0):
9
+ * - Every exported predicate/filter now accepts an OPTIONAL `grantFields`
10
+ * parameter: `readonly string[]`, defaulting to `[]`. Each entry names a
11
+ * property on the row that the CALLER declares as a per-row grant (e.g.
12
+ * "agents", "pilot", "fulfilledBy"). The package never hardcodes which
13
+ * fields are grants for which table — that declaration is data supplied
14
+ * by the caller at the call site, not business knowledge baked into this
15
+ * shared module (no-hardcoded-business-knowledge).
16
+ * - A row passes for a non-master caller if createdBy/namespace already
17
+ * passed (0.4.0 behaviour, unchanged) OR if ANY declared grant field's
18
+ * value names an identity in `oauthCtx.fromAllowList` — the field may be
19
+ * a single string (e.g. "pilot") or a string[] (e.g. "agents"): a string
20
+ * value matches by equality, an array value matches if any element is in
21
+ * `fromAllowList`.
22
+ * - `grantFields` defaulting to `[]` means a caller that declares NO grants
23
+ * gets EXACTLY the 0.4.0 behaviour, byte-for-byte — this is a pure
24
+ * widening, no existing caller's behaviour changes without an explicit
25
+ * opt-in declaration at its own call site.
26
+ * - This closes the OTHER pole of the fail-closed defect: 0.3.0/0.4.0
27
+ * closed "a right granted by ABSENCE" (missing oauthCtx silently passing
28
+ * everything); this closes "a right REFUSED by absence" — a grant that
29
+ * IS present on the row (a named agent, pilot, or fulfiller) but that the
30
+ * filter was structurally blind to because it only ever consulted
31
+ * createdBy/namespace.
32
+ *
8
33
  * Contract (0.3.0 — BREAKING vs. 0.2.0):
9
34
  * - `oauthCtx` is now MANDATORY. A right is never granted by absence: the
10
35
  * 0.2.0 behaviour of `oauthCtx === undefined` silently passing everything
@@ -57,6 +82,15 @@ export function isMasterScope(ctx) {
57
82
  return true;
58
83
  return ctx.fromAllowList.includes("*");
59
84
  }
85
+ const NO_GRANT_FIELDS = [];
86
+ function grantFieldMatches(value, fromAllowList) {
87
+ if (typeof value === "string")
88
+ return fromAllowList.includes(value);
89
+ if (Array.isArray(value)) {
90
+ return value.some((entry) => typeof entry === "string" && fromAllowList.includes(entry));
91
+ }
92
+ return false;
93
+ }
60
94
  /**
61
95
  * Core predicate. Returns true when the row is visible to the caller.
62
96
  *
@@ -64,6 +98,9 @@ export function isMasterScope(ctx) {
64
98
  * - row.createdBy ∈ oauthCtx.fromAllowList → true
65
99
  * - row.namespace === prefix OR startsWith prefix+'/'
66
100
  * for any prefix ∈ oauthCtx.namespaceReadPrefixes → true
101
+ * - row[grantField] (for any declared grantField) names an identity in
102
+ * oauthCtx.fromAllowList, where the field is a string (equality) or a
103
+ * string[] (any-element membership) → true
67
104
  * - otherwise → false
68
105
  *
69
106
  * `oauthCtx` is mandatory (see module-level contract note above): an omitted
@@ -71,11 +108,16 @@ export function isMasterScope(ctx) {
71
108
  * need the old legacy-bearer wildcard behaviour must pass `LEGACY_WILDCARD_CTX`
72
109
  * explicitly.
73
110
  *
111
+ * `grantFields` (0.5.0, optional, defaults to `[]`) lets a caller widen the
112
+ * predicate for its own table without this package hardcoding which fields
113
+ * are grants — see the module-level 0.5.0 contract note above. Omitting it
114
+ * (or passing `[]`) reproduces 0.4.0 behaviour exactly.
115
+ *
74
116
  * Substring matches that don't fall on a '/' boundary are explicitly rejected
75
117
  * (e.g. namespace="orchestrator/alphabet" does NOT match prefix
76
118
  * "orchestrator/alpha"). This avoids the classic prefix-isolation bypass.
77
119
  */
78
- export function passesScopeFilter(oauthCtx, row) {
120
+ export function passesScopeFilter(oauthCtx, row, grantFields = NO_GRANT_FIELDS) {
79
121
  assertOauthCtx(oauthCtx);
80
122
  if (isMasterScope(oauthCtx))
81
123
  return true;
@@ -90,25 +132,36 @@ export function passesScopeFilter(oauthCtx, row) {
90
132
  return true;
91
133
  }
92
134
  }
135
+ for (const field of grantFields) {
136
+ const value = row[field];
137
+ if (grantFieldMatches(value, oauthCtx.fromAllowList))
138
+ return true;
139
+ }
93
140
  return false;
94
141
  }
95
142
  /**
96
143
  * Filter a list of rows (post-query). Used by list_* tools.
144
+ *
145
+ * `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
146
+ * behaviour).
97
147
  */
98
- export function scopeFilterList(oauthCtx, rows) {
148
+ export function scopeFilterList(oauthCtx, rows, grantFields = NO_GRANT_FIELDS) {
99
149
  assertOauthCtx(oauthCtx);
100
- return rows.filter((r) => passesScopeFilter(oauthCtx, r));
150
+ return rows.filter((r) => passesScopeFilter(oauthCtx, r, grantFields));
101
151
  }
102
152
  /**
103
153
  * Assert a single row passes (get_* tools). Returns the row when allowed, null
104
154
  * otherwise — callers translate null to a 404-equivalent "not found" MCP error
105
155
  * to avoid leaking the difference between "absent" and "filtered out".
156
+ *
157
+ * `grantFields` — see `passesScopeFilter`. Defaults to `[]` (0.4.0-identical
158
+ * behaviour).
106
159
  */
107
- export function scopeFilterGet(oauthCtx, row) {
160
+ export function scopeFilterGet(oauthCtx, row, grantFields = NO_GRANT_FIELDS) {
108
161
  assertOauthCtx(oauthCtx);
109
162
  if (row == null)
110
163
  return null;
111
- return passesScopeFilter(oauthCtx, row) ? row : null;
164
+ return passesScopeFilter(oauthCtx, row, grantFields) ? row : null;
112
165
  }
113
166
  /**
114
167
  * Helper for callers that want a single "is master / legacy" predicate.
@@ -1 +1 @@
1
- {"version":3,"file":"scope-filter.js","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAa;IAC3C,KAAK,EAAE,QAAQ;IACf,aAAa,EAAE,CAAC,GAAG,CAAC;IACpB,qBAAqB,EAAE,EAAE;IACzB,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAEF,SAAS,cAAc,CAAC,QAAkB;IACxC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,SAAS,CACjB,2EAA2E;YACzE,0EAA0E,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAa;IACzC,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,GAAoB;IAEpB,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,IAAI,aAAa,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC;IACrC,IAAI,SAAS,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YAC/C,IAAI,SAAS,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QACjD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAkB,EAClB,IAAS;IAET,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,GAAyB;IAEzB,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzB,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"scope-filter.js","sourceRoot":"","sources":["../src/scope-filter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vantageos/cloud-identity",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Framework-agnostic identity + scope-filter primitives for VantagePeers Cloud (multi-tenant MCP).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",