@bluelibs/runner-dev 6.1.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 (343) hide show
  1. package/README.md +143 -14
  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 +21 -5
  5. package/dist/cli/generators/scaffold/templates/README.md.js.map +1 -1
  6. package/dist/cli/generators/scaffold/templates/index.d.ts +2 -3
  7. package/dist/cli/generators/scaffold/templates/index.js +5 -7
  8. package/dist/cli/generators/scaffold/templates/index.js.map +1 -1
  9. package/dist/cli/generators/scaffold/templates/package.json.d.ts +11 -8
  10. package/dist/cli/generators/scaffold/templates/package.json.js +11 -8
  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.test.ts.js +3 -1
  19. package/dist/cli/generators/scaffold/templates/src/main.test.ts.js.map +1 -1
  20. package/dist/cli/generators/scaffold/templates/src/main.ts.js +3 -10
  21. package/dist/cli/generators/scaffold/templates/src/main.ts.js.map +1 -1
  22. package/dist/cli/generators/scaffold/templates/tsconfig.json.d.ts +2 -0
  23. package/dist/cli/generators/scaffold/templates/tsconfig.json.js +2 -0
  24. package/dist/cli/generators/scaffold/templates/tsconfig.json.js.map +1 -1
  25. package/dist/cli/generators/scaffold.js +2 -3
  26. package/dist/cli/generators/scaffold.js.map +1 -1
  27. package/dist/cli/init.js +1 -2
  28. package/dist/cli/init.js.map +1 -1
  29. package/dist/docs/packageDocs.d.ts +16 -0
  30. package/dist/docs/packageDocs.js +107 -0
  31. package/dist/docs/packageDocs.js.map +1 -0
  32. package/dist/exportDocs.d.ts +10 -0
  33. package/dist/exportDocs.js +98 -0
  34. package/dist/exportDocs.js.map +1 -0
  35. package/dist/generated/resolvers-types.d.ts +127 -42
  36. package/dist/index.d.ts +5 -2
  37. package/dist/index.js +3 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/mcp/env.d.ts +5 -0
  40. package/dist/mcp/env.js +30 -1
  41. package/dist/mcp/env.js.map +1 -1
  42. package/dist/mcp/help.d.ts +8 -1
  43. package/dist/mcp/help.js +30 -4
  44. package/dist/mcp/help.js.map +1 -1
  45. package/dist/mcp/http.js +10 -0
  46. package/dist/mcp/http.js.map +1 -1
  47. package/dist/mcp/projectOverview.js +13 -4
  48. package/dist/mcp/projectOverview.js.map +1 -1
  49. package/dist/mcp/snapshot.d.ts +22 -0
  50. package/dist/mcp/snapshot.js +347 -0
  51. package/dist/mcp/snapshot.js.map +1 -0
  52. package/dist/mcp/tools/graphql.mutation.js +4 -1
  53. package/dist/mcp/tools/graphql.mutation.js.map +1 -1
  54. package/dist/mcp/tools/graphql.ping.js +1 -1
  55. package/dist/mcp/tools/graphql.ping.js.map +1 -1
  56. package/dist/mcp/tools/graphql.query.js +1 -1
  57. package/dist/mcp/tools/graphql.query.js.map +1 -1
  58. package/dist/mcp/tools/help.read.js +7 -5
  59. package/dist/mcp/tools/help.read.js.map +1 -1
  60. package/dist/mcp/tools/help.runner.js +3 -1
  61. package/dist/mcp/tools/help.runner.js.map +1 -1
  62. package/dist/mcp/tools/help.runnerDev.js +4 -4
  63. package/dist/mcp/tools/help.runnerDev.js.map +1 -1
  64. package/dist/mcp.js +4 -9
  65. package/dist/mcp.js.map +1 -1
  66. package/dist/resources/cli.config.resource.js +1 -1
  67. package/dist/resources/cli.config.resource.js.map +1 -1
  68. package/dist/resources/coverage.resource.js +1 -1
  69. package/dist/resources/coverage.resource.js.map +1 -1
  70. package/dist/resources/dev.resource.d.ts +1 -1
  71. package/dist/resources/dev.resource.js +1 -1
  72. package/dist/resources/dev.resource.js.map +1 -1
  73. package/dist/resources/docs.generator.resource.js +1 -1
  74. package/dist/resources/docs.generator.resource.js.map +1 -1
  75. package/dist/resources/docsPayload.d.ts +33 -0
  76. package/dist/resources/docsPayload.js +171 -0
  77. package/dist/resources/docsPayload.js.map +1 -0
  78. package/dist/resources/docsUiAssets.d.ts +27 -0
  79. package/dist/resources/docsUiAssets.js +150 -0
  80. package/dist/resources/docsUiAssets.js.map +1 -0
  81. package/dist/resources/graphql-accumulator.resource.d.ts +1 -0
  82. package/dist/resources/graphql-accumulator.resource.js +31 -27
  83. package/dist/resources/graphql-accumulator.resource.js.map +1 -1
  84. package/dist/resources/graphql.cli.resource.js +1 -1
  85. package/dist/resources/graphql.cli.resource.js.map +1 -1
  86. package/dist/resources/graphql.query.cli.task.d.ts +2 -4
  87. package/dist/resources/graphql.query.cli.task.js +1 -1
  88. package/dist/resources/graphql.query.cli.task.js.map +1 -1
  89. package/dist/resources/graphql.query.task.d.ts +2 -4
  90. package/dist/resources/graphql.query.task.js +1 -1
  91. package/dist/resources/graphql.query.task.js.map +1 -1
  92. package/dist/resources/http.tag.js +1 -1
  93. package/dist/resources/http.tag.js.map +1 -1
  94. package/dist/resources/introspector.cli.resource.js +1 -1
  95. package/dist/resources/introspector.cli.resource.js.map +1 -1
  96. package/dist/resources/introspector.resource.js +1 -1
  97. package/dist/resources/introspector.resource.js.map +1 -1
  98. package/dist/resources/live.resource.js +4 -4
  99. package/dist/resources/live.resource.js.map +1 -1
  100. package/dist/resources/models/Introspector.d.ts +16 -4
  101. package/dist/resources/models/Introspector.js +68 -39
  102. package/dist/resources/models/Introspector.js.map +1 -1
  103. package/dist/resources/models/durable.tools.js +3 -1
  104. package/dist/resources/models/durable.tools.js.map +1 -1
  105. package/dist/resources/models/initializeFromStore.js +5 -5
  106. package/dist/resources/models/initializeFromStore.js.map +1 -1
  107. package/dist/resources/models/initializeFromStore.utils.d.ts +2 -2
  108. package/dist/resources/models/initializeFromStore.utils.js +424 -78
  109. package/dist/resources/models/initializeFromStore.utils.js.map +1 -1
  110. package/dist/resources/models/introspector.tools.js +103 -19
  111. package/dist/resources/models/introspector.tools.js.map +1 -1
  112. package/dist/resources/routeHandlers/createDocsServeHandler.js +13 -37
  113. package/dist/resources/routeHandlers/createDocsServeHandler.js.map +1 -1
  114. package/dist/resources/routeHandlers/getDocsData.d.ts +1 -6
  115. package/dist/resources/routeHandlers/getDocsData.js +10 -168
  116. package/dist/resources/routeHandlers/getDocsData.js.map +1 -1
  117. package/dist/resources/routeHandlers/registerHttpRoutes.hook.js +1 -1
  118. package/dist/resources/routeHandlers/registerHttpRoutes.hook.js.map +1 -1
  119. package/dist/resources/server.resource.js +1 -2
  120. package/dist/resources/server.resource.js.map +1 -1
  121. package/dist/resources/swap.cli.resource.js +1 -1
  122. package/dist/resources/swap.cli.resource.js.map +1 -1
  123. package/dist/resources/swap.resource.js +1 -1
  124. package/dist/resources/swap.resource.js.map +1 -1
  125. package/dist/resources/telemetry.resource.js +27 -6
  126. package/dist/resources/telemetry.resource.js.map +1 -1
  127. package/dist/resources/ui.static.js +4 -9
  128. package/dist/resources/ui.static.js.map +1 -1
  129. package/dist/runtime/symbolMetadata.d.ts +1 -0
  130. package/dist/{architect/core/interfaces.js → runtime/symbolMetadata.js} +1 -1
  131. package/dist/runtime/symbolMetadata.js.map +1 -0
  132. package/dist/schema/model.d.ts +18 -0
  133. package/dist/schema/model.js +14 -0
  134. package/dist/schema/model.js.map +1 -1
  135. package/dist/schema/query.js +6 -4
  136. package/dist/schema/query.js.map +1 -1
  137. package/dist/schema/types/AllType.js +2 -21
  138. package/dist/schema/types/AllType.js.map +1 -1
  139. package/dist/schema/types/AsyncContextType.js +21 -17
  140. package/dist/schema/types/AsyncContextType.js.map +1 -1
  141. package/dist/schema/types/ErrorType.js +1 -3
  142. package/dist/schema/types/ErrorType.js.map +1 -1
  143. package/dist/schema/types/EventType.js +6 -19
  144. package/dist/schema/types/EventType.js.map +1 -1
  145. package/dist/schema/types/HookType.js +4 -16
  146. package/dist/schema/types/HookType.js.map +1 -1
  147. package/dist/schema/types/ResourceType.js +50 -23
  148. package/dist/schema/types/ResourceType.js.map +1 -1
  149. package/dist/schema/types/TaskLikeCommon.js +2 -2
  150. package/dist/schema/types/TaskLikeCommon.js.map +1 -1
  151. package/dist/schema/types/TaskType.js +6 -19
  152. package/dist/schema/types/TaskType.js.map +1 -1
  153. package/dist/schema/types/middleware/UsageTypes.d.ts +1 -0
  154. package/dist/schema/types/middleware/UsageTypes.js +16 -5
  155. package/dist/schema/types/middleware/UsageTypes.js.map +1 -1
  156. package/dist/schema/types/middleware/common.js +2 -2
  157. package/dist/schema/types/middleware/common.js.map +1 -1
  158. package/dist/ui/.vite/manifest.json +2 -2
  159. package/dist/ui/assets/docs-Beb_xRuE.js +304 -0
  160. package/dist/ui/assets/docs-Beb_xRuE.js.map +1 -0
  161. package/dist/ui/assets/docs-lid1amCk.css +1 -0
  162. package/dist/ui/docs/favicon.ico +0 -0
  163. package/dist/utils/lane-resources.d.ts +69 -0
  164. package/dist/utils/lane-resources.js +154 -1
  165. package/dist/utils/lane-resources.js.map +1 -1
  166. package/dist/utils/runner-namespace.d.ts +1 -0
  167. package/dist/utils/runner-namespace.js +9 -0
  168. package/dist/utils/runner-namespace.js.map +1 -0
  169. package/dist/utils/schemaFormat.d.ts +6 -0
  170. package/dist/utils/schemaFormat.js +244 -0
  171. package/dist/utils/schemaFormat.js.map +1 -0
  172. package/dist/utils/system-namespace.d.ts +1 -0
  173. package/dist/utils/system-namespace.js +9 -0
  174. package/dist/utils/system-namespace.js.map +1 -0
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +1 -1
  177. package/package.json +29 -11
  178. package/readmes/API_REFERENCE.md +364 -0
  179. package/readmes/COMPACT_GUIDE.md +254 -0
  180. package/skills/core/SKILL.md +27 -0
  181. package/skills/core/references/readmes/API_REFERENCE.md +364 -0
  182. package/skills/core/references/readmes/COMPACT_GUIDE.md +254 -0
  183. package/AI.md +0 -622
  184. package/dist/app/tasks/create-user.task.d.ts +0 -5
  185. package/dist/app/tasks/create-user.task.js +0 -20
  186. package/dist/app/tasks/create-user.task.js.map +0 -1
  187. package/dist/app/tasks/index.d.ts +0 -1
  188. package/dist/app/tasks/index.js +0 -18
  189. package/dist/app/tasks/index.js.map +0 -1
  190. package/dist/architect/core/errors.d.ts +0 -39
  191. package/dist/architect/core/errors.js +0 -143
  192. package/dist/architect/core/errors.js.map +0 -1
  193. package/dist/architect/core/index.d.ts +0 -3
  194. package/dist/architect/core/index.js +0 -21
  195. package/dist/architect/core/index.js.map +0 -1
  196. package/dist/architect/core/interfaces.d.ts +0 -158
  197. package/dist/architect/core/interfaces.js.map +0 -1
  198. package/dist/architect/core/types.d.ts +0 -544
  199. package/dist/architect/core/types.js +0 -49
  200. package/dist/architect/core/types.js.map +0 -1
  201. package/dist/architect/execution/executor.d.ts +0 -23
  202. package/dist/architect/execution/executor.js +0 -476
  203. package/dist/architect/execution/executor.js.map +0 -1
  204. package/dist/architect/execution/index.d.ts +0 -1
  205. package/dist/architect/execution/index.js +0 -19
  206. package/dist/architect/execution/index.js.map +0 -1
  207. package/dist/architect/executor.d.ts +0 -7
  208. package/dist/architect/executor.js +0 -150
  209. package/dist/architect/executor.js.map +0 -1
  210. package/dist/architect/index.d.ts +0 -45
  211. package/dist/architect/index.js +0 -76
  212. package/dist/architect/index.js.map +0 -1
  213. package/dist/architect/llmClient.d.ts +0 -10
  214. package/dist/architect/llmClient.js +0 -33
  215. package/dist/architect/llmClient.js.map +0 -1
  216. package/dist/architect/models/base.d.ts +0 -16
  217. package/dist/architect/models/base.js +0 -68
  218. package/dist/architect/models/base.js.map +0 -1
  219. package/dist/architect/models/factory.d.ts +0 -16
  220. package/dist/architect/models/factory.js +0 -73
  221. package/dist/architect/models/factory.js.map +0 -1
  222. package/dist/architect/models/index.d.ts +0 -3
  223. package/dist/architect/models/index.js +0 -21
  224. package/dist/architect/models/index.js.map +0 -1
  225. package/dist/architect/models/openai.d.ts +0 -7
  226. package/dist/architect/models/openai.js +0 -71
  227. package/dist/architect/models/openai.js.map +0 -1
  228. package/dist/architect/planner.d.ts +0 -9
  229. package/dist/architect/planner.js +0 -42
  230. package/dist/architect/planner.js.map +0 -1
  231. package/dist/architect/planning/index.d.ts +0 -4
  232. package/dist/architect/planning/index.js +0 -22
  233. package/dist/architect/planning/index.js.map +0 -1
  234. package/dist/architect/planning/optimizer.d.ts +0 -14
  235. package/dist/architect/planning/optimizer.js +0 -275
  236. package/dist/architect/planning/optimizer.js.map +0 -1
  237. package/dist/architect/planning/planner.d.ts +0 -15
  238. package/dist/architect/planning/planner.js +0 -124
  239. package/dist/architect/planning/planner.js.map +0 -1
  240. package/dist/architect/planning/prompts.d.ts +0 -6
  241. package/dist/architect/planning/prompts.js +0 -111
  242. package/dist/architect/planning/prompts.js.map +0 -1
  243. package/dist/architect/planning/validator.d.ts +0 -16
  244. package/dist/architect/planning/validator.js +0 -331
  245. package/dist/architect/planning/validator.js.map +0 -1
  246. package/dist/architect/prompt.d.ts +0 -1
  247. package/dist/architect/prompt.js +0 -13
  248. package/dist/architect/prompt.js.map +0 -1
  249. package/dist/architect/types.d.ts +0 -4
  250. package/dist/architect/types.js +0 -24
  251. package/dist/architect/types.js.map +0 -1
  252. package/dist/cli/generators/scaffold/templates/jest.config.cjs.d.ts +0 -1
  253. package/dist/cli/generators/scaffold/templates/jest.config.cjs.js +0 -24
  254. package/dist/cli/generators/scaffold/templates/jest.config.cjs.js.map +0 -1
  255. package/dist/cli/generators/scaffold/templates/tsconfig.jest.json.d.ts +0 -11
  256. package/dist/cli/generators/scaffold/templates/tsconfig.jest.json.js +0 -17
  257. package/dist/cli/generators/scaffold/templates/tsconfig.jest.json.js.map +0 -1
  258. package/dist/client/documentation.d.ts +0 -8
  259. package/dist/client/documentation.js +0 -144
  260. package/dist/client/documentation.js.map +0 -1
  261. package/dist/components/Documentation/Documentation.d.ts +0 -8
  262. package/dist/components/Documentation/Documentation.js +0 -283
  263. package/dist/components/Documentation/Documentation.js.map +0 -1
  264. package/dist/components/Documentation/components/DiagnosticsPanel.d.ts +0 -7
  265. package/dist/components/Documentation/components/DiagnosticsPanel.js +0 -189
  266. package/dist/components/Documentation/components/DiagnosticsPanel.js.map +0 -1
  267. package/dist/components/Documentation/components/EventCard.d.ts +0 -8
  268. package/dist/components/Documentation/components/EventCard.js +0 -290
  269. package/dist/components/Documentation/components/EventCard.js.map +0 -1
  270. package/dist/components/Documentation/components/HookCard.d.ts +0 -8
  271. package/dist/components/Documentation/components/HookCard.js +0 -282
  272. package/dist/components/Documentation/components/HookCard.js.map +0 -1
  273. package/dist/components/Documentation/components/MiddlewareCard.d.ts +0 -8
  274. package/dist/components/Documentation/components/MiddlewareCard.js +0 -314
  275. package/dist/components/Documentation/components/MiddlewareCard.js.map +0 -1
  276. package/dist/components/Documentation/components/ResourceCard.d.ts +0 -8
  277. package/dist/components/Documentation/components/ResourceCard.js +0 -228
  278. package/dist/components/Documentation/components/ResourceCard.js.map +0 -1
  279. package/dist/components/Documentation/components/Sidebar.d.ts +0 -13
  280. package/dist/components/Documentation/components/Sidebar.js +0 -165
  281. package/dist/components/Documentation/components/Sidebar.js.map +0 -1
  282. package/dist/components/Documentation/components/TagCard.d.ts +0 -7
  283. package/dist/components/Documentation/components/TagCard.js +0 -75
  284. package/dist/components/Documentation/components/TagCard.js.map +0 -1
  285. package/dist/components/Documentation/components/TaskCard.d.ts +0 -8
  286. package/dist/components/Documentation/components/TaskCard.js +0 -196
  287. package/dist/components/Documentation/components/TaskCard.js.map +0 -1
  288. package/dist/components/Documentation/index.d.ts +0 -2
  289. package/dist/components/Documentation/index.js +0 -6
  290. package/dist/components/Documentation/index.js.map +0 -1
  291. package/dist/components/Documentation/utils/formatting.d.ts +0 -8
  292. package/dist/components/Documentation/utils/formatting.js +0 -84
  293. package/dist/components/Documentation/utils/formatting.js.map +0 -1
  294. package/dist/components/ExampleComponent.d.ts +0 -10
  295. package/dist/components/ExampleComponent.js +0 -89
  296. package/dist/components/ExampleComponent.js.map +0 -1
  297. package/dist/mcp/z3.d.ts +0 -1
  298. package/dist/mcp/z3.js +0 -9
  299. package/dist/mcp/z3.js.map +0 -1
  300. package/dist/project-writer/AIModel.d.ts +0 -29
  301. package/dist/project-writer/AIModel.js +0 -48
  302. package/dist/project-writer/AIModel.js.map +0 -1
  303. package/dist/resources/docs.route.d.ts +0 -23
  304. package/dist/resources/docs.route.js +0 -73
  305. package/dist/resources/docs.route.js.map +0 -1
  306. package/dist/resources/durable.workflow.tag.d.ts +0 -2
  307. package/dist/resources/durable.workflow.tag.js +0 -28
  308. package/dist/resources/durable.workflow.tag.js.map +0 -1
  309. package/dist/resources/getFileContents.task.d.ts +0 -17
  310. package/dist/resources/getFileContents.task.js +0 -44
  311. package/dist/resources/getFileContents.task.js.map +0 -1
  312. package/dist/resources/introspector.tools.d.ts +0 -47
  313. package/dist/resources/introspector.tools.js +0 -505
  314. package/dist/resources/introspector.tools.js.map +0 -1
  315. package/dist/resources/models/extractTunnelInfo.d.ts +0 -8
  316. package/dist/resources/models/extractTunnelInfo.js +0 -85
  317. package/dist/resources/models/extractTunnelInfo.js.map +0 -1
  318. package/dist/resources/models/tunnel.tools.d.ts +0 -3
  319. package/dist/resources/models/tunnel.tools.js +0 -35
  320. package/dist/resources/models/tunnel.tools.js.map +0 -1
  321. package/dist/runner-compat.d.ts +0 -85
  322. package/dist/runner-compat.js +0 -178
  323. package/dist/runner-compat.js.map +0 -1
  324. package/dist/runner-node-compat.d.ts +0 -2
  325. package/dist/runner-node-compat.js +0 -28
  326. package/dist/runner-node-compat.js.map +0 -1
  327. package/dist/schema/types/TunnelInfoType.d.ts +0 -5
  328. package/dist/schema/types/TunnelInfoType.js +0 -86
  329. package/dist/schema/types/TunnelInfoType.js.map +0 -1
  330. package/dist/tasks/create-user.d.ts +0 -5
  331. package/dist/tasks/create-user.js +0 -20
  332. package/dist/tasks/create-user.js.map +0 -1
  333. package/dist/tasks/index.d.ts +0 -1
  334. package/dist/tasks/index.js +0 -18
  335. package/dist/tasks/index.js.map +0 -1
  336. package/dist/ui/assets/docs-CHvYnckk.js +0 -302
  337. package/dist/ui/assets/docs-CHvYnckk.js.map +0 -1
  338. package/dist/ui/assets/docs-CipvKUxZ.css +0 -1
  339. package/dist/ui-test/index.html +0 -1
  340. package/readmes/runner-AI.md +0 -740
  341. package/readmes/runner-durable-workflows.md +0 -2247
  342. package/readmes/runner-full-guide.md +0 -5869
  343. package/readmes/runner-remote-lanes.md +0 -909
