@stigmer/server 3.23.0 → 3.23.1-dev.20260923075205

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 (267) hide show
  1. package/dist/authorization/authorizer.d.ts +4 -8
  2. package/dist/authorization/authorizer.d.ts.map +1 -1
  3. package/dist/authorization/authorizer.js +5 -9
  4. package/dist/authorization/authorizer.js.map +1 -1
  5. package/dist/authorization/derived-tuples.d.ts.map +1 -1
  6. package/dist/authorization/derived-tuples.js +10 -25
  7. package/dist/authorization/derived-tuples.js.map +1 -1
  8. package/dist/authorization/evaluator.d.ts +7 -8
  9. package/dist/authorization/evaluator.d.ts.map +1 -1
  10. package/dist/authorization/evaluator.js +4 -20
  11. package/dist/authorization/evaluator.js.map +1 -1
  12. package/dist/authorization/list-read-scope.d.ts.map +1 -1
  13. package/dist/authorization/list-read-scope.js +5 -9
  14. package/dist/authorization/list-read-scope.js.map +1 -1
  15. package/dist/authorization/model/agent.d.ts.map +1 -1
  16. package/dist/authorization/model/agent.js +4 -5
  17. package/dist/authorization/model/agent.js.map +1 -1
  18. package/dist/authorization/model/agent_instance.d.ts.map +1 -1
  19. package/dist/authorization/model/agent_instance.js +2 -2
  20. package/dist/authorization/model/agent_instance.js.map +1 -1
  21. package/dist/authorization/model/mcp_server.d.ts.map +1 -1
  22. package/dist/authorization/model/mcp_server.js +2 -2
  23. package/dist/authorization/model/mcp_server.js.map +1 -1
  24. package/dist/authorization/model/plugin.d.ts.map +1 -1
  25. package/dist/authorization/model/plugin.js +3 -4
  26. package/dist/authorization/model/plugin.js.map +1 -1
  27. package/dist/authorization/model/rewrite.d.ts +8 -10
  28. package/dist/authorization/model/rewrite.d.ts.map +1 -1
  29. package/dist/authorization/model/rewrite.js +0 -3
  30. package/dist/authorization/model/rewrite.js.map +1 -1
  31. package/dist/authorization/model/skill.d.ts.map +1 -1
  32. package/dist/authorization/model/skill.js +2 -2
  33. package/dist/authorization/model/skill.js.map +1 -1
  34. package/dist/authorization/model/workflow.d.ts.map +1 -1
  35. package/dist/authorization/model/workflow.js +2 -2
  36. package/dist/authorization/model/workflow.js.map +1 -1
  37. package/dist/authorization/model/workflow_instance.d.ts.map +1 -1
  38. package/dist/authorization/model/workflow_instance.js +2 -2
  39. package/dist/authorization/model/workflow_instance.js.map +1 -1
  40. package/dist/authorization/organization-directory.d.ts.map +1 -1
  41. package/dist/authorization/organization-directory.js +2 -3
  42. package/dist/authorization/organization-directory.js.map +1 -1
  43. package/dist/authorization/store-test-kit.d.ts +0 -6
  44. package/dist/authorization/store-test-kit.d.ts.map +1 -1
  45. package/dist/authorization/store-test-kit.js +16 -62
  46. package/dist/authorization/store-test-kit.js.map +1 -1
  47. package/dist/authorization/tuples.d.ts +13 -32
  48. package/dist/authorization/tuples.d.ts.map +1 -1
  49. package/dist/authorization/tuples.js +3 -11
  50. package/dist/authorization/tuples.js.map +1 -1
  51. package/dist/domain/agent/controller.d.ts.map +1 -1
  52. package/dist/domain/agent/controller.js +4 -4
  53. package/dist/domain/agent/controller.js.map +1 -1
  54. package/dist/domain/agentchannel/controller.d.ts.map +1 -1
  55. package/dist/domain/agentchannel/controller.js +3 -1
  56. package/dist/domain/agentchannel/controller.js.map +1 -1
  57. package/dist/domain/agentexecution/controller.d.ts.map +1 -1
  58. package/dist/domain/agentexecution/controller.js +3 -1
  59. package/dist/domain/agentexecution/controller.js.map +1 -1
  60. package/dist/domain/agentinstance/controller.d.ts.map +1 -1
  61. package/dist/domain/agentinstance/controller.js +3 -4
  62. package/dist/domain/agentinstance/controller.js.map +1 -1
  63. package/dist/domain/agentshare/constants.d.ts +6 -11
  64. package/dist/domain/agentshare/constants.d.ts.map +1 -1
  65. package/dist/domain/agentshare/constants.js +8 -16
  66. package/dist/domain/agentshare/constants.js.map +1 -1
  67. package/dist/domain/agentshare/controller.d.ts.map +1 -1
  68. package/dist/domain/agentshare/controller.js +3 -1
  69. package/dist/domain/agentshare/controller.js.map +1 -1
  70. package/dist/domain/agentshare/steps.d.ts +18 -25
  71. package/dist/domain/agentshare/steps.d.ts.map +1 -1
  72. package/dist/domain/agentshare/steps.js +41 -142
  73. package/dist/domain/agentshare/steps.js.map +1 -1
  74. package/dist/domain/environment/controller.d.ts.map +1 -1
  75. package/dist/domain/environment/controller.js +2 -3
  76. package/dist/domain/environment/controller.js.map +1 -1
  77. package/dist/domain/executioncontext/controller.d.ts.map +1 -1
  78. package/dist/domain/executioncontext/controller.js +2 -1
  79. package/dist/domain/executioncontext/controller.js.map +1 -1
  80. package/dist/domain/mcpserver/controller.d.ts.map +1 -1
  81. package/dist/domain/mcpserver/controller.js +3 -4
  82. package/dist/domain/mcpserver/controller.js.map +1 -1
  83. package/dist/domain/plugin/controller.d.ts.map +1 -1
  84. package/dist/domain/plugin/controller.js +1 -3
  85. package/dist/domain/plugin/controller.js.map +1 -1
  86. package/dist/domain/plugin/push.d.ts +7 -5
  87. package/dist/domain/plugin/push.d.ts.map +1 -1
  88. package/dist/domain/plugin/push.js +8 -14
  89. package/dist/domain/plugin/push.js.map +1 -1
  90. package/dist/domain/schedule/controller.d.ts.map +1 -1
  91. package/dist/domain/schedule/controller.js +3 -1
  92. package/dist/domain/schedule/controller.js.map +1 -1
  93. package/dist/domain/session/controller.d.ts.map +1 -1
  94. package/dist/domain/session/controller.js +3 -2
  95. package/dist/domain/session/controller.js.map +1 -1
  96. package/dist/domain/skill/controller.d.ts.map +1 -1
  97. package/dist/domain/skill/controller.js +0 -2
  98. package/dist/domain/skill/controller.js.map +1 -1
  99. package/dist/domain/workflow/agent-call-references.d.ts +54 -0
  100. package/dist/domain/workflow/agent-call-references.d.ts.map +1 -0
  101. package/dist/domain/workflow/agent-call-references.js +97 -0
  102. package/dist/domain/workflow/agent-call-references.js.map +1 -0
  103. package/dist/domain/workflow/controller.d.ts.map +1 -1
  104. package/dist/domain/workflow/controller.js +14 -6
  105. package/dist/domain/workflow/controller.js.map +1 -1
  106. package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -1
  107. package/dist/domain/workflow/validation/task-config-constraints.d.ts +10 -1
  108. package/dist/domain/workflow/validation/task-config-constraints.d.ts.map +1 -1
  109. package/dist/domain/workflow/validation/task-config-constraints.js +3 -2
  110. package/dist/domain/workflow/validation/task-config-constraints.js.map +1 -1
  111. package/dist/domain/workflowexecution/controller.d.ts.map +1 -1
  112. package/dist/domain/workflowexecution/controller.js +4 -2
  113. package/dist/domain/workflowexecution/controller.js.map +1 -1
  114. package/dist/domain/workflowinstance/controller.d.ts.map +1 -1
  115. package/dist/domain/workflowinstance/controller.js +3 -4
  116. package/dist/domain/workflowinstance/controller.js.map +1 -1
  117. package/dist/extensions/authorization-queries.d.ts +6 -5
  118. package/dist/extensions/authorization-queries.d.ts.map +1 -1
  119. package/dist/extensions/list-read-scope.d.ts +1 -1
  120. package/dist/extensions/resource-authorization.d.ts +3 -2
  121. package/dist/extensions/resource-authorization.d.ts.map +1 -1
  122. package/dist/index.d.ts +1 -1
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js.map +1 -1
  125. package/dist/pipeline/apiresource-meta.d.ts +12 -3
  126. package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
  127. package/dist/pipeline/apiresource-meta.js +21 -10
  128. package/dist/pipeline/apiresource-meta.js.map +1 -1
  129. package/dist/pipeline/steps/authorization-tuples.d.ts +9 -3
  130. package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
  131. package/dist/pipeline/steps/authorization-tuples.js +9 -11
  132. package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
  133. package/dist/pipeline/steps/references.d.ts +178 -20
  134. package/dist/pipeline/steps/references.d.ts.map +1 -1
  135. package/dist/pipeline/steps/references.js +344 -43
  136. package/dist/pipeline/steps/references.js.map +1 -1
  137. package/dist/query/search/controller.js +0 -1
  138. package/dist/query/search/controller.js.map +1 -1
  139. package/dist/query/search/criteria.d.ts +1 -5
  140. package/dist/query/search/criteria.d.ts.map +1 -1
  141. package/dist/query/search/criteria.js +3 -13
  142. package/dist/query/search/criteria.js.map +1 -1
  143. package/dist/query/search/handler.d.ts +5 -4
  144. package/dist/query/search/handler.d.ts.map +1 -1
  145. package/dist/query/search/handler.js +7 -6
  146. package/dist/query/search/handler.js.map +1 -1
  147. package/dist/query/search/query-store.d.ts.map +1 -1
  148. package/dist/query/search/query-store.js +0 -2
  149. package/dist/query/search/query-store.js.map +1 -1
  150. package/dist/store/interface.d.ts +3 -6
  151. package/dist/store/interface.d.ts.map +1 -1
  152. package/dist/store/interface.js.map +1 -1
  153. package/dist/store/postgres/migrations.d.ts +3 -1
  154. package/dist/store/postgres/migrations.d.ts.map +1 -1
  155. package/dist/store/postgres/migrations.js +35 -1
  156. package/dist/store/postgres/migrations.js.map +1 -1
  157. package/dist/store/postgres/store.d.ts.map +1 -1
  158. package/dist/store/postgres/store.js +4 -9
  159. package/dist/store/postgres/store.js.map +1 -1
  160. package/dist/store/public-visibility-retired.d.ts +67 -0
  161. package/dist/store/public-visibility-retired.d.ts.map +1 -0
  162. package/dist/store/public-visibility-retired.js +55 -0
  163. package/dist/store/public-visibility-retired.js.map +1 -0
  164. package/dist/store/sqlite/migrations.d.ts +3 -1
  165. package/dist/store/sqlite/migrations.d.ts.map +1 -1
  166. package/dist/store/sqlite/migrations.js +36 -1
  167. package/dist/store/sqlite/migrations.js.map +1 -1
  168. package/dist/store/sqlite/store.d.ts.map +1 -1
  169. package/dist/store/sqlite/store.js +4 -8
  170. package/dist/store/sqlite/store.js.map +1 -1
  171. package/package.json +6 -6
  172. package/src/authorization/README.md +24 -26
  173. package/src/authorization/__tests__/authorizer.test.ts +10 -9
  174. package/src/authorization/__tests__/derived-tuples.test.ts +4 -11
  175. package/src/authorization/__tests__/evaluator.test.ts +14 -73
  176. package/src/authorization/__tests__/facts.test.ts +2 -2
  177. package/src/authorization/__tests__/fixtures/fga/agent-instance-creation.fga.yaml +19 -27
  178. package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +6 -98
  179. package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +4 -61
  180. package/src/authorization/__tests__/fixtures/fga/mcp-server-authoring.fga.yaml +1 -15
  181. package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +1 -21
  182. package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +1 -25
  183. package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +1 -3
  184. package/src/authorization/__tests__/list-read-scope.test.ts +18 -17
  185. package/src/authorization/__tests__/store-tests.test.ts +2 -6
  186. package/src/authorization/__tests__/tuples.test.ts +12 -11
  187. package/src/authorization/authorizer.ts +4 -9
  188. package/src/authorization/derived-tuples.ts +14 -31
  189. package/src/authorization/evaluator.ts +8 -44
  190. package/src/authorization/list-read-scope.ts +5 -11
  191. package/src/authorization/model/agent.ts +2 -5
  192. package/src/authorization/model/agent_instance.ts +0 -2
  193. package/src/authorization/model/mcp_server.ts +0 -2
  194. package/src/authorization/model/plugin.ts +1 -4
  195. package/src/authorization/model/rewrite.ts +8 -13
  196. package/src/authorization/model/skill.ts +0 -2
  197. package/src/authorization/model/workflow.ts +0 -2
  198. package/src/authorization/model/workflow_instance.ts +0 -2
  199. package/src/authorization/organization-directory.ts +1 -3
  200. package/src/authorization/store-test-kit.ts +16 -75
  201. package/src/authorization/tuples.ts +16 -39
  202. package/src/domain/agent/__tests__/agent.test.ts +11 -4
  203. package/src/domain/agent/controller.ts +7 -7
  204. package/src/domain/agentchannel/__tests__/agentchannel.test.ts +223 -48
  205. package/src/domain/agentchannel/controller.ts +6 -1
  206. package/src/domain/agentexecution/controller.ts +6 -1
  207. package/src/domain/agentinstance/controller.ts +6 -12
  208. package/src/domain/agentshare/__tests__/agentshare.test.ts +196 -172
  209. package/src/domain/agentshare/__tests__/create-authorization.test.ts +16 -31
  210. package/src/domain/agentshare/constants.ts +14 -26
  211. package/src/domain/agentshare/controller.ts +6 -1
  212. package/src/domain/agentshare/steps.ts +41 -194
  213. package/src/domain/environment/controller.ts +5 -8
  214. package/src/domain/executioncontext/controller.ts +5 -1
  215. package/src/domain/mcpserver/__tests__/mcpserver.test.ts +115 -28
  216. package/src/domain/mcpserver/__tests__/oauth-handshake.test.ts +53 -18
  217. package/src/domain/mcpserver/controller.ts +6 -12
  218. package/src/domain/plugin/controller.ts +1 -8
  219. package/src/domain/plugin/push.ts +8 -16
  220. package/src/domain/schedule/controller.ts +6 -1
  221. package/src/domain/session/controller.ts +12 -4
  222. package/src/domain/skill/controller.ts +0 -7
  223. package/src/domain/workflow/__tests__/agent-call-references.test.ts +222 -0
  224. package/src/domain/workflow/agent-call-references.ts +157 -0
  225. package/src/domain/workflow/controller.ts +28 -10
  226. package/src/domain/workflow/registry/data/task-kind-registry.json +1 -1
  227. package/src/domain/workflow/validation/task-config-constraints.ts +7 -3
  228. package/src/domain/workflowexecution/controller.ts +7 -2
  229. package/src/domain/workflowinstance/controller.ts +6 -12
  230. package/src/extensions/__tests__/built-in-authorization-composed.test.ts +32 -19
  231. package/src/extensions/__tests__/extension-composition.test.ts +4 -4
  232. package/src/extensions/__tests__/list-read-scope-composed.test.ts +9 -6
  233. package/src/extensions/authorization-queries.ts +6 -5
  234. package/src/extensions/list-read-scope.ts +1 -1
  235. package/src/extensions/resource-authorization.ts +3 -5
  236. package/src/index.ts +0 -1
  237. package/src/pipeline/__tests__/supports-visibility.test.ts +112 -0
  238. package/src/pipeline/apiresource-meta.ts +21 -10
  239. package/src/pipeline/steps/__tests__/authorization-tuples.test.ts +18 -31
  240. package/src/pipeline/steps/__tests__/references.test.ts +703 -0
  241. package/src/pipeline/steps/authorization-tuples.ts +9 -11
  242. package/src/pipeline/steps/references.ts +578 -70
  243. package/src/query/search/__tests__/criteria.test.ts +0 -4
  244. package/src/query/search/__tests__/query-store.test.ts +11 -40
  245. package/src/query/search/controller.ts +0 -1
  246. package/src/query/search/criteria.ts +0 -14
  247. package/src/query/search/handler.ts +6 -7
  248. package/src/query/search/query-store.ts +0 -2
  249. package/src/store/__tests__/public-visibility-retired.test.ts +127 -0
  250. package/src/store/__tests__/store-contract.ts +6 -51
  251. package/src/store/interface.ts +3 -6
  252. package/src/store/postgres/__tests__/migrations.test.ts +187 -6
  253. package/src/store/postgres/__tests__/store-contract.test.ts +0 -2
  254. package/src/store/postgres/migrations.ts +48 -1
  255. package/src/store/postgres/store.ts +4 -11
  256. package/src/store/public-visibility-retired.ts +119 -0
  257. package/src/store/sqlite/__tests__/migrations.test.ts +191 -5
  258. package/src/store/sqlite/migrations.ts +45 -1
  259. package/src/store/sqlite/store.ts +4 -10
  260. package/dist/pipeline/steps/visibility-gates.d.ts +0 -27
  261. package/dist/pipeline/steps/visibility-gates.d.ts.map +0 -1
  262. package/dist/pipeline/steps/visibility-gates.js +0 -139
  263. package/dist/pipeline/steps/visibility-gates.js.map +0 -1
  264. package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +0 -98
  265. package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +0 -52
  266. package/src/pipeline/steps/__tests__/visibility-gates.test.ts +0 -187
  267. package/src/pipeline/steps/visibility-gates.ts +0 -174
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * The tuple vocabulary of the built-in authorizer — the OpenFGA notions
3
3
  * the cloud's model is written in (object, relation, subject; a subject
4
- * being an object, a userset `type:id#relation`, or the public wildcard
5
- * `type:*` under a condition), typed once so the evaluator, the
6
- * derivation and the store-test kit speak one language. Nothing here is
4
+ * being an object or a userset `type:id#relation`), typed once so the
5
+ * evaluator, the derivation and the store-test kit speak one language. The
6
+ * model declares no wildcard subject and no condition: every reader of a
7
+ * row is an account or the holder of a relation on an object, which is
8
+ * why a check needs no context parameter. Nothing here is
7
9
  * stored: open source derives every tuple from a row (derived-tuples.ts)
8
10
  * or reads it from an IamPolicy row, and this module only names what a
9
11
  * tuple IS.
@@ -18,28 +20,18 @@
18
20
  * The type is named here; the construction (`personFor`, `resolvePerson`)
19
21
  * is person.ts's, so this module stays vocabulary with no I/O.
20
22
  *
21
- * `CheckContext` is the FGA condition context. The one condition the
22
- * model declares is `allow_public(allow: bool)` on the public wildcard,
23
- * and the cloud's own posture (stigmer-cloud authorizer/fga-authorizer.ts,
24
- * the Java BuildCheckRequest) is `allow: true` on a point check — a public
25
- * resource reads for any authenticated caller — and `allow: false` in a
26
- * listing, which keeps a public wildcard from flooding an organization's
27
- * catalog. The parameter is required so a caller states which posture it
28
- * is in; there is no default because either one is wrong for the other.
29
- *
30
- * The string forms (`agent:x`, `organization:acme#viewer`,
31
- * `identity_account:*`) are the notation the cloud's store tests and the
32
- * IamPolicy proto both use; parse and format are here so the kit and the
33
- * tests never spell them a second way.
23
+ * The string forms (`agent:x`, `organization:acme#viewer`) are the
24
+ * notation the cloud's store tests and the IamPolicy proto both use; parse
25
+ * and format are here so the kit and the tests never spell them a second
26
+ * way. The wildcard notation `type:*` is refused by the parser: the model
27
+ * has no line that admits one, so a fixture or a policy that spells it is
28
+ * a mistake to surface, never a subject to carry.
34
29
  */
35
30
  import type { Message } from "@bufbuild/protobuf";
36
31
 
37
32
  /** The FGA type name of the kind every person is: `identity_account:<id>`. */
38
33
  export const ACCOUNT_TYPE = "identity_account";
39
34
 
40
- /** The one condition the model declares; it guards the public wildcard. */
41
- export const ALLOW_PUBLIC_CONDITION = "allow_public";
42
-
43
35
  /** `type:id` — an object of the model. */
44
36
  export interface ObjectRef {
45
37
  readonly type: string;
@@ -55,12 +47,6 @@ export type Subject =
55
47
  readonly form: "userset";
56
48
  readonly object: ObjectRef;
57
49
  readonly relation: string;
58
- }
59
- /** `type:*` — every object of the type, honoured only when its condition holds. */
60
- | {
61
- readonly form: "wildcard";
62
- readonly type: string;
63
- readonly condition: string | undefined;
64
50
  };
65
51
 
66
52
  export interface Tuple {
@@ -97,11 +83,6 @@ export interface Person {
97
83
  readonly aliases: ReadonlySet<string>;
98
84
  }
99
85
 
100
- /** The condition parameters of a check (the module header). */
101
- export interface CheckContext {
102
- readonly allow: boolean;
103
- }
104
-
105
86
  // ---------------------------------------------------------------------------
106
87
  // The string notation.
107
88
  // ---------------------------------------------------------------------------
@@ -120,10 +101,8 @@ export function formatObjectRef(object: ObjectRef): string {
120
101
  }
121
102
 
122
103
  /**
123
- * `type:id`, `type:id#relation` or `type:*` → Subject. A wildcard parsed
124
- * from text carries no condition; the caller attaches one when its source
125
- * says so (the store tests carry it on the tuple, the derivation attaches
126
- * the model's).
104
+ * `type:id` or `type:id#relation` → Subject. `type:*` is refused (the
105
+ * module header): no line of the model admits a wildcard subject.
127
106
  */
128
107
  export function parseSubject(text: string): Subject {
129
108
  const hash = text.indexOf("#");
@@ -136,7 +115,9 @@ export function parseSubject(text: string): Subject {
136
115
  }
137
116
  const object = parseObjectRef(text);
138
117
  if (object.id === "*") {
139
- return { form: "wildcard", type: object.type, condition: undefined };
118
+ throw new Error(
119
+ `wildcard subject '${text}' is not admitted: the model declares no wildcard line`,
120
+ );
140
121
  }
141
122
  return { form: "object", object };
142
123
  }
@@ -147,10 +128,6 @@ export function formatSubject(subject: Subject): string {
147
128
  return formatObjectRef(subject.object);
148
129
  case "userset":
149
130
  return `${formatObjectRef(subject.object)}#${subject.relation}`;
150
- case "wildcard":
151
- return subject.condition === undefined
152
- ? `${subject.type}:*`
153
- : `${subject.type}:* with ${subject.condition}`;
154
131
  default: {
155
132
  const exhaustive: never = subject;
156
133
  throw new Error(`unknown subject form: ${JSON.stringify(exhaustive)}`);
@@ -131,8 +131,10 @@ function agentInput(overrides?: {
131
131
  }
132
132
 
133
133
  /**
134
- * Seeds an MCP server straight into the store — the mcpserver controller
135
- * arrives with sub-project #9, and the agent pipelines only need the row.
134
+ * Seeds an MCP server straight into the store — the agent pipelines only
135
+ * need the row. Org-visible, the level the mcpserver create chain would
136
+ * have stamped: an org-visible agent may reference it under the reference
137
+ * floor, as it would a server created through the API.
136
138
  */
137
139
  async function seedMcpServer(opts: {
138
140
  id: string;
@@ -155,6 +157,7 @@ async function seedMcpServer(opts: {
155
157
  name: opts.slug,
156
158
  slug: opts.slug,
157
159
  org: opts.org ?? ORG,
160
+ visibility: ApiResourceVisibility.visibility_org,
158
161
  },
159
162
  spec: { env: opts.env ?? {} },
160
163
  status: connected
@@ -309,11 +312,11 @@ describe("agent enabled-tools validation (#402)", () => {
309
312
  });
310
313
 
311
314
  describe("agent cascade delete (oss#611)", () => {
312
- it("sweeps ALL instances by spec.agent_id (cross-org included), deletes same-org shares, keeps cross-org shares", async () => {
315
+ it("sweeps ALL instances by spec.agent_id (cross-org included), deletes same-org shares, keeps a stored cross-org share", async () => {
313
316
  const agent = await command.create(
314
317
  agentInput({
315
318
  name: "Cascade Target",
316
- visibility: ApiResourceVisibility.visibility_public,
319
+ visibility: ApiResourceVisibility.visibility_org,
317
320
  }),
318
321
  );
319
322
  const agentId = agent.metadata!.id;
@@ -355,6 +358,10 @@ describe("agent cascade delete (oss#611)", () => {
355
358
  AgentShareSchema,
356
359
  sameOrgShare,
357
360
  );
361
+ // A share in another organization is a row no create admits any more
362
+ // (a share's agent lives in the share's organization); one written
363
+ // before that rule is still another organization's row, and the
364
+ // cascade leaves it as it always did.
358
365
  const crossOrgShare = create(AgentShareSchema, {
359
366
  metadata: { id: "ash_cross_org", name: "cross-org-share", org: "globex" },
360
367
  spec: {
@@ -42,10 +42,6 @@ import {
42
42
  newAuthorizeResolvedTargetStep,
43
43
  } from "../../pipeline/steps/authorize-resolved-target.js";
44
44
  import { newGuardReservedLabelsStep } from "../../pipeline/steps/guard-reserved-labels.js";
45
- import {
46
- newAuthorizeVisibilityTransitionStep,
47
- newGuardPublicVisibilityStep,
48
- } from "../../pipeline/steps/visibility-gates.js";
49
45
  import {
50
46
  newBuildNewStateStep,
51
47
  setAuditFieldsForUpdate,
@@ -77,6 +73,8 @@ import {
77
73
  newLoadTargetStep,
78
74
  } from "../../pipeline/steps/load-target.js";
79
75
  import {
76
+ collectSpecReferences,
77
+ newGuardReferenceFloorOnEscalationStep,
80
78
  newNormalizeReferencesStep,
81
79
  newValidateReferencesStep,
82
80
  } from "../../pipeline/steps/references.js";
@@ -168,7 +166,6 @@ async function createAgent(
168
166
  .addStep(newResolveSlugStep())
169
167
  .addStep(newCheckDuplicateStep(deps.store))
170
168
  .addStep(newBuildNewStateStep())
171
- .addStep(newGuardPublicVisibilityStep(deps.authorizer))
172
169
  .addStep(newGuardReservedLabelsStep(deps.authorizer))
173
170
  .addStep(newNormalizeReferencesStep())
174
171
  .addStep(newValidateReferencesStep(deps.store))
@@ -361,10 +358,13 @@ async function updateVisibility(
361
358
  )
362
359
  .addStep(newRecordVisibilityBeforeUpdateStep(UPDATE_VISIBILITY_AGENT_KEY))
363
360
  .addStep(newValidateVisibilityUpdateStep())
361
+ // The reference floor's second door: an agent may not be raised above
362
+ // the skills and MCP servers it runs with.
364
363
  .addStep(
365
- newAuthorizeVisibilityTransitionStep(
364
+ newGuardReferenceFloorOnEscalationStep(
365
+ deps.store,
366
366
  UPDATE_VISIBILITY_AGENT_KEY,
367
- deps.authorizer,
367
+ [(row) => collectSpecReferences(AgentSchema, row)],
368
368
  ),
369
369
  )
370
370
  .addStep(newSetAgentVisibilityStep())