@bluelibs/runner-dev 6.2.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +131 -12
  2. package/dist/cli/generators/initUtils.js +1 -1
  3. package/dist/cli/generators/initUtils.js.map +1 -1
  4. package/dist/cli/generators/scaffold/templates/README.md.js +17 -4
  5. package/dist/cli/generators/scaffold/templates/README.md.js.map +1 -1
  6. package/dist/cli/generators/scaffold/templates/index.d.ts +2 -1
  7. package/dist/cli/generators/scaffold/templates/index.js +5 -3
  8. package/dist/cli/generators/scaffold/templates/index.js.map +1 -1
  9. package/dist/cli/generators/scaffold/templates/package.json.d.ts +7 -2
  10. package/dist/cli/generators/scaffold/templates/package.json.js +7 -2
  11. package/dist/cli/generators/scaffold/templates/package.json.js.map +1 -1
  12. package/dist/cli/generators/scaffold/templates/src/app.test.ts.d.ts +1 -0
  13. package/dist/cli/generators/scaffold/templates/src/app.test.ts.js +29 -0
  14. package/dist/cli/generators/scaffold/templates/src/app.test.ts.js.map +1 -0
  15. package/dist/cli/generators/scaffold/templates/src/app.ts.d.ts +1 -0
  16. package/dist/cli/generators/scaffold/templates/src/app.ts.js +15 -0
  17. package/dist/cli/generators/scaffold/templates/src/app.ts.js.map +1 -0
  18. package/dist/cli/generators/scaffold/templates/src/main.ts.js +3 -10
  19. package/dist/cli/generators/scaffold/templates/src/main.ts.js.map +1 -1
  20. package/dist/cli/generators/scaffold/templates/tsconfig.json.d.ts +2 -0
  21. package/dist/cli/generators/scaffold/templates/tsconfig.json.js +2 -0
  22. package/dist/cli/generators/scaffold/templates/tsconfig.json.js.map +1 -1
  23. package/dist/cli/generators/scaffold.js +2 -1
  24. package/dist/cli/generators/scaffold.js.map +1 -1
  25. package/dist/cli.js +0 -0
  26. package/dist/docs/packageDocs.d.ts +16 -0
  27. package/dist/docs/packageDocs.js +107 -0
  28. package/dist/docs/packageDocs.js.map +1 -0
  29. package/dist/exportDocs.d.ts +10 -0
  30. package/dist/exportDocs.js +98 -0
  31. package/dist/exportDocs.js.map +1 -0
  32. package/dist/generated/resolvers-types.d.ts +114 -29
  33. package/dist/index.d.ts +4 -1
  34. package/dist/index.js +3 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp/env.d.ts +5 -0
  37. package/dist/mcp/env.js +30 -1
  38. package/dist/mcp/env.js.map +1 -1
  39. package/dist/mcp/help.d.ts +8 -1
  40. package/dist/mcp/help.js +30 -4
  41. package/dist/mcp/help.js.map +1 -1
  42. package/dist/mcp/http.js +10 -0
  43. package/dist/mcp/http.js.map +1 -1
  44. package/dist/mcp/projectOverview.js +13 -4
  45. package/dist/mcp/projectOverview.js.map +1 -1
  46. package/dist/mcp/snapshot.d.ts +22 -0
  47. package/dist/mcp/snapshot.js +347 -0
  48. package/dist/mcp/snapshot.js.map +1 -0
  49. package/dist/mcp/tools/graphql.mutation.js +4 -1
  50. package/dist/mcp/tools/graphql.mutation.js.map +1 -1
  51. package/dist/mcp/tools/graphql.ping.js +1 -1
  52. package/dist/mcp/tools/graphql.ping.js.map +1 -1
  53. package/dist/mcp/tools/graphql.query.js +1 -1
  54. package/dist/mcp/tools/graphql.query.js.map +1 -1
  55. package/dist/mcp/tools/help.read.js +7 -5
  56. package/dist/mcp/tools/help.read.js.map +1 -1
  57. package/dist/mcp/tools/help.runner.js +3 -1
  58. package/dist/mcp/tools/help.runner.js.map +1 -1
  59. package/dist/mcp/tools/help.runnerDev.js +4 -4
  60. package/dist/mcp/tools/help.runnerDev.js.map +1 -1
  61. package/dist/mcp.js +4 -9
  62. package/dist/mcp.js.map +1 -1
  63. package/dist/resources/docsPayload.d.ts +33 -0
  64. package/dist/resources/docsPayload.js +171 -0
  65. package/dist/resources/docsPayload.js.map +1 -0
  66. package/dist/resources/docsUiAssets.d.ts +27 -0
  67. package/dist/resources/docsUiAssets.js +150 -0
  68. package/dist/resources/docsUiAssets.js.map +1 -0
  69. package/dist/resources/graphql-accumulator.resource.d.ts +1 -0
  70. package/dist/resources/graphql-accumulator.resource.js +30 -26
  71. package/dist/resources/graphql-accumulator.resource.js.map +1 -1
  72. package/dist/resources/live.resource.js +1 -1
  73. package/dist/resources/live.resource.js.map +1 -1
  74. package/dist/resources/models/Introspector.d.ts +12 -0
  75. package/dist/resources/models/Introspector.js +51 -28
  76. package/dist/resources/models/Introspector.js.map +1 -1
  77. package/dist/resources/models/initializeFromStore.js +5 -5
  78. package/dist/resources/models/initializeFromStore.js.map +1 -1
  79. package/dist/resources/models/initializeFromStore.utils.d.ts +2 -2
  80. package/dist/resources/models/initializeFromStore.utils.js +395 -68
  81. package/dist/resources/models/initializeFromStore.utils.js.map +1 -1
  82. package/dist/resources/models/introspector.tools.js +88 -4
  83. package/dist/resources/models/introspector.tools.js.map +1 -1
  84. package/dist/resources/routeHandlers/createDocsServeHandler.js +13 -37
  85. package/dist/resources/routeHandlers/createDocsServeHandler.js.map +1 -1
  86. package/dist/resources/routeHandlers/getDocsData.d.ts +1 -6
  87. package/dist/resources/routeHandlers/getDocsData.js +10 -168
  88. package/dist/resources/routeHandlers/getDocsData.js.map +1 -1
  89. package/dist/resources/server.resource.js +0 -1
  90. package/dist/resources/server.resource.js.map +1 -1
  91. package/dist/resources/ui.static.js +4 -9
  92. package/dist/resources/ui.static.js.map +1 -1
  93. package/dist/schema/model.d.ts +18 -0
  94. package/dist/schema/model.js +14 -0
  95. package/dist/schema/model.js.map +1 -1
  96. package/dist/schema/query.js +3 -3
  97. package/dist/schema/query.js.map +1 -1
  98. package/dist/schema/types/AllType.js +2 -21
  99. package/dist/schema/types/AllType.js.map +1 -1
  100. package/dist/schema/types/ErrorType.js +1 -3
  101. package/dist/schema/types/ErrorType.js.map +1 -1
  102. package/dist/schema/types/EventType.js +6 -19
  103. package/dist/schema/types/EventType.js.map +1 -1
  104. package/dist/schema/types/HookType.js +4 -16
  105. package/dist/schema/types/HookType.js.map +1 -1
  106. package/dist/schema/types/ResourceType.js +50 -23
  107. package/dist/schema/types/ResourceType.js.map +1 -1
  108. package/dist/schema/types/TaskLikeCommon.js +2 -2
  109. package/dist/schema/types/TaskLikeCommon.js.map +1 -1
  110. package/dist/schema/types/TaskType.js +6 -19
  111. package/dist/schema/types/TaskType.js.map +1 -1
  112. package/dist/schema/types/middleware/UsageTypes.d.ts +1 -0
  113. package/dist/schema/types/middleware/UsageTypes.js +16 -5
  114. package/dist/schema/types/middleware/UsageTypes.js.map +1 -1
  115. package/dist/schema/types/middleware/common.js +2 -2
  116. package/dist/schema/types/middleware/common.js.map +1 -1
  117. package/dist/ui/.vite/manifest.json +2 -2
  118. package/dist/ui/assets/docs-Beb_xRuE.js +304 -0
  119. package/dist/ui/assets/docs-Beb_xRuE.js.map +1 -0
  120. package/dist/ui/assets/docs-lid1amCk.css +1 -0
  121. package/dist/ui/docs/favicon.ico +0 -0
  122. package/dist/utils/lane-resources.d.ts +69 -0
  123. package/dist/utils/lane-resources.js +145 -0
  124. package/dist/utils/lane-resources.js.map +1 -1
  125. package/dist/utils/runner-namespace.d.ts +1 -0
  126. package/dist/utils/runner-namespace.js +9 -0
  127. package/dist/utils/runner-namespace.js.map +1 -0
  128. package/dist/utils/schemaFormat.d.ts +6 -0
  129. package/dist/utils/schemaFormat.js +244 -0
  130. package/dist/utils/schemaFormat.js.map +1 -0
  131. package/dist/utils/system-namespace.d.ts +1 -0
  132. package/dist/utils/system-namespace.js +9 -0
  133. package/dist/utils/system-namespace.js.map +1 -0
  134. package/dist/version.d.ts +1 -1
  135. package/dist/version.js +1 -1
  136. package/package.json +21 -5
  137. package/readmes/API_REFERENCE.md +364 -0
  138. package/readmes/COMPACT_GUIDE.md +254 -0
  139. package/skills/core/SKILL.md +27 -0
  140. package/skills/core/references/readmes/API_REFERENCE.md +364 -0
  141. package/skills/core/references/readmes/COMPACT_GUIDE.md +254 -0
  142. package/AI.md +0 -630
  143. package/dist/ui/assets/docs-CWJO6emS.css +0 -1
  144. package/dist/ui/assets/docs-Zej7hPlV.js +0 -302
  145. package/dist/ui/assets/docs-Zej7hPlV.js.map +0 -1
  146. package/readmes/runner-AI.md +0 -917
  147. package/readmes/runner-durable-workflows.md +0 -2247
  148. package/readmes/runner-full-guide.md +0 -6010
  149. package/readmes/runner-remote-lanes.md +0 -910
@@ -25,7 +25,7 @@ exports.extractTaskIdsFromDependencies = extractTaskIdsFromDependencies;
25
25
  exports.extractErrorIdsFromDependencies = extractErrorIdsFromDependencies;
26
26
  const runner_1 = require("@bluelibs/runner");
27
27
  const lane_resources_1 = require("../../utils/lane-resources");
28
- const zod_1 = require("../../utils/zod");
28
+ const schemaFormat_1 = require("../../utils/schemaFormat");
29
29
  const path_1 = require("../../utils/path");
30
30
  const introspector_tools_1 = require("./introspector.tools");
31
31
  function normalizeTags(tags) {
@@ -66,22 +66,169 @@ function findById(collection, id) {
66
66
  Object.values(collection).find((x) => (0, introspector_tools_1.readId)(x) === id));
67
67
  return undefined;
68
68
  }
69
+ const taskMiddlewareScopeMarker = ".middleware.task.";
70
+ const resourceMiddlewareScopeMarker = ".middleware.resource.";
71
+ function getMiddlewareDuplicateKey(id) {
72
+ const taskScopeIndex = id.lastIndexOf(taskMiddlewareScopeMarker);
73
+ if (taskScopeIndex >= 0) {
74
+ return id.slice(taskScopeIndex + taskMiddlewareScopeMarker.length);
75
+ }
76
+ const resourceScopeIndex = id.lastIndexOf(resourceMiddlewareScopeMarker);
77
+ if (resourceScopeIndex >= 0) {
78
+ return id.slice(resourceScopeIndex + resourceMiddlewareScopeMarker.length);
79
+ }
80
+ return id;
81
+ }
82
+ function getTaskOwnerResourceChain(store, taskId) {
83
+ const chain = [];
84
+ const visited = new Set();
85
+ let currentOwnerId = store.getOwnerResourceId(taskId);
86
+ while (currentOwnerId && !visited.has(currentOwnerId)) {
87
+ visited.add(currentOwnerId);
88
+ chain.push(currentOwnerId);
89
+ currentOwnerId = store.getOwnerResourceId(currentOwnerId);
90
+ }
91
+ return chain;
92
+ }
93
+ function normalizeIdentityRequirementSummary(value) {
94
+ if (!value || typeof value !== "object")
95
+ return null;
96
+ const config = value;
97
+ return {
98
+ tenant: config.tenant ?? true,
99
+ user: config.user === true,
100
+ roles: Array.isArray(config.roles)
101
+ ? config.roles.map((role) => String(role))
102
+ : [],
103
+ };
104
+ }
105
+ function normalizeIdentityRequirementSummaries(value) {
106
+ const entries = Array.isArray(value)
107
+ ? value
108
+ : value && typeof value === "object"
109
+ ? [value]
110
+ : [];
111
+ return entries
112
+ .map((entry) => normalizeIdentityRequirementSummary(entry))
113
+ .filter((entry) => Boolean(entry));
114
+ }
115
+ function normalizeIdentityScopeSummary(value) {
116
+ if (!value || typeof value !== "object")
117
+ return null;
118
+ const config = value;
119
+ return {
120
+ tenant: config.tenant ?? true,
121
+ user: config.user === true,
122
+ required: config.required ?? true,
123
+ };
124
+ }
125
+ function getSubtreePolicies(resource) {
126
+ const rawSubtree = resource?.subtree;
127
+ if (!rawSubtree || typeof rawSubtree !== "object")
128
+ return [];
129
+ return Array.isArray(rawSubtree)
130
+ ? rawSubtree.filter((policy) => Boolean(policy) && typeof policy === "object")
131
+ : [rawSubtree];
132
+ }
133
+ function readSubtreeMiddlewareEntryId(entry) {
134
+ if (typeof entry === "string")
135
+ return entry;
136
+ if (!entry || typeof entry !== "object")
137
+ return null;
138
+ if ("use" in entry) {
139
+ return readSubtreeMiddlewareEntryId(entry.use ?? null);
140
+ }
141
+ const id = (0, introspector_tools_1.readId)(entry);
142
+ return id ? id : null;
143
+ }
144
+ function resolveTaskSubtreeMiddlewareEntry(entry, task) {
145
+ if (typeof entry === "string") {
146
+ return entry;
147
+ }
148
+ if (!entry || typeof entry !== "object") {
149
+ return null;
150
+ }
151
+ if ("use" in entry) {
152
+ const conditionalEntry = entry;
153
+ if (typeof conditionalEntry.when === "function") {
154
+ try {
155
+ if (!conditionalEntry.when(task)) {
156
+ return null;
157
+ }
158
+ }
159
+ catch {
160
+ return null;
161
+ }
162
+ }
163
+ return readSubtreeMiddlewareEntryId(conditionalEntry.use ?? null);
164
+ }
165
+ return readSubtreeMiddlewareEntryId(entry);
166
+ }
167
+ function collectSubtreeTaskMiddlewareOwnerIds(store, task) {
168
+ const ownerIds = new Map();
169
+ const chainRootToNearest = [
170
+ ...getTaskOwnerResourceChain(store, task.id),
171
+ ].reverse();
172
+ for (const ownerResourceId of chainRootToNearest) {
173
+ const ownerResource = store.resources.get(ownerResourceId)?.resource;
174
+ if (!ownerResource)
175
+ continue;
176
+ for (const policy of getSubtreePolicies(ownerResource)) {
177
+ const taskMiddlewares = Array.isArray(policy.tasks?.middleware)
178
+ ? policy.tasks.middleware
179
+ : [];
180
+ for (const entry of taskMiddlewares) {
181
+ const middlewareId = resolveTaskSubtreeMiddlewareEntry(entry, task);
182
+ if (!middlewareId)
183
+ continue;
184
+ const duplicateKey = getMiddlewareDuplicateKey(middlewareId);
185
+ if (!ownerIds.has(duplicateKey)) {
186
+ ownerIds.set(duplicateKey, ownerResourceId);
187
+ }
188
+ }
189
+ }
190
+ }
191
+ return ownerIds;
192
+ }
193
+ function hasMiddlewareConfig(middleware) {
194
+ return (Boolean(middleware?.[runner_1.definitions.symbolMiddlewareConfigured]) ||
195
+ middleware?.config !== undefined);
196
+ }
197
+ function buildEffectiveTaskMiddlewareUsages(store, task) {
198
+ const resolver = store.getMiddlewareManager()?.middlewareResolver;
199
+ const effectiveMiddlewares = resolver
200
+ ? resolver.getApplicableTaskMiddlewares(task)
201
+ : task.middleware;
202
+ const subtreeOwnersByKey = collectSubtreeTaskMiddlewareOwnerIds(store, task);
203
+ return effectiveMiddlewares.map((middleware) => {
204
+ const duplicateKey = getMiddlewareDuplicateKey(String(middleware.id));
205
+ const subtreeOwnerId = subtreeOwnersByKey.get(duplicateKey) ?? null;
206
+ return {
207
+ id: String(middleware.id),
208
+ config: hasMiddlewareConfig(middleware)
209
+ ? (0, introspector_tools_1.stringifyIfObject)(middleware.config)
210
+ : null,
211
+ origin: subtreeOwnerId ? "subtree" : "local",
212
+ subtreeOwnerId,
213
+ };
214
+ });
215
+ }
69
216
  // Mapping helpers
70
- function mapStoreTaskToTaskModel(task, taskStoreElement) {
217
+ function mapStoreTaskToTaskModel(task, store, taskStoreElement) {
71
218
  const depsObj = normalizeDependencies(task?.dependencies);
72
219
  const eventIdsFromDeps = extractEventIdsFromDependencies(depsObj);
73
220
  const resourceIdsFromDeps = extractResourceIdsFromDependencies(depsObj);
74
221
  const taskIdsFromDeps = extractTaskIdsFromDependencies(depsObj);
75
222
  const errorIdsFromDeps = extractErrorIdsFromDependencies(depsObj);
76
223
  const tagIdsFromDeps = extractTagIdsFromDependencies(depsObj);
77
- const middlewareDetailed = (task.middleware || []).map((m) => ({
78
- id: String(m.id),
79
- // In some @bluelibs/runner versions the configured flag may be missing; fall back to presence of config
80
- config: (m && m[runner_1.definitions.symbolMiddlewareConfigured]) ||
81
- m?.config !== undefined
82
- ? (0, introspector_tools_1.stringifyIfObject)(m.config)
83
- : null,
84
- }));
224
+ const middlewareDetailed = store
225
+ ? buildEffectiveTaskMiddlewareUsages(store, task)
226
+ : (task.middleware || []).map((m) => ({
227
+ id: String(m.id),
228
+ config: hasMiddlewareConfig(m) ? (0, introspector_tools_1.stringifyIfObject)(m.config) : null,
229
+ origin: "local",
230
+ subtreeOwnerId: null,
231
+ }));
85
232
  const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(task?.tags);
86
233
  const interceptorOwnerIds = Array.from(new Set(taskStoreElement?.interceptors
87
234
  ?.map((record) => record.ownerResourceId)
@@ -101,7 +248,7 @@ function mapStoreTaskToTaskModel(task, taskStoreElement) {
101
248
  ...errorIdsFromDeps,
102
249
  ...tagIdsFromDeps,
103
250
  ],
104
- middleware: task.middleware.map((m) => m.id.toString()),
251
+ middleware: middlewareDetailed.map((m) => m.id),
105
252
  middlewareDetailed,
106
253
  registeredBy: null,
107
254
  kind: "TASK",
@@ -109,8 +256,8 @@ function mapStoreTaskToTaskModel(task, taskStoreElement) {
109
256
  visibilityReason: null,
110
257
  // Emits any events present in its dependencies
111
258
  emits: eventIdsFromDeps,
112
- inputSchema: (0, zod_1.formatSchemaIfZod)(task.inputSchema),
113
- resultSchema: (0, zod_1.formatSchemaIfZod)(task.resultSchema),
259
+ inputSchema: (0, schemaFormat_1.formatSchemaIfZod)(task.inputSchema),
260
+ resultSchema: (0, schemaFormat_1.formatSchemaIfZod)(task.resultSchema),
114
261
  rpcLane: extractRpcLaneSummary(tagsDetailed),
115
262
  interceptorCount: taskStoreElement?.interceptors?.length ?? 0,
116
263
  hasInterceptors: (taskStoreElement?.interceptors?.length ?? 0) > 0,
@@ -120,7 +267,7 @@ function mapStoreTaskToTaskModel(task, taskStoreElement) {
120
267
  function mapStoreTaskToHookModel(_task) {
121
268
  throw new Error("deprecated");
122
269
  }
123
- function mapStoreHookToHookModel(hkStoreElement) {
270
+ function mapStoreHookToHookModel(hkStoreElement, store) {
124
271
  const hk = hkStoreElement.hook;
125
272
  const depsObj = normalizeDependencies(hk?.dependencies);
126
273
  const eventIdsFromDeps = extractEventIdsFromDependencies(depsObj);
@@ -129,9 +276,7 @@ function mapStoreHookToHookModel(hkStoreElement) {
129
276
  const errorIdsFromDeps = extractErrorIdsFromDependencies(depsObj);
130
277
  const tagIdsFromDeps = extractTagIdsFromDependencies(depsObj);
131
278
  const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(hk.tags);
132
- const eventIds = Array.isArray(hk.on)
133
- ? hk.on.map((e) => String(e.id))
134
- : [String(hk.on?.id ?? "*")];
279
+ const eventIds = resolveHookEventIds(hk, store);
135
280
  return (0, introspector_tools_1.stampElementKind)({
136
281
  id: String(hk?.id),
137
282
  meta: buildMetaWithNormalizedTags(hk?.meta, hk),
@@ -220,7 +365,7 @@ function mapStoreResourceToResourceModel(resource, resourceConfig) {
220
365
  hasHealthCheck,
221
366
  context: (0, introspector_tools_1.stringifyIfObject)(resource.context),
222
367
  registeredBy: null,
223
- configSchema: (0, zod_1.formatSchemaIfZod)(resource.configSchema),
368
+ configSchema: (0, schemaFormat_1.formatSchemaIfZod)(resource.configSchema),
224
369
  isPrivate: false,
225
370
  visibilityReason: null,
226
371
  }, "RESOURCE");
@@ -238,25 +383,22 @@ function normalizeResourceConfig(config) {
238
383
  function buildEvents(store) {
239
384
  const eventsCollection = Array.from(store.events.values()).map((e) => e.event);
240
385
  const allEventIds = eventsCollection.map((e) => e.id.toString());
241
- const hooks = Array.from(store.hooks.values()).map((h) => h.hook);
386
+ const hookEntries = Array.from(store.hooks.values());
387
+ const hookTargetEventIdsByHookId = new Map();
388
+ const eventLaneByEventId = buildEventLaneSummaryByEventId(store);
389
+ for (const hookEntry of hookEntries) {
390
+ hookTargetEventIdsByHookId.set(hookEntry.hook.id, resolveHookEventIds(hookEntry.hook, store));
391
+ }
242
392
  return allEventIds.map((eventId) => {
243
393
  const e = findById(eventsCollection, eventId);
244
394
  const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(e.tags);
245
- // Keep wildcard hooks in listenedToBy per design, but match specific listeners robustly
246
- const hooksListeningToEvent = hooks
247
- .filter((h) => {
248
- const on = h?.on;
249
- if (on === "*")
395
+ const hooksListeningToEvent = hookEntries
396
+ .filter(({ hook }) => {
397
+ if (hook.on === "*")
250
398
  return true;
251
- if (typeof on === "string")
252
- return on === eventId;
253
- if (on && typeof on === "object" && !Array.isArray(on))
254
- return String(on.id) === eventId;
255
- if (Array.isArray(on))
256
- return on.some((v) => typeof v === "string" ? v === eventId : String(v?.id) === eventId);
257
- return false;
399
+ return (hookTargetEventIdsByHookId.get(hook.id)?.includes(eventId) ?? false);
258
400
  })
259
- .map((h) => h.id);
401
+ .map(({ hook }) => hook.id);
260
402
  return (0, introspector_tools_1.stampElementKind)({
261
403
  id: eventId,
262
404
  meta: buildMetaWithNormalizedTags(e?.meta ?? null, e),
@@ -264,17 +406,175 @@ function buildEvents(store) {
264
406
  tagsDetailed,
265
407
  transactional: Boolean(e?.transactional),
266
408
  parallel: Boolean(e?.parallel),
267
- eventLane: extractEventLaneSummary(tagsDetailed),
409
+ eventLane: eventLaneByEventId.get(eventId) ?? null,
268
410
  rpcLane: extractRpcLaneSummary(tagsDetailed),
269
411
  filePath: (0, path_1.sanitizePath)((e && e[runner_1.definitions.symbolFilePath]) ?? e?.filePath ?? null),
270
412
  listenedToBy: hooksListeningToEvent,
271
413
  registeredBy: null,
272
- payloadSchema: (0, zod_1.formatSchemaIfZod)(e.payloadSchema),
414
+ payloadSchema: (0, schemaFormat_1.formatSchemaIfZod)(e.payloadSchema),
273
415
  isPrivate: false,
274
416
  visibilityReason: null,
275
417
  }, "EVENT");
276
418
  });
277
419
  }
420
+ function resolveHookEventIds(hook, store) {
421
+ if (hook.on === "*") {
422
+ return ["*"];
423
+ }
424
+ if (store && hook.on) {
425
+ return store.resolveHookTargets(hook).map((entry) => entry.event.id);
426
+ }
427
+ if (Array.isArray(hook.on)) {
428
+ return hook.on.map((entry) => typeof entry === "string" ? entry : String(entry?.id));
429
+ }
430
+ return [String(hook.on?.id ?? "*")];
431
+ }
432
+ function buildEventLaneSummaryByEventId(store) {
433
+ const laneByEventId = new Map();
434
+ const buildLaneApplyTargetKey = (target) => {
435
+ if (typeof target === "string") {
436
+ return `id:${target}`;
437
+ }
438
+ const targetId = (0, lane_resources_1.extractLaneId)(target);
439
+ if (targetId) {
440
+ return `id:${targetId}`;
441
+ }
442
+ const serializedTarget = (0, introspector_tools_1.stringifyIfObject)(target);
443
+ if (serializedTarget) {
444
+ return `json:${serializedTarget}`;
445
+ }
446
+ return `raw:${String(target)}`;
447
+ };
448
+ const mergeLaneApplyTo = (existingApplyTo, incomingApplyTo) => {
449
+ if (incomingApplyTo === undefined) {
450
+ return existingApplyTo;
451
+ }
452
+ if (existingApplyTo === undefined) {
453
+ return incomingApplyTo;
454
+ }
455
+ if (Array.isArray(existingApplyTo) && Array.isArray(incomingApplyTo)) {
456
+ const mergedTargets = new Map();
457
+ for (const target of [...existingApplyTo, ...incomingApplyTo]) {
458
+ mergedTargets.set(buildLaneApplyTargetKey(target), target);
459
+ }
460
+ return Array.from(mergedTargets.values());
461
+ }
462
+ return incomingApplyTo;
463
+ };
464
+ const mergeTopologyLaneEntry = (existingEntry, incomingEntry) => {
465
+ if (!existingEntry) {
466
+ return incomingEntry;
467
+ }
468
+ return {
469
+ id: incomingEntry.id,
470
+ applyTo: mergeLaneApplyTo(existingEntry.applyTo, incomingEntry.applyTo),
471
+ orderingKey: incomingEntry.orderingKey ?? existingEntry.orderingKey,
472
+ metadata: incomingEntry.metadata ?? existingEntry.metadata,
473
+ };
474
+ };
475
+ const upsertTopologyLaneEntry = (entry) => {
476
+ topologyLanesById.set(entry.id, mergeTopologyLaneEntry(topologyLanesById.get(entry.id), entry));
477
+ };
478
+ const topologyLanesById = new Map();
479
+ for (const resourceEntry of store.resources.values()) {
480
+ const resource = resourceEntry.resource;
481
+ const normalizedTags = normalizeTags(resource?.tags).ids;
482
+ if (!(0, lane_resources_1.isEventLanesResource)({
483
+ id: String(resource.id),
484
+ tags: normalizedTags,
485
+ })) {
486
+ continue;
487
+ }
488
+ const topology = resourceEntry
489
+ .config?.topology;
490
+ if (Array.isArray(topology?.bindings)) {
491
+ for (const binding of topology.bindings) {
492
+ const laneId = (0, lane_resources_1.extractLaneId)(binding?.lane);
493
+ if (!laneId || !binding?.lane)
494
+ continue;
495
+ upsertTopologyLaneEntry({
496
+ id: laneId,
497
+ applyTo: normalizeEventLaneApplyTo(binding.lane.applyTo),
498
+ orderingKey: typeof binding.lane.orderingKey === "string"
499
+ ? binding.lane.orderingKey
500
+ : null,
501
+ metadata: (0, introspector_tools_1.stringifyIfObject)(binding.lane.metadata),
502
+ });
503
+ }
504
+ }
505
+ if (topology?.profiles && typeof topology.profiles === "object") {
506
+ for (const profile of Object.values(topology.profiles)) {
507
+ if (!Array.isArray(profile?.consume))
508
+ continue;
509
+ for (const entry of profile.consume) {
510
+ const laneId = (0, lane_resources_1.extractLaneId)(entry?.lane);
511
+ if (!laneId || !entry?.lane)
512
+ continue;
513
+ upsertTopologyLaneEntry({
514
+ id: laneId,
515
+ applyTo: normalizeEventLaneApplyTo(entry.lane.applyTo),
516
+ orderingKey: typeof entry.lane.orderingKey === "string"
517
+ ? entry.lane.orderingKey
518
+ : null,
519
+ metadata: (0, introspector_tools_1.stringifyIfObject)(entry.lane.metadata),
520
+ });
521
+ }
522
+ }
523
+ }
524
+ }
525
+ const registeredEvents = Array.from(store.events.values()).map((eventEntry) => eventEntry.event);
526
+ for (const lane of topologyLanesById.values()) {
527
+ if (typeof lane.applyTo === "function") {
528
+ for (const event of registeredEvents) {
529
+ if (laneByEventId.has(event.id))
530
+ continue;
531
+ let matchesEvent = false;
532
+ try {
533
+ matchesEvent = lane.applyTo(event);
534
+ }
535
+ catch {
536
+ matchesEvent = false;
537
+ }
538
+ if (!matchesEvent)
539
+ continue;
540
+ laneByEventId.set(event.id, {
541
+ laneId: lane.id,
542
+ orderingKey: lane.orderingKey,
543
+ metadata: lane.metadata,
544
+ });
545
+ }
546
+ continue;
547
+ }
548
+ if (!Array.isArray(lane.applyTo)) {
549
+ continue;
550
+ }
551
+ for (const target of lane.applyTo) {
552
+ const targetId = typeof target === "string"
553
+ ? target
554
+ : store.findIdByDefinition(target) ?? (0, lane_resources_1.extractLaneId)(target);
555
+ if (!targetId)
556
+ continue;
557
+ const event = store.events.get(targetId)?.event;
558
+ if (!event || laneByEventId.has(event.id))
559
+ continue;
560
+ laneByEventId.set(event.id, {
561
+ laneId: lane.id,
562
+ orderingKey: lane.orderingKey,
563
+ metadata: lane.metadata,
564
+ });
565
+ }
566
+ }
567
+ return laneByEventId;
568
+ }
569
+ function normalizeEventLaneApplyTo(applyTo) {
570
+ if (Array.isArray(applyTo)) {
571
+ return applyTo;
572
+ }
573
+ if (typeof applyTo === "function") {
574
+ return applyTo;
575
+ }
576
+ return undefined;
577
+ }
278
578
  function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind) {
279
579
  const matchesMiddlewareId = (candidateIds, middlewareId) => (candidateIds ?? []).some((candidateId) => candidateId === middlewareId ||
280
580
  candidateId.endsWith(`.${middlewareId}`) ||
@@ -318,7 +618,7 @@ function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind)
318
618
  usedByResources,
319
619
  overriddenBy: mw?.overriddenBy ?? null,
320
620
  registeredBy: null,
321
- configSchema: (0, zod_1.formatSchemaIfZod)(mw.configSchema),
621
+ configSchema: (0, schemaFormat_1.formatSchemaIfZod)(mw.configSchema),
322
622
  type: kind,
323
623
  isPrivate: false,
324
624
  visibilityReason: null,
@@ -332,6 +632,20 @@ function buildResourceMiddlewares(middlewaresCollection, tasks, resources) {
332
632
  return buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, "resource");
333
633
  }
334
634
  function attachRegisteredBy(resources, tasks, hooks, middlewares, events) {
635
+ const matchesRegisteredElement = (candidateId, referenceId) => candidateId === referenceId ||
636
+ candidateId.endsWith(`.${referenceId}`) ||
637
+ referenceId.endsWith(`.${candidateId}`);
638
+ const resolveRegisteredElement = (map, referenceId) => {
639
+ const direct = map.get(referenceId);
640
+ if (direct)
641
+ return direct;
642
+ for (const element of map.values()) {
643
+ if (matchesRegisteredElement(element.id, referenceId)) {
644
+ return element;
645
+ }
646
+ }
647
+ return null;
648
+ };
335
649
  const taskMap = (0, introspector_tools_1.buildIdMap)(tasks);
336
650
  const hookMap = (0, introspector_tools_1.buildIdMap)(hooks);
337
651
  const resourceMap = (0, introspector_tools_1.buildIdMap)(resources);
@@ -339,16 +653,30 @@ function attachRegisteredBy(resources, tasks, hooks, middlewares, events) {
339
653
  const eventMap = (0, introspector_tools_1.buildIdMap)(events);
340
654
  for (const r of resources) {
341
655
  for (const id of r.registers ?? []) {
342
- if (taskMap.has(id))
343
- taskMap.get(id).registeredBy = r.id;
344
- else if (hookMap.has(id))
345
- hookMap.get(id).registeredBy = r.id;
346
- else if (resourceMap.has(id))
347
- resourceMap.get(id).registeredBy = r.id;
348
- else if (middlewareMap.has(id))
349
- middlewareMap.get(id).registeredBy = r.id;
350
- else if (eventMap.has(id))
351
- eventMap.get(id).registeredBy = r.id;
656
+ const task = resolveRegisteredElement(taskMap, id);
657
+ if (task) {
658
+ task.registeredBy = r.id;
659
+ continue;
660
+ }
661
+ const hook = resolveRegisteredElement(hookMap, id);
662
+ if (hook) {
663
+ hook.registeredBy = r.id;
664
+ continue;
665
+ }
666
+ const resource = resolveRegisteredElement(resourceMap, id);
667
+ if (resource) {
668
+ resource.registeredBy = r.id;
669
+ continue;
670
+ }
671
+ const middleware = resolveRegisteredElement(middlewareMap, id);
672
+ if (middleware) {
673
+ middleware.registeredBy = r.id;
674
+ continue;
675
+ }
676
+ const event = resolveRegisteredElement(eventMap, id);
677
+ if (event) {
678
+ event.registeredBy = r.id;
679
+ }
352
680
  }
353
681
  }
354
682
  }
@@ -592,8 +920,8 @@ function toSubtreeMiddlewareIds(entries) {
592
920
  if (!Array.isArray(entries))
593
921
  return [];
594
922
  const ids = entries
595
- .map((entry) => (typeof entry === "string" ? entry : (0, introspector_tools_1.readId)(entry)))
596
- .filter(Boolean);
923
+ .map((entry) => typeof entry === "string" ? entry : readSubtreeMiddlewareEntryId(entry))
924
+ .filter((id) => Boolean(id));
597
925
  return Array.from(new Set(ids));
598
926
  }
599
927
  function appendSubtreeMiddlewareIds(target, entries) {
@@ -602,16 +930,12 @@ function appendSubtreeMiddlewareIds(target, entries) {
602
930
  }
603
931
  }
604
932
  function normalizeSubtreePolicy(resource) {
605
- const rawSubtree = resource?.subtree;
606
- if (!rawSubtree || typeof rawSubtree !== "object")
607
- return null;
608
- const subtreePolicies = Array.isArray(rawSubtree)
609
- ? rawSubtree.filter((policy) => Boolean(policy) && typeof policy === "object")
610
- : [rawSubtree];
933
+ const subtreePolicies = getSubtreePolicies(resource);
611
934
  if (subtreePolicies.length === 0)
612
935
  return null;
613
936
  const taskMiddlewareIds = new Set();
614
937
  const resourceMiddlewareIds = new Set();
938
+ const taskIdentityRequirements = [];
615
939
  let tasksValidatorCount = 0;
616
940
  let resourcesValidatorCount = 0;
617
941
  let hooksValidatorCount = 0;
@@ -619,11 +943,16 @@ function normalizeSubtreePolicy(resource) {
619
943
  let resourceMiddlewareValidatorCount = 0;
620
944
  let eventsValidatorCount = 0;
621
945
  let tagsValidatorCount = 0;
946
+ let subtreeMiddlewareIdentityScope = null;
622
947
  for (const subtree of subtreePolicies) {
623
948
  if (subtree.tasks) {
624
949
  appendSubtreeMiddlewareIds(taskMiddlewareIds, subtree.tasks.middleware);
950
+ taskIdentityRequirements.push(...normalizeIdentityRequirementSummaries(subtree.tasks.identity));
625
951
  tasksValidatorCount += normalizeSubtreeValidatorCount(subtree.tasks.validate);
626
952
  }
953
+ if (subtree.middleware && "identityScope" in subtree.middleware) {
954
+ subtreeMiddlewareIdentityScope = normalizeIdentityScopeSummary(subtree.middleware.identityScope);
955
+ }
627
956
  if (subtree.resources) {
628
957
  appendSubtreeMiddlewareIds(resourceMiddlewareIds, subtree.resources.middleware);
629
958
  resourcesValidatorCount += normalizeSubtreeValidatorCount(subtree.resources.validate);
@@ -644,10 +973,20 @@ function normalizeSubtreePolicy(resource) {
644
973
  tagsValidatorCount += normalizeSubtreeValidatorCount(subtree.tags.validate);
645
974
  }
646
975
  }
647
- const tasks = taskMiddlewareIds.size > 0 || tasksValidatorCount > 0
976
+ const tasks = taskMiddlewareIds.size > 0 ||
977
+ tasksValidatorCount > 0 ||
978
+ taskIdentityRequirements.length > 0
648
979
  ? {
649
980
  middleware: Array.from(taskMiddlewareIds),
650
981
  validatorCount: tasksValidatorCount,
982
+ ...(taskIdentityRequirements.length > 0
983
+ ? { identity: taskIdentityRequirements }
984
+ : {}),
985
+ }
986
+ : null;
987
+ const middleware = subtreeMiddlewareIdentityScope !== null
988
+ ? {
989
+ identityScope: subtreeMiddlewareIdentityScope,
651
990
  }
652
991
  : null;
653
992
  const resources = resourceMiddlewareIds.size > 0 || resourcesValidatorCount > 0
@@ -682,6 +1021,7 @@ function normalizeSubtreePolicy(resource) {
682
1021
  }
683
1022
  : null;
684
1023
  if (!tasks &&
1024
+ !middleware &&
685
1025
  !resources &&
686
1026
  !hooks &&
687
1027
  !taskMiddleware &&
@@ -692,6 +1032,7 @@ function normalizeSubtreePolicy(resource) {
692
1032
  }
693
1033
  return {
694
1034
  tasks,
1035
+ middleware,
695
1036
  resources,
696
1037
  hooks,
697
1038
  taskMiddleware,
@@ -710,20 +1051,6 @@ function parseTagConfigJson(config) {
710
1051
  return null;
711
1052
  }
712
1053
  }
713
- function extractEventLaneSummary(tagsDetailed) {
714
- const laneTag = tagsDetailed.find((tag) => matchesTagId(tag.id, lane_resources_1.EVENT_LANE_TAG_ID));
715
- if (!laneTag)
716
- return null;
717
- const parsed = parseTagConfigJson(laneTag.config);
718
- const laneId = (0, lane_resources_1.extractLaneId)(parsed?.lane);
719
- if (!laneId)
720
- return null;
721
- return {
722
- laneId,
723
- orderingKey: parsed?.orderingKey != null ? String(parsed.orderingKey) : null,
724
- metadata: parsed?.metadata != null ? (0, introspector_tools_1.stringifyIfObject)(parsed.metadata) : null,
725
- };
726
- }
727
1054
  function extractRpcLaneSummary(tagsDetailed) {
728
1055
  const laneTag = tagsDetailed.find((tag) => matchesTagId(tag.id, lane_resources_1.RPC_LANE_TAG_ID));
729
1056
  if (!laneTag)