@@ -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),
@@ -160,10 +305,17 @@ function mapStoreHookToHookModel(hkStoreElement) {
160
305
  }, "HOOK");
161
306
  }
162
307
  function mapStoreResourceToResourceModel(resource, resourceConfig) {
163
- // TODO: We might be able to improve typesafety somehow here.
164
- const register = typeof resource.register === "function"
165
- ? resource.register()
166
- : resource.register;
308
+ const introspectorMode = "dev";
309
+ const register = Array.isArray(resource.register)
310
+ ? resource.register
311
+ : typeof resource.register === "function"
312
+ ? resource.register(resourceConfig, introspectorMode)
313
+ : [];
314
+ const overrides = Array.isArray(resource.overrides)
315
+ ? resource.overrides
316
+ : typeof resource.overrides === "function"
317
+ ? resource.overrides(resourceConfig, introspectorMode)
318
+ : [];
167
319
  const depsObj = normalizeDependencies(resource?.dependencies);
168
320
  const eventIdsFromDeps = extractEventIdsFromDependencies(depsObj);
169
321
  const resourceIdsFromDeps = extractResourceIdsFromDependencies(depsObj);
@@ -204,9 +356,7 @@ function mapStoreResourceToResourceModel(resource, resourceConfig) {
204
356
  config,
205
357
  middleware: resource.middleware.map((m) => m.id.toString()),
206
358
  middlewareDetailed,
207
- overrides: resource.overrides
208
- .filter((o) => !!o)
209
- .map((o) => o.id.toString()),
359
+ overrides: overrides.flatMap((override) => override ? [override.id.toString()] : []),
210
360
  registers: register.map((r) => r.id.toString()),
211
361
  isolation,
212
362
  subtree,
@@ -215,7 +365,7 @@ function mapStoreResourceToResourceModel(resource, resourceConfig) {
215
365
  hasHealthCheck,
216
366
  context: (0, introspector_tools_1.stringifyIfObject)(resource.context),
217
367
  registeredBy: null,
218
- configSchema: (0, zod_1.formatSchemaIfZod)(resource.configSchema),
368
+ configSchema: (0, schemaFormat_1.formatSchemaIfZod)(resource.configSchema),
219
369
  isPrivate: false,
220
370
  visibilityReason: null,
221
371
  }, "RESOURCE");
@@ -233,25 +383,22 @@ function normalizeResourceConfig(config) {
233
383
  function buildEvents(store) {
234
384
  const eventsCollection = Array.from(store.events.values()).map((e) => e.event);
235
385
  const allEventIds = eventsCollection.map((e) => e.id.toString());
236
- 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
+ }
237
392
  return allEventIds.map((eventId) => {
238
393
  const e = findById(eventsCollection, eventId);
239
394
  const { ids: tagIds, detailed: tagsDetailed } = normalizeTags(e.tags);
240
- // Keep wildcard hooks in listenedToBy per design, but match specific listeners robustly
241
- const hooksListeningToEvent = hooks
242
- .filter((h) => {
243
- const on = h?.on;
244
- if (on === "*")
395
+ const hooksListeningToEvent = hookEntries
396
+ .filter(({ hook }) => {
397
+ if (hook.on === "*")
245
398
  return true;
246
- if (typeof on === "string")
247
- return on === eventId;
248
- if (on && typeof on === "object" && !Array.isArray(on))
249
- return String(on.id) === eventId;
250
- if (Array.isArray(on))
251
- return on.some((v) => typeof v === "string" ? v === eventId : String(v?.id) === eventId);
252
- return false;
399
+ return (hookTargetEventIdsByHookId.get(hook.id)?.includes(eventId) ?? false);
253
400
  })
254
- .map((h) => h.id);
401
+ .map(({ hook }) => hook.id);
255
402
  return (0, introspector_tools_1.stampElementKind)({
256
403
  id: eventId,
257
404
  meta: buildMetaWithNormalizedTags(e?.meta ?? null, e),
@@ -259,18 +406,179 @@ function buildEvents(store) {
259
406
  tagsDetailed,
260
407
  transactional: Boolean(e?.transactional),
261
408
  parallel: Boolean(e?.parallel),
262
- eventLane: extractEventLaneSummary(tagsDetailed),
409
+ eventLane: eventLaneByEventId.get(eventId) ?? null,
263
410
  rpcLane: extractRpcLaneSummary(tagsDetailed),
264
411
  filePath: (0, path_1.sanitizePath)((e && e[runner_1.definitions.symbolFilePath]) ?? e?.filePath ?? null),
265
412
  listenedToBy: hooksListeningToEvent,
266
413
  registeredBy: null,
267
- payloadSchema: (0, zod_1.formatSchemaIfZod)(e.payloadSchema),
414
+ payloadSchema: (0, schemaFormat_1.formatSchemaIfZod)(e.payloadSchema),
268
415
  isPrivate: false,
269
416
  visibilityReason: null,
270
417
  }, "EVENT");
271
418
  });
272
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
+ }
273
578
  function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind) {
579
+ const matchesMiddlewareId = (candidateIds, middlewareId) => (candidateIds ?? []).some((candidateId) => candidateId === middlewareId ||
580
+ candidateId.endsWith(`.${middlewareId}`) ||
581
+ middlewareId.endsWith(`.${candidateId}`));
274
582
  return (0, introspector_tools_1.toArray)(middlewaresCollection).map((entry) => {
275
583
  const mw = entry?.middleware ?? entry;
276
584
  const id = (0, introspector_tools_1.readId)(mw);
@@ -284,12 +592,12 @@ function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind)
284
592
  const autoApply = normalizeMiddlewareAutoApply(mw);
285
593
  const usedByTasks = kind === "task"
286
594
  ? tasks
287
- .filter((t) => (t.middleware || []).includes(id))
595
+ .filter((t) => matchesMiddlewareId(t.middleware, id))
288
596
  .map((t) => t.id)
289
597
  : [];
290
598
  const usedByResources = kind === "resource"
291
599
  ? resources
292
- .filter((r) => (r.middleware || []).includes(id))
600
+ .filter((r) => matchesMiddlewareId(r.middleware, id))
293
601
  .map((r) => r.id)
294
602
  : [];
295
603
  return (0, introspector_tools_1.stampElementKind)({
@@ -310,7 +618,7 @@ function buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, kind)
310
618
  usedByResources,
311
619
  overriddenBy: mw?.overriddenBy ?? null,
312
620
  registeredBy: null,
313
- configSchema: (0, zod_1.formatSchemaIfZod)(mw.configSchema),
621
+ configSchema: (0, schemaFormat_1.formatSchemaIfZod)(mw.configSchema),
314
622
  type: kind,
315
623
  isPrivate: false,
316
624
  visibilityReason: null,
@@ -324,6 +632,20 @@ function buildResourceMiddlewares(middlewaresCollection, tasks, resources) {
324
632
  return buildMiddlewaresGeneric(middlewaresCollection, tasks, resources, "resource");
325
633
  }
326
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
+ };
327
649
  const taskMap = (0, introspector_tools_1.buildIdMap)(tasks);
328
650
  const hookMap = (0, introspector_tools_1.buildIdMap)(hooks);
329
651
  const resourceMap = (0, introspector_tools_1.buildIdMap)(resources);
@@ -331,16 +653,30 @@ function attachRegisteredBy(resources, tasks, hooks, middlewares, events) {
331
653
  const eventMap = (0, introspector_tools_1.buildIdMap)(events);
332
654
  for (const r of resources) {
333
655
  for (const id of r.registers ?? []) {
334
- if (taskMap.has(id))
335
- taskMap.get(id).registeredBy = r.id;
336
- else if (hookMap.has(id))
337
- hookMap.get(id).registeredBy = r.id;
338
- else if (resourceMap.has(id))
339
- resourceMap.get(id).registeredBy = r.id;
340
- else if (middlewareMap.has(id))
341
- middlewareMap.get(id).registeredBy = r.id;
342
- else if (eventMap.has(id))
343
- 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
+ }
344
680
  }
345
681
  }
346
682
  }
@@ -420,10 +756,21 @@ function extractAsyncContextIdsFromDependencies(deps) {
420
756
  exports.REQUIRE_CONTEXT_MIDDLEWARE_ID = "runner.middleware.task.requireContext";
421
757
  const REQUIRE_CONTEXT_MIDDLEWARE_IDS = [
422
758
  exports.REQUIRE_CONTEXT_MIDDLEWARE_ID,
759
+ "requireContext",
423
760
  // Legacy ids used by older Runner versions
424
761
  "globals.middleware.task.requireContext",
425
762
  "globals.middleware.requireContext",
426
763
  ];
764
+ function matchesTagId(candidateId, expectedId) {
765
+ const candidateLocalId = candidateId.split(".").pop();
766
+ const expectedLocalId = expectedId.split(".").pop();
767
+ return (candidateId === expectedId ||
768
+ candidateId.endsWith(`.${expectedId}`) ||
769
+ expectedId.endsWith(`.${candidateId}`) ||
770
+ (candidateLocalId !== undefined &&
771
+ expectedLocalId !== undefined &&
772
+ candidateLocalId === expectedLocalId));
773
+ }
427
774
  function extractRequiredContextIds(middleware) {
428
775
  const result = [];
429
776
  for (const m of middleware || []) {
@@ -573,8 +920,8 @@ function toSubtreeMiddlewareIds(entries) {
573
920
  if (!Array.isArray(entries))
574
921
  return [];
575
922
  const ids = entries
576
- .map((entry) => (typeof entry === "string" ? entry : (0, introspector_tools_1.readId)(entry)))
577
- .filter(Boolean);
923
+ .map((entry) => typeof entry === "string" ? entry : readSubtreeMiddlewareEntryId(entry))
924
+ .filter((id) => Boolean(id));
578
925
  return Array.from(new Set(ids));
579
926
  }
580
927
  function appendSubtreeMiddlewareIds(target, entries) {
@@ -583,16 +930,12 @@ function appendSubtreeMiddlewareIds(target, entries) {
583
930
  }
584
931
  }
585
932
  function normalizeSubtreePolicy(resource) {
586
- const rawSubtree = resource?.subtree;
587
- if (!rawSubtree || typeof rawSubtree !== "object")
588
- return null;
589
- const subtreePolicies = Array.isArray(rawSubtree)
590
- ? rawSubtree.filter((policy) => Boolean(policy) && typeof policy === "object")
591
- : [rawSubtree];
933
+ const subtreePolicies = getSubtreePolicies(resource);
592
934
  if (subtreePolicies.length === 0)
593
935
  return null;
594
936
  const taskMiddlewareIds = new Set();
595
937
  const resourceMiddlewareIds = new Set();
938
+ const taskIdentityRequirements = [];
596
939
  let tasksValidatorCount = 0;
597
940
  let resourcesValidatorCount = 0;
598
941
  let hooksValidatorCount = 0;
@@ -600,11 +943,16 @@ function normalizeSubtreePolicy(resource) {
600
943
  let resourceMiddlewareValidatorCount = 0;
601
944
  let eventsValidatorCount = 0;
602
945
  let tagsValidatorCount = 0;
946
+ let subtreeMiddlewareIdentityScope = null;
603
947
  for (const subtree of subtreePolicies) {
604
948
  if (subtree.tasks) {
605
949
  appendSubtreeMiddlewareIds(taskMiddlewareIds, subtree.tasks.middleware);
950
+ taskIdentityRequirements.push(...normalizeIdentityRequirementSummaries(subtree.tasks.identity));
606
951
  tasksValidatorCount += normalizeSubtreeValidatorCount(subtree.tasks.validate);
607
952
  }
953
+ if (subtree.middleware && "identityScope" in subtree.middleware) {
954
+ subtreeMiddlewareIdentityScope = normalizeIdentityScopeSummary(subtree.middleware.identityScope);
955
+ }
608
956
  if (subtree.resources) {
609
957
  appendSubtreeMiddlewareIds(resourceMiddlewareIds, subtree.resources.middleware);
610
958
  resourcesValidatorCount += normalizeSubtreeValidatorCount(subtree.resources.validate);
@@ -625,10 +973,20 @@ function normalizeSubtreePolicy(resource) {
625
973
  tagsValidatorCount += normalizeSubtreeValidatorCount(subtree.tags.validate);
626
974
  }
627
975
  }
628
- const tasks = taskMiddlewareIds.size > 0 || tasksValidatorCount > 0
976
+ const tasks = taskMiddlewareIds.size > 0 ||
977
+ tasksValidatorCount > 0 ||
978
+ taskIdentityRequirements.length > 0
629
979
  ? {
630
980
  middleware: Array.from(taskMiddlewareIds),
631
981
  validatorCount: tasksValidatorCount,
982
+ ...(taskIdentityRequirements.length > 0
983
+ ? { identity: taskIdentityRequirements }
984
+ : {}),
985
+ }
986
+ : null;
987
+ const middleware = subtreeMiddlewareIdentityScope !== null
988
+ ? {
989
+ identityScope: subtreeMiddlewareIdentityScope,
632
990
  }
633
991
  : null;
634
992
  const resources = resourceMiddlewareIds.size > 0 || resourcesValidatorCount > 0
@@ -663,6 +1021,7 @@ function normalizeSubtreePolicy(resource) {
663
1021
  }
664
1022
  : null;
665
1023
  if (!tasks &&
1024
+ !middleware &&
666
1025
  !resources &&
667
1026
  !hooks &&
668
1027
  !taskMiddleware &&
@@ -673,6 +1032,7 @@ function normalizeSubtreePolicy(resource) {
673
1032
  }
674
1033
  return {
675
1034
  tasks,
1035
+ middleware,
676
1036
  resources,
677
1037
  hooks,
678
1038
  taskMiddleware,
@@ -691,22 +1051,8 @@ function parseTagConfigJson(config) {
691
1051
  return null;
692
1052
  }
693
1053
  }
694
- function extractEventLaneSummary(tagsDetailed) {
695
- const laneTag = tagsDetailed.find((tag) => tag.id === lane_resources_1.EVENT_LANE_TAG_ID);
696
- if (!laneTag)
697
- return null;
698
- const parsed = parseTagConfigJson(laneTag.config);
699
- const laneId = (0, lane_resources_1.extractLaneId)(parsed?.lane);
700
- if (!laneId)
701
- return null;
702
- return {
703
- laneId,
704
- orderingKey: parsed?.orderingKey != null ? String(parsed.orderingKey) : null,
705
- metadata: parsed?.metadata != null ? (0, introspector_tools_1.stringifyIfObject)(parsed.metadata) : null,
706
- };
707
- }
708
1054
  function extractRpcLaneSummary(tagsDetailed) {
709
- const laneTag = tagsDetailed.find((tag) => tag.id === lane_resources_1.RPC_LANE_TAG_ID);
1055
+ const laneTag = tagsDetailed.find((tag) => matchesTagId(tag.id, lane_resources_1.RPC_LANE_TAG_ID));
710
1056
  if (!laneTag)
711
1057
  return null;
712
1058
  const parsed = parseTagConfigJson(laneTag.config);