@opensip-cli/core 0.1.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 (604) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/config-resolution.test.d.ts +2 -0
  5. package/dist/__tests__/config-resolution.test.d.ts.map +1 -0
  6. package/dist/__tests__/config-resolution.test.js +94 -0
  7. package/dist/__tests__/config-resolution.test.js.map +1 -0
  8. package/dist/__tests__/public-api.test.d.ts +16 -0
  9. package/dist/__tests__/public-api.test.d.ts.map +1 -0
  10. package/dist/__tests__/public-api.test.js +209 -0
  11. package/dist/__tests__/public-api.test.js.map +1 -0
  12. package/dist/__tests__/signal-batch.test.d.ts +2 -0
  13. package/dist/__tests__/signal-batch.test.d.ts.map +1 -0
  14. package/dist/__tests__/signal-batch.test.js +39 -0
  15. package/dist/__tests__/signal-batch.test.js.map +1 -0
  16. package/dist/__tests__/signal-sink.test.d.ts +2 -0
  17. package/dist/__tests__/signal-sink.test.d.ts.map +1 -0
  18. package/dist/__tests__/signal-sink.test.js +25 -0
  19. package/dist/__tests__/signal-sink.test.js.map +1 -0
  20. package/dist/__tests__/strip-utils.test.d.ts +2 -0
  21. package/dist/__tests__/strip-utils.test.d.ts.map +1 -0
  22. package/dist/__tests__/strip-utils.test.js +397 -0
  23. package/dist/__tests__/strip-utils.test.js.map +1 -0
  24. package/dist/__tests__/text-tree.test.d.ts +2 -0
  25. package/dist/__tests__/text-tree.test.d.ts.map +1 -0
  26. package/dist/__tests__/text-tree.test.js +31 -0
  27. package/dist/__tests__/text-tree.test.js.map +1 -0
  28. package/dist/baseline/__tests__/fingerprint-strategy.test.d.ts +2 -0
  29. package/dist/baseline/__tests__/fingerprint-strategy.test.d.ts.map +1 -0
  30. package/dist/baseline/__tests__/fingerprint-strategy.test.js +69 -0
  31. package/dist/baseline/__tests__/fingerprint-strategy.test.js.map +1 -0
  32. package/dist/baseline/fingerprint-strategy.d.ts +70 -0
  33. package/dist/baseline/fingerprint-strategy.d.ts.map +1 -0
  34. package/dist/baseline/fingerprint-strategy.js +90 -0
  35. package/dist/baseline/fingerprint-strategy.js.map +1 -0
  36. package/dist/config-resolution.d.ts +27 -0
  37. package/dist/config-resolution.d.ts.map +1 -0
  38. package/dist/config-resolution.js +92 -0
  39. package/dist/config-resolution.js.map +1 -0
  40. package/dist/index.d.ts +81 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +165 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/languages/__tests__/content-filter-dispatch.test.d.ts +2 -0
  45. package/dist/languages/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
  46. package/dist/languages/__tests__/content-filter-dispatch.test.js +87 -0
  47. package/dist/languages/__tests__/content-filter-dispatch.test.js.map +1 -0
  48. package/dist/languages/__tests__/non-code-formats.test.d.ts +2 -0
  49. package/dist/languages/__tests__/non-code-formats.test.d.ts.map +1 -0
  50. package/dist/languages/__tests__/non-code-formats.test.js +31 -0
  51. package/dist/languages/__tests__/non-code-formats.test.js.map +1 -0
  52. package/dist/languages/__tests__/parse-cache.test.d.ts +2 -0
  53. package/dist/languages/__tests__/parse-cache.test.d.ts.map +1 -0
  54. package/dist/languages/__tests__/parse-cache.test.js +228 -0
  55. package/dist/languages/__tests__/parse-cache.test.js.map +1 -0
  56. package/dist/languages/__tests__/registry.test.d.ts +2 -0
  57. package/dist/languages/__tests__/registry.test.d.ts.map +1 -0
  58. package/dist/languages/__tests__/registry.test.js +193 -0
  59. package/dist/languages/__tests__/registry.test.js.map +1 -0
  60. package/dist/languages/__tests__/workspace-unit-contract.test.d.ts +2 -0
  61. package/dist/languages/__tests__/workspace-unit-contract.test.d.ts.map +1 -0
  62. package/dist/languages/__tests__/workspace-unit-contract.test.js +66 -0
  63. package/dist/languages/__tests__/workspace-unit-contract.test.js.map +1 -0
  64. package/dist/languages/adapter.d.ts +66 -0
  65. package/dist/languages/adapter.d.ts.map +1 -0
  66. package/dist/languages/adapter.js +2 -0
  67. package/dist/languages/adapter.js.map +1 -0
  68. package/dist/languages/content-filter-dispatch.d.ts +36 -0
  69. package/dist/languages/content-filter-dispatch.d.ts.map +1 -0
  70. package/dist/languages/content-filter-dispatch.js +75 -0
  71. package/dist/languages/content-filter-dispatch.js.map +1 -0
  72. package/dist/languages/generic-types.d.ts +22 -0
  73. package/dist/languages/generic-types.d.ts.map +1 -0
  74. package/dist/languages/generic-types.js +3 -0
  75. package/dist/languages/generic-types.js.map +1 -0
  76. package/dist/languages/index.d.ts +12 -0
  77. package/dist/languages/index.d.ts.map +1 -0
  78. package/dist/languages/index.js +7 -0
  79. package/dist/languages/index.js.map +1 -0
  80. package/dist/languages/non-code-formats.d.ts +37 -0
  81. package/dist/languages/non-code-formats.d.ts.map +1 -0
  82. package/dist/languages/non-code-formats.js +45 -0
  83. package/dist/languages/non-code-formats.js.map +1 -0
  84. package/dist/languages/parse-cache-class.d.ts +69 -0
  85. package/dist/languages/parse-cache-class.d.ts.map +1 -0
  86. package/dist/languages/parse-cache-class.js +135 -0
  87. package/dist/languages/parse-cache-class.js.map +1 -0
  88. package/dist/languages/parse-cache.d.ts +54 -0
  89. package/dist/languages/parse-cache.d.ts.map +1 -0
  90. package/dist/languages/parse-cache.js +88 -0
  91. package/dist/languages/parse-cache.js.map +1 -0
  92. package/dist/languages/registry.d.ts +35 -0
  93. package/dist/languages/registry.d.ts.map +1 -0
  94. package/dist/languages/registry.js +123 -0
  95. package/dist/languages/registry.js.map +1 -0
  96. package/dist/languages/strip-scanners.d.ts +170 -0
  97. package/dist/languages/strip-scanners.d.ts.map +1 -0
  98. package/dist/languages/strip-scanners.js +233 -0
  99. package/dist/languages/strip-scanners.js.map +1 -0
  100. package/dist/languages/strip-utils.d.ts +66 -0
  101. package/dist/languages/strip-utils.d.ts.map +1 -0
  102. package/dist/languages/strip-utils.js +88 -0
  103. package/dist/languages/strip-utils.js.map +1 -0
  104. package/dist/languages/text-tree.d.ts +44 -0
  105. package/dist/languages/text-tree.d.ts.map +1 -0
  106. package/dist/languages/text-tree.js +34 -0
  107. package/dist/languages/text-tree.js.map +1 -0
  108. package/dist/languages/workspace-unit.d.ts +18 -0
  109. package/dist/languages/workspace-unit.d.ts.map +1 -0
  110. package/dist/languages/workspace-unit.js +2 -0
  111. package/dist/languages/workspace-unit.js.map +1 -0
  112. package/dist/lib/__tests__/config-version.test.d.ts +12 -0
  113. package/dist/lib/__tests__/config-version.test.d.ts.map +1 -0
  114. package/dist/lib/__tests__/config-version.test.js +92 -0
  115. package/dist/lib/__tests__/config-version.test.js.map +1 -0
  116. package/dist/lib/__tests__/diagnostics-bus.test.d.ts +7 -0
  117. package/dist/lib/__tests__/diagnostics-bus.test.d.ts.map +1 -0
  118. package/dist/lib/__tests__/diagnostics-bus.test.js +44 -0
  119. package/dist/lib/__tests__/diagnostics-bus.test.js.map +1 -0
  120. package/dist/lib/__tests__/env-registry.test.d.ts +7 -0
  121. package/dist/lib/__tests__/env-registry.test.d.ts.map +1 -0
  122. package/dist/lib/__tests__/env-registry.test.js +82 -0
  123. package/dist/lib/__tests__/env-registry.test.js.map +1 -0
  124. package/dist/lib/__tests__/errors.test.d.ts +2 -0
  125. package/dist/lib/__tests__/errors.test.d.ts.map +1 -0
  126. package/dist/lib/__tests__/errors.test.js +218 -0
  127. package/dist/lib/__tests__/errors.test.js.map +1 -0
  128. package/dist/lib/__tests__/format.test.d.ts +2 -0
  129. package/dist/lib/__tests__/format.test.d.ts.map +1 -0
  130. package/dist/lib/__tests__/format.test.js +23 -0
  131. package/dist/lib/__tests__/format.test.js.map +1 -0
  132. package/dist/lib/__tests__/ids.test.d.ts +2 -0
  133. package/dist/lib/__tests__/ids.test.d.ts.map +1 -0
  134. package/dist/lib/__tests__/ids.test.js +80 -0
  135. package/dist/lib/__tests__/ids.test.js.map +1 -0
  136. package/dist/lib/__tests__/logger.test.d.ts +2 -0
  137. package/dist/lib/__tests__/logger.test.d.ts.map +1 -0
  138. package/dist/lib/__tests__/logger.test.js +284 -0
  139. package/dist/lib/__tests__/logger.test.js.map +1 -0
  140. package/dist/lib/__tests__/package-version.test.d.ts +2 -0
  141. package/dist/lib/__tests__/package-version.test.d.ts.map +1 -0
  142. package/dist/lib/__tests__/package-version.test.js +47 -0
  143. package/dist/lib/__tests__/package-version.test.js.map +1 -0
  144. package/dist/lib/__tests__/paths.test.d.ts +5 -0
  145. package/dist/lib/__tests__/paths.test.d.ts.map +1 -0
  146. package/dist/lib/__tests__/paths.test.js +59 -0
  147. package/dist/lib/__tests__/paths.test.js.map +1 -0
  148. package/dist/lib/__tests__/payload-version.test.d.ts +2 -0
  149. package/dist/lib/__tests__/payload-version.test.d.ts.map +1 -0
  150. package/dist/lib/__tests__/payload-version.test.js +35 -0
  151. package/dist/lib/__tests__/payload-version.test.js.map +1 -0
  152. package/dist/lib/__tests__/phantom-detect.test.d.ts +10 -0
  153. package/dist/lib/__tests__/phantom-detect.test.d.ts.map +1 -0
  154. package/dist/lib/__tests__/phantom-detect.test.js +84 -0
  155. package/dist/lib/__tests__/phantom-detect.test.js.map +1 -0
  156. package/dist/lib/__tests__/project-context.test.d.ts +10 -0
  157. package/dist/lib/__tests__/project-context.test.d.ts.map +1 -0
  158. package/dist/lib/__tests__/project-context.test.js +240 -0
  159. package/dist/lib/__tests__/project-context.test.js.map +1 -0
  160. package/dist/lib/__tests__/registry.test.d.ts +2 -0
  161. package/dist/lib/__tests__/registry.test.d.ts.map +1 -0
  162. package/dist/lib/__tests__/registry.test.js +333 -0
  163. package/dist/lib/__tests__/registry.test.js.map +1 -0
  164. package/dist/lib/__tests__/retry.test.d.ts +2 -0
  165. package/dist/lib/__tests__/retry.test.d.ts.map +1 -0
  166. package/dist/lib/__tests__/retry.test.js +71 -0
  167. package/dist/lib/__tests__/retry.test.js.map +1 -0
  168. package/dist/lib/__tests__/run-diagnostics.test.d.ts +9 -0
  169. package/dist/lib/__tests__/run-diagnostics.test.d.ts.map +1 -0
  170. package/dist/lib/__tests__/run-diagnostics.test.js +61 -0
  171. package/dist/lib/__tests__/run-diagnostics.test.js.map +1 -0
  172. package/dist/lib/__tests__/run-scope.test.d.ts +2 -0
  173. package/dist/lib/__tests__/run-scope.test.d.ts.map +1 -0
  174. package/dist/lib/__tests__/run-scope.test.js +202 -0
  175. package/dist/lib/__tests__/run-scope.test.js.map +1 -0
  176. package/dist/lib/__tests__/run-timer.test.d.ts +2 -0
  177. package/dist/lib/__tests__/run-timer.test.d.ts.map +1 -0
  178. package/dist/lib/__tests__/run-timer.test.js +152 -0
  179. package/dist/lib/__tests__/run-timer.test.js.map +1 -0
  180. package/dist/lib/__tests__/severity-policy.test.d.ts +6 -0
  181. package/dist/lib/__tests__/severity-policy.test.d.ts.map +1 -0
  182. package/dist/lib/__tests__/severity-policy.test.js +47 -0
  183. package/dist/lib/__tests__/severity-policy.test.js.map +1 -0
  184. package/dist/lib/__tests__/telemetry.test.d.ts +2 -0
  185. package/dist/lib/__tests__/telemetry.test.d.ts.map +1 -0
  186. package/dist/lib/__tests__/telemetry.test.js +212 -0
  187. package/dist/lib/__tests__/telemetry.test.js.map +1 -0
  188. package/dist/lib/__tests__/verdict-policy.test.d.ts +7 -0
  189. package/dist/lib/__tests__/verdict-policy.test.d.ts.map +1 -0
  190. package/dist/lib/__tests__/verdict-policy.test.js +91 -0
  191. package/dist/lib/__tests__/verdict-policy.test.js.map +1 -0
  192. package/dist/lib/__tests__/yaml.test.d.ts +6 -0
  193. package/dist/lib/__tests__/yaml.test.d.ts.map +1 -0
  194. package/dist/lib/__tests__/yaml.test.js +79 -0
  195. package/dist/lib/__tests__/yaml.test.js.map +1 -0
  196. package/dist/lib/config-version.d.ts +49 -0
  197. package/dist/lib/config-version.d.ts.map +1 -0
  198. package/dist/lib/config-version.js +56 -0
  199. package/dist/lib/config-version.js.map +1 -0
  200. package/dist/lib/diagnostics-bus.d.ts +48 -0
  201. package/dist/lib/diagnostics-bus.d.ts.map +1 -0
  202. package/dist/lib/diagnostics-bus.js +74 -0
  203. package/dist/lib/diagnostics-bus.js.map +1 -0
  204. package/dist/lib/env-registry.d.ts +108 -0
  205. package/dist/lib/env-registry.d.ts.map +1 -0
  206. package/dist/lib/env-registry.js +92 -0
  207. package/dist/lib/env-registry.js.map +1 -0
  208. package/dist/lib/errors.d.ts +132 -0
  209. package/dist/lib/errors.d.ts.map +1 -0
  210. package/dist/lib/errors.js +160 -0
  211. package/dist/lib/errors.js.map +1 -0
  212. package/dist/lib/execution/__tests__/execution.test.d.ts +7 -0
  213. package/dist/lib/execution/__tests__/execution.test.d.ts.map +1 -0
  214. package/dist/lib/execution/__tests__/execution.test.js +254 -0
  215. package/dist/lib/execution/__tests__/execution.test.js.map +1 -0
  216. package/dist/lib/execution/index.d.ts +15 -0
  217. package/dist/lib/execution/index.d.ts.map +1 -0
  218. package/dist/lib/execution/index.js +10 -0
  219. package/dist/lib/execution/index.js.map +1 -0
  220. package/dist/lib/execution/options.d.ts +32 -0
  221. package/dist/lib/execution/options.d.ts.map +1 -0
  222. package/dist/lib/execution/options.js +15 -0
  223. package/dist/lib/execution/options.js.map +1 -0
  224. package/dist/lib/execution/pipeline.d.ts +36 -0
  225. package/dist/lib/execution/pipeline.d.ts.map +1 -0
  226. package/dist/lib/execution/pipeline.js +38 -0
  227. package/dist/lib/execution/pipeline.js.map +1 -0
  228. package/dist/lib/execution/retry.d.ts +38 -0
  229. package/dist/lib/execution/retry.d.ts.map +1 -0
  230. package/dist/lib/execution/retry.js +56 -0
  231. package/dist/lib/execution/retry.js.map +1 -0
  232. package/dist/lib/execution/run-with-timeout.d.ts +46 -0
  233. package/dist/lib/execution/run-with-timeout.d.ts.map +1 -0
  234. package/dist/lib/execution/run-with-timeout.js +86 -0
  235. package/dist/lib/execution/run-with-timeout.js.map +1 -0
  236. package/dist/lib/execution/schedule.d.ts +62 -0
  237. package/dist/lib/execution/schedule.d.ts.map +1 -0
  238. package/dist/lib/execution/schedule.js +130 -0
  239. package/dist/lib/execution/schedule.js.map +1 -0
  240. package/dist/lib/format.d.ts +17 -0
  241. package/dist/lib/format.d.ts.map +1 -0
  242. package/dist/lib/format.js +26 -0
  243. package/dist/lib/format.js.map +1 -0
  244. package/dist/lib/ids.d.ts +13 -0
  245. package/dist/lib/ids.d.ts.map +1 -0
  246. package/dist/lib/ids.js +48 -0
  247. package/dist/lib/ids.js.map +1 -0
  248. package/dist/lib/logger.d.ts +166 -0
  249. package/dist/lib/logger.d.ts.map +1 -0
  250. package/dist/lib/logger.js +283 -0
  251. package/dist/lib/logger.js.map +1 -0
  252. package/dist/lib/package-version.d.ts +17 -0
  253. package/dist/lib/package-version.d.ts.map +1 -0
  254. package/dist/lib/package-version.js +52 -0
  255. package/dist/lib/package-version.js.map +1 -0
  256. package/dist/lib/paths.d.ts +139 -0
  257. package/dist/lib/paths.d.ts.map +1 -0
  258. package/dist/lib/paths.js +105 -0
  259. package/dist/lib/paths.js.map +1 -0
  260. package/dist/lib/payload-version.d.ts +15 -0
  261. package/dist/lib/payload-version.d.ts.map +1 -0
  262. package/dist/lib/payload-version.js +24 -0
  263. package/dist/lib/payload-version.js.map +1 -0
  264. package/dist/lib/phantom-detect.d.ts +21 -0
  265. package/dist/lib/phantom-detect.d.ts.map +1 -0
  266. package/dist/lib/phantom-detect.js +76 -0
  267. package/dist/lib/phantom-detect.js.map +1 -0
  268. package/dist/lib/project-context.d.ts +66 -0
  269. package/dist/lib/project-context.d.ts.map +1 -0
  270. package/dist/lib/project-context.js +112 -0
  271. package/dist/lib/project-context.js.map +1 -0
  272. package/dist/lib/recipe-id.d.ts +13 -0
  273. package/dist/lib/recipe-id.d.ts.map +1 -0
  274. package/dist/lib/recipe-id.js +15 -0
  275. package/dist/lib/recipe-id.js.map +1 -0
  276. package/dist/lib/registry.d.ts +98 -0
  277. package/dist/lib/registry.d.ts.map +1 -0
  278. package/dist/lib/registry.js +152 -0
  279. package/dist/lib/registry.js.map +1 -0
  280. package/dist/lib/retry.d.ts +26 -0
  281. package/dist/lib/retry.d.ts.map +1 -0
  282. package/dist/lib/retry.js +48 -0
  283. package/dist/lib/retry.js.map +1 -0
  284. package/dist/lib/run-diagnostics.d.ts +64 -0
  285. package/dist/lib/run-diagnostics.d.ts.map +1 -0
  286. package/dist/lib/run-diagnostics.js +25 -0
  287. package/dist/lib/run-diagnostics.js.map +1 -0
  288. package/dist/lib/run-scope.d.ts +167 -0
  289. package/dist/lib/run-scope.d.ts.map +1 -0
  290. package/dist/lib/run-scope.js +176 -0
  291. package/dist/lib/run-scope.js.map +1 -0
  292. package/dist/lib/run-timer.d.ts +82 -0
  293. package/dist/lib/run-timer.d.ts.map +1 -0
  294. package/dist/lib/run-timer.js +79 -0
  295. package/dist/lib/run-timer.js.map +1 -0
  296. package/dist/lib/scope-types.d.ts +172 -0
  297. package/dist/lib/scope-types.d.ts.map +1 -0
  298. package/dist/lib/scope-types.js +27 -0
  299. package/dist/lib/scope-types.js.map +1 -0
  300. package/dist/lib/severity-policy.d.ts +38 -0
  301. package/dist/lib/severity-policy.d.ts.map +1 -0
  302. package/dist/lib/severity-policy.js +44 -0
  303. package/dist/lib/severity-policy.js.map +1 -0
  304. package/dist/lib/telemetry.d.ts +93 -0
  305. package/dist/lib/telemetry.d.ts.map +1 -0
  306. package/dist/lib/telemetry.js +144 -0
  307. package/dist/lib/telemetry.js.map +1 -0
  308. package/dist/lib/ui-context.d.ts +34 -0
  309. package/dist/lib/ui-context.d.ts.map +1 -0
  310. package/dist/lib/ui-context.js +16 -0
  311. package/dist/lib/ui-context.js.map +1 -0
  312. package/dist/lib/verdict-policy.d.ts +71 -0
  313. package/dist/lib/verdict-policy.d.ts.map +1 -0
  314. package/dist/lib/verdict-policy.js +82 -0
  315. package/dist/lib/verdict-policy.js.map +1 -0
  316. package/dist/lib/yaml.d.ts +74 -0
  317. package/dist/lib/yaml.d.ts.map +1 -0
  318. package/dist/lib/yaml.js +118 -0
  319. package/dist/lib/yaml.js.map +1 -0
  320. package/dist/plugins/__tests__/as-if-external.test.d.ts +18 -0
  321. package/dist/plugins/__tests__/as-if-external.test.d.ts.map +1 -0
  322. package/dist/plugins/__tests__/as-if-external.test.js +159 -0
  323. package/dist/plugins/__tests__/as-if-external.test.js.map +1 -0
  324. package/dist/plugins/__tests__/authored-tool-discovery.test.d.ts +8 -0
  325. package/dist/plugins/__tests__/authored-tool-discovery.test.d.ts.map +1 -0
  326. package/dist/plugins/__tests__/authored-tool-discovery.test.js +97 -0
  327. package/dist/plugins/__tests__/authored-tool-discovery.test.js.map +1 -0
  328. package/dist/plugins/__tests__/capability-discovery.test.d.ts +2 -0
  329. package/dist/plugins/__tests__/capability-discovery.test.d.ts.map +1 -0
  330. package/dist/plugins/__tests__/capability-discovery.test.js +349 -0
  331. package/dist/plugins/__tests__/capability-discovery.test.js.map +1 -0
  332. package/dist/plugins/__tests__/capability-from-manifest.test.d.ts +2 -0
  333. package/dist/plugins/__tests__/capability-from-manifest.test.d.ts.map +1 -0
  334. package/dist/plugins/__tests__/capability-from-manifest.test.js +172 -0
  335. package/dist/plugins/__tests__/capability-from-manifest.test.js.map +1 -0
  336. package/dist/plugins/__tests__/capability-loader.test.d.ts +2 -0
  337. package/dist/plugins/__tests__/capability-loader.test.d.ts.map +1 -0
  338. package/dist/plugins/__tests__/capability-loader.test.js +122 -0
  339. package/dist/plugins/__tests__/capability-loader.test.js.map +1 -0
  340. package/dist/plugins/__tests__/capability-registry.test.d.ts +2 -0
  341. package/dist/plugins/__tests__/capability-registry.test.d.ts.map +1 -0
  342. package/dist/plugins/__tests__/capability-registry.test.js +185 -0
  343. package/dist/plugins/__tests__/capability-registry.test.js.map +1 -0
  344. package/dist/plugins/__tests__/discover.test.d.ts +2 -0
  345. package/dist/plugins/__tests__/discover.test.d.ts.map +1 -0
  346. package/dist/plugins/__tests__/discover.test.js +311 -0
  347. package/dist/plugins/__tests__/discover.test.js.map +1 -0
  348. package/dist/plugins/__tests__/loader.test.d.ts +2 -0
  349. package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
  350. package/dist/plugins/__tests__/loader.test.js +191 -0
  351. package/dist/plugins/__tests__/loader.test.js.map +1 -0
  352. package/dist/plugins/__tests__/manifest-discovery.test.d.ts +2 -0
  353. package/dist/plugins/__tests__/manifest-discovery.test.d.ts.map +1 -0
  354. package/dist/plugins/__tests__/manifest-discovery.test.js +132 -0
  355. package/dist/plugins/__tests__/manifest-discovery.test.js.map +1 -0
  356. package/dist/plugins/__tests__/manifest-loader.test.d.ts +2 -0
  357. package/dist/plugins/__tests__/manifest-loader.test.d.ts.map +1 -0
  358. package/dist/plugins/__tests__/manifest-loader.test.js +434 -0
  359. package/dist/plugins/__tests__/manifest-loader.test.js.map +1 -0
  360. package/dist/plugins/__tests__/marker-discovery.test.d.ts +2 -0
  361. package/dist/plugins/__tests__/marker-discovery.test.d.ts.map +1 -0
  362. package/dist/plugins/__tests__/marker-discovery.test.js +164 -0
  363. package/dist/plugins/__tests__/marker-discovery.test.js.map +1 -0
  364. package/dist/plugins/__tests__/node-modules-walk.test.d.ts +2 -0
  365. package/dist/plugins/__tests__/node-modules-walk.test.d.ts.map +1 -0
  366. package/dist/plugins/__tests__/node-modules-walk.test.js +76 -0
  367. package/dist/plugins/__tests__/node-modules-walk.test.js.map +1 -0
  368. package/dist/plugins/__tests__/package-entry.test.d.ts +9 -0
  369. package/dist/plugins/__tests__/package-entry.test.d.ts.map +1 -0
  370. package/dist/plugins/__tests__/package-entry.test.js +117 -0
  371. package/dist/plugins/__tests__/package-entry.test.js.map +1 -0
  372. package/dist/plugins/__tests__/recipe-loader.test.d.ts +2 -0
  373. package/dist/plugins/__tests__/recipe-loader.test.d.ts.map +1 -0
  374. package/dist/plugins/__tests__/recipe-loader.test.js +130 -0
  375. package/dist/plugins/__tests__/recipe-loader.test.js.map +1 -0
  376. package/dist/plugins/__tests__/scope-validation.test.d.ts +2 -0
  377. package/dist/plugins/__tests__/scope-validation.test.d.ts.map +1 -0
  378. package/dist/plugins/__tests__/scope-validation.test.js +68 -0
  379. package/dist/plugins/__tests__/scope-validation.test.js.map +1 -0
  380. package/dist/plugins/__tests__/single-core-guard.test.d.ts +10 -0
  381. package/dist/plugins/__tests__/single-core-guard.test.d.ts.map +1 -0
  382. package/dist/plugins/__tests__/single-core-guard.test.js +89 -0
  383. package/dist/plugins/__tests__/single-core-guard.test.js.map +1 -0
  384. package/dist/plugins/__tests__/tool-package-discovery.test.d.ts +2 -0
  385. package/dist/plugins/__tests__/tool-package-discovery.test.d.ts.map +1 -0
  386. package/dist/plugins/__tests__/tool-package-discovery.test.js +215 -0
  387. package/dist/plugins/__tests__/tool-package-discovery.test.js.map +1 -0
  388. package/dist/plugins/authored-tool-discovery.d.ts +45 -0
  389. package/dist/plugins/authored-tool-discovery.d.ts.map +1 -0
  390. package/dist/plugins/authored-tool-discovery.js +61 -0
  391. package/dist/plugins/authored-tool-discovery.js.map +1 -0
  392. package/dist/plugins/capability-discovery.d.ts +80 -0
  393. package/dist/plugins/capability-discovery.d.ts.map +1 -0
  394. package/dist/plugins/capability-discovery.js +278 -0
  395. package/dist/plugins/capability-discovery.js.map +1 -0
  396. package/dist/plugins/capability-loader.d.ts +50 -0
  397. package/dist/plugins/capability-loader.d.ts.map +1 -0
  398. package/dist/plugins/capability-loader.js +85 -0
  399. package/dist/plugins/capability-loader.js.map +1 -0
  400. package/dist/plugins/capability-registry.d.ts +169 -0
  401. package/dist/plugins/capability-registry.d.ts.map +1 -0
  402. package/dist/plugins/capability-registry.js +319 -0
  403. package/dist/plugins/capability-registry.js.map +1 -0
  404. package/dist/plugins/discover.d.ts +64 -0
  405. package/dist/plugins/discover.d.ts.map +1 -0
  406. package/dist/plugins/discover.js +303 -0
  407. package/dist/plugins/discover.js.map +1 -0
  408. package/dist/plugins/index.d.ts +37 -0
  409. package/dist/plugins/index.d.ts.map +1 -0
  410. package/dist/plugins/index.js +40 -0
  411. package/dist/plugins/index.js.map +1 -0
  412. package/dist/plugins/json-guards.d.ts +11 -0
  413. package/dist/plugins/json-guards.d.ts.map +1 -0
  414. package/dist/plugins/json-guards.js +15 -0
  415. package/dist/plugins/json-guards.js.map +1 -0
  416. package/dist/plugins/loader.d.ts +67 -0
  417. package/dist/plugins/loader.d.ts.map +1 -0
  418. package/dist/plugins/loader.js +137 -0
  419. package/dist/plugins/loader.js.map +1 -0
  420. package/dist/plugins/manifest-discovery.d.ts +28 -0
  421. package/dist/plugins/manifest-discovery.d.ts.map +1 -0
  422. package/dist/plugins/manifest-discovery.js +103 -0
  423. package/dist/plugins/manifest-discovery.js.map +1 -0
  424. package/dist/plugins/manifest-loader.d.ts +120 -0
  425. package/dist/plugins/manifest-loader.d.ts.map +1 -0
  426. package/dist/plugins/manifest-loader.js +410 -0
  427. package/dist/plugins/manifest-loader.js.map +1 -0
  428. package/dist/plugins/marker-discovery.d.ts +115 -0
  429. package/dist/plugins/marker-discovery.d.ts.map +1 -0
  430. package/dist/plugins/marker-discovery.js +172 -0
  431. package/dist/plugins/marker-discovery.js.map +1 -0
  432. package/dist/plugins/node-modules-walk.d.ts +61 -0
  433. package/dist/plugins/node-modules-walk.d.ts.map +1 -0
  434. package/dist/plugins/node-modules-walk.js +99 -0
  435. package/dist/plugins/node-modules-walk.js.map +1 -0
  436. package/dist/plugins/package-entry.d.ts +38 -0
  437. package/dist/plugins/package-entry.d.ts.map +1 -0
  438. package/dist/plugins/package-entry.js +86 -0
  439. package/dist/plugins/package-entry.js.map +1 -0
  440. package/dist/plugins/recipe-loader.d.ts +63 -0
  441. package/dist/plugins/recipe-loader.d.ts.map +1 -0
  442. package/dist/plugins/recipe-loader.js +67 -0
  443. package/dist/plugins/recipe-loader.js.map +1 -0
  444. package/dist/plugins/scope-validation.d.ts +35 -0
  445. package/dist/plugins/scope-validation.d.ts.map +1 -0
  446. package/dist/plugins/scope-validation.js +55 -0
  447. package/dist/plugins/scope-validation.js.map +1 -0
  448. package/dist/plugins/single-core-guard.d.ts +28 -0
  449. package/dist/plugins/single-core-guard.d.ts.map +1 -0
  450. package/dist/plugins/single-core-guard.js +69 -0
  451. package/dist/plugins/single-core-guard.js.map +1 -0
  452. package/dist/plugins/tool-package-discovery.d.ts +93 -0
  453. package/dist/plugins/tool-package-discovery.d.ts.map +1 -0
  454. package/dist/plugins/tool-package-discovery.js +118 -0
  455. package/dist/plugins/tool-package-discovery.js.map +1 -0
  456. package/dist/plugins/types.d.ts +78 -0
  457. package/dist/plugins/types.d.ts.map +1 -0
  458. package/dist/plugins/types.js +15 -0
  459. package/dist/plugins/types.js.map +1 -0
  460. package/dist/recipes/__tests__/registry.test.d.ts +2 -0
  461. package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
  462. package/dist/recipes/__tests__/registry.test.js +170 -0
  463. package/dist/recipes/__tests__/registry.test.js.map +1 -0
  464. package/dist/recipes/__tests__/selector.test.d.ts +20 -0
  465. package/dist/recipes/__tests__/selector.test.d.ts.map +1 -0
  466. package/dist/recipes/__tests__/selector.test.js +173 -0
  467. package/dist/recipes/__tests__/selector.test.js.map +1 -0
  468. package/dist/recipes/__tests__/unit-config.test.d.ts +7 -0
  469. package/dist/recipes/__tests__/unit-config.test.d.ts.map +1 -0
  470. package/dist/recipes/__tests__/unit-config.test.js +52 -0
  471. package/dist/recipes/__tests__/unit-config.test.js.map +1 -0
  472. package/dist/recipes/registry.d.ts +105 -0
  473. package/dist/recipes/registry.d.ts.map +1 -0
  474. package/dist/recipes/registry.js +141 -0
  475. package/dist/recipes/registry.js.map +1 -0
  476. package/dist/recipes/selector.d.ts +112 -0
  477. package/dist/recipes/selector.d.ts.map +1 -0
  478. package/dist/recipes/selector.js +134 -0
  479. package/dist/recipes/selector.js.map +1 -0
  480. package/dist/recipes/unit-config.d.ts +63 -0
  481. package/dist/recipes/unit-config.d.ts.map +1 -0
  482. package/dist/recipes/unit-config.js +68 -0
  483. package/dist/recipes/unit-config.js.map +1 -0
  484. package/dist/runtime/__tests__/in-process-transport.test.d.ts +6 -0
  485. package/dist/runtime/__tests__/in-process-transport.test.d.ts.map +1 -0
  486. package/dist/runtime/__tests__/in-process-transport.test.js +73 -0
  487. package/dist/runtime/__tests__/in-process-transport.test.js.map +1 -0
  488. package/dist/runtime/__tests__/subprocess-transport.test.d.ts +11 -0
  489. package/dist/runtime/__tests__/subprocess-transport.test.d.ts.map +1 -0
  490. package/dist/runtime/__tests__/subprocess-transport.test.js +118 -0
  491. package/dist/runtime/__tests__/subprocess-transport.test.js.map +1 -0
  492. package/dist/runtime/in-process-transport.d.ts +20 -0
  493. package/dist/runtime/in-process-transport.d.ts.map +1 -0
  494. package/dist/runtime/in-process-transport.js +49 -0
  495. package/dist/runtime/in-process-transport.js.map +1 -0
  496. package/dist/runtime/progress-transport.d.ts +73 -0
  497. package/dist/runtime/progress-transport.d.ts.map +1 -0
  498. package/dist/runtime/progress-transport.js +17 -0
  499. package/dist/runtime/progress-transport.js.map +1 -0
  500. package/dist/runtime/subprocess-transport.d.ts +43 -0
  501. package/dist/runtime/subprocess-transport.d.ts.map +1 -0
  502. package/dist/runtime/subprocess-transport.js +134 -0
  503. package/dist/runtime/subprocess-transport.js.map +1 -0
  504. package/dist/signals/comment-openers.d.ts +29 -0
  505. package/dist/signals/comment-openers.d.ts.map +1 -0
  506. package/dist/signals/comment-openers.js +41 -0
  507. package/dist/signals/comment-openers.js.map +1 -0
  508. package/dist/signals/comment-openers.test.d.ts +7 -0
  509. package/dist/signals/comment-openers.test.d.ts.map +1 -0
  510. package/dist/signals/comment-openers.test.js +41 -0
  511. package/dist/signals/comment-openers.test.js.map +1 -0
  512. package/dist/signals/create-signal-from-violation.d.ts +29 -0
  513. package/dist/signals/create-signal-from-violation.d.ts.map +1 -0
  514. package/dist/signals/create-signal-from-violation.js +29 -0
  515. package/dist/signals/create-signal-from-violation.js.map +1 -0
  516. package/dist/signals/signal-sink.d.ts +49 -0
  517. package/dist/signals/signal-sink.d.ts.map +1 -0
  518. package/dist/signals/signal-sink.js +6 -0
  519. package/dist/signals/signal-sink.js.map +1 -0
  520. package/dist/signals/suppress.d.ts +102 -0
  521. package/dist/signals/suppress.d.ts.map +1 -0
  522. package/dist/signals/suppress.js +325 -0
  523. package/dist/signals/suppress.js.map +1 -0
  524. package/dist/signals/suppress.test.d.ts +2 -0
  525. package/dist/signals/suppress.test.d.ts.map +1 -0
  526. package/dist/signals/suppress.test.js +213 -0
  527. package/dist/signals/suppress.test.js.map +1 -0
  528. package/dist/tools/__tests__/command-spec.test.d.ts +2 -0
  529. package/dist/tools/__tests__/command-spec.test.d.ts.map +1 -0
  530. package/dist/tools/__tests__/command-spec.test.js +191 -0
  531. package/dist/tools/__tests__/command-spec.test.js.map +1 -0
  532. package/dist/tools/__tests__/compatibility.test.d.ts +5 -0
  533. package/dist/tools/__tests__/compatibility.test.d.ts.map +1 -0
  534. package/dist/tools/__tests__/compatibility.test.js +41 -0
  535. package/dist/tools/__tests__/compatibility.test.js.map +1 -0
  536. package/dist/tools/__tests__/ids.test.d.ts +5 -0
  537. package/dist/tools/__tests__/ids.test.d.ts.map +1 -0
  538. package/dist/tools/__tests__/ids.test.js +56 -0
  539. package/dist/tools/__tests__/ids.test.js.map +1 -0
  540. package/dist/tools/__tests__/manifest-assert.test.d.ts +5 -0
  541. package/dist/tools/__tests__/manifest-assert.test.d.ts.map +1 -0
  542. package/dist/tools/__tests__/manifest-assert.test.js +66 -0
  543. package/dist/tools/__tests__/manifest-assert.test.js.map +1 -0
  544. package/dist/tools/__tests__/registry.test.d.ts +2 -0
  545. package/dist/tools/__tests__/registry.test.d.ts.map +1 -0
  546. package/dist/tools/__tests__/registry.test.js +93 -0
  547. package/dist/tools/__tests__/registry.test.js.map +1 -0
  548. package/dist/tools/__tests__/types.test.d.ts +2 -0
  549. package/dist/tools/__tests__/types.test.d.ts.map +1 -0
  550. package/dist/tools/__tests__/types.test.js +51 -0
  551. package/dist/tools/__tests__/types.test.js.map +1 -0
  552. package/dist/tools/capability.d.ts +257 -0
  553. package/dist/tools/capability.d.ts.map +1 -0
  554. package/dist/tools/capability.js +46 -0
  555. package/dist/tools/capability.js.map +1 -0
  556. package/dist/tools/command-spec.d.ts +211 -0
  557. package/dist/tools/command-spec.d.ts.map +1 -0
  558. package/dist/tools/command-spec.js +110 -0
  559. package/dist/tools/command-spec.js.map +1 -0
  560. package/dist/tools/compatibility.d.ts +45 -0
  561. package/dist/tools/compatibility.d.ts.map +1 -0
  562. package/dist/tools/compatibility.js +49 -0
  563. package/dist/tools/compatibility.js.map +1 -0
  564. package/dist/tools/ids.d.ts +61 -0
  565. package/dist/tools/ids.d.ts.map +1 -0
  566. package/dist/tools/ids.js +61 -0
  567. package/dist/tools/ids.js.map +1 -0
  568. package/dist/tools/index.d.ts +22 -0
  569. package/dist/tools/index.d.ts.map +1 -0
  570. package/dist/tools/index.js +28 -0
  571. package/dist/tools/index.js.map +1 -0
  572. package/dist/tools/manifest-assert.d.ts +35 -0
  573. package/dist/tools/manifest-assert.d.ts.map +1 -0
  574. package/dist/tools/manifest-assert.js +67 -0
  575. package/dist/tools/manifest-assert.js.map +1 -0
  576. package/dist/tools/manifest.d.ts +178 -0
  577. package/dist/tools/manifest.d.ts.map +1 -0
  578. package/dist/tools/manifest.js +35 -0
  579. package/dist/tools/manifest.js.map +1 -0
  580. package/dist/tools/registry.d.ts +37 -0
  581. package/dist/tools/registry.d.ts.map +1 -0
  582. package/dist/tools/registry.js +49 -0
  583. package/dist/tools/registry.js.map +1 -0
  584. package/dist/tools/types.d.ts +1021 -0
  585. package/dist/tools/types.d.ts.map +1 -0
  586. package/dist/tools/types.js +77 -0
  587. package/dist/tools/types.js.map +1 -0
  588. package/dist/types/__tests__/signal.test.d.ts +2 -0
  589. package/dist/types/__tests__/signal.test.d.ts.map +1 -0
  590. package/dist/types/__tests__/signal.test.js +111 -0
  591. package/dist/types/__tests__/signal.test.js.map +1 -0
  592. package/dist/types/index.d.ts +5 -0
  593. package/dist/types/index.d.ts.map +1 -0
  594. package/dist/types/index.js +3 -0
  595. package/dist/types/index.js.map +1 -0
  596. package/dist/types/signal-batch.d.ts +56 -0
  597. package/dist/types/signal-batch.d.ts.map +1 -0
  598. package/dist/types/signal-batch.js +54 -0
  599. package/dist/types/signal-batch.js.map +1 -0
  600. package/dist/types/signal.d.ts +77 -0
  601. package/dist/types/signal.d.ts.map +1 -0
  602. package/dist/types/signal.js +42 -0
  603. package/dist/types/signal.js.map +1 -0
  604. package/package.json +57 -0
@@ -0,0 +1,212 @@
1
+ import { trace } from '@opentelemetry/api';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+ import { currentTraceparent, getTracer, withSpan, withSpanAsync } from '../../lib/telemetry.js';
4
+ /**
5
+ * Kernel-level telemetry tests assert the **no-op-until-SDK contract** — the
6
+ * load-bearing guarantee for standalone users. core carries only
7
+ * `@opentelemetry/api` and NO SDK, so these tests deliberately never register a
8
+ * provider: they prove `withSpan` runs `fn`, returns its value, and emits
9
+ * nothing through the API's no-op tracer.
10
+ *
11
+ * Span-CAPTURE behavior (assertions that a real span is produced with the
12
+ * expected name/attributes) is tested in `opensip-cli`, where the OTel
13
+ * SDK + InMemorySpanExporter legitimately live. Putting span-capture tests
14
+ * there keeps the SDK out of the kernel — see
15
+ * `packages/cli/src/telemetry/__tests__/`.
16
+ */
17
+ describe('telemetry primitive (no-op-until-SDK contract)', () => {
18
+ it('getTracer returns a tracer whose spans are non-recording when no SDK is registered', () => {
19
+ // No provider registered ⇒ the global is the API's no-op tracer.
20
+ expect(trace.getTracerProvider().constructor.name).toMatch(/Noop|Proxy/);
21
+ let recording;
22
+ getTracer('test-scope').startActiveSpan('probe', (span) => {
23
+ recording = span.isRecording();
24
+ span.end();
25
+ });
26
+ // The no-op span never records.
27
+ expect(recording).toBe(false);
28
+ });
29
+ it('withSpan runs fn and returns its value with no SDK registered', () => {
30
+ const sentinel = { value: 42 };
31
+ const result = withSpan('test-scope', 'unit', () => sentinel);
32
+ expect(result).toBe(sentinel);
33
+ });
34
+ it('withSpan passes the (no-op) span to fn', () => {
35
+ let received;
36
+ withSpan('test-scope', 'unit', (span) => {
37
+ received = span;
38
+ });
39
+ expect(received).toBeDefined();
40
+ // It is a span object (has the span surface) even when no-op.
41
+ expect(typeof received.end).toBe('function');
42
+ });
43
+ it('withSpan applies attributes before fn runs (no-op span accepts them without throwing)', () => {
44
+ const setAttributes = vi.fn();
45
+ // Stub the tracer so we can observe attribute application on the no-op path.
46
+ const span = {
47
+ setAttributes,
48
+ setStatus: vi.fn(),
49
+ recordException: vi.fn(),
50
+ end: vi.fn(),
51
+ isRecording: () => false,
52
+ };
53
+ const spy = vi.spyOn(trace, 'getTracer').mockReturnValue({
54
+ startActiveSpan: ((_name, fn) => fn(span)),
55
+ });
56
+ try {
57
+ withSpan('test-scope', 'unit', () => 'ok', { 'k.count': 3, 'k.flag': true });
58
+ expect(setAttributes).toHaveBeenCalledWith({ 'k.count': 3, 'k.flag': true });
59
+ expect(span.end).toHaveBeenCalledTimes(1);
60
+ }
61
+ finally {
62
+ spy.mockRestore();
63
+ }
64
+ });
65
+ it('withSpan stringifies a thrown non-Error before recording it', () => {
66
+ const recordException = vi.fn();
67
+ const span = {
68
+ setAttributes: vi.fn(),
69
+ setStatus: vi.fn(),
70
+ recordException,
71
+ end: vi.fn(),
72
+ isRecording: () => false,
73
+ };
74
+ const spy = vi.spyOn(trace, 'getTracer').mockReturnValue({
75
+ startActiveSpan: ((_name, fn) => fn(span)),
76
+ });
77
+ try {
78
+ expect(() => withSpan('test-scope', 'unit', () => {
79
+ // Throwing a bare string exercises the non-Error normalization branch.
80
+ // eslint-disable-next-line @typescript-eslint/only-throw-error -- exercising non-Error normalization
81
+ throw 'string boom';
82
+ })).toThrow('string boom');
83
+ expect(recordException).toHaveBeenCalledWith('string boom');
84
+ }
85
+ finally {
86
+ spy.mockRestore();
87
+ }
88
+ });
89
+ it('withSpan records the exception, sets ERROR status, ends the span, and rethrows', () => {
90
+ const recordException = vi.fn();
91
+ const setStatus = vi.fn();
92
+ const end = vi.fn();
93
+ const span = {
94
+ setAttributes: vi.fn(),
95
+ setStatus,
96
+ recordException,
97
+ end,
98
+ isRecording: () => false,
99
+ };
100
+ const spy = vi.spyOn(trace, 'getTracer').mockReturnValue({
101
+ startActiveSpan: ((_name, fn) => fn(span)),
102
+ });
103
+ const boom = new Error('boom');
104
+ try {
105
+ expect(() => withSpan('test-scope', 'unit', () => {
106
+ throw boom;
107
+ })).toThrow(boom);
108
+ expect(recordException).toHaveBeenCalledWith(boom);
109
+ // SpanStatusCode.ERROR === 2
110
+ expect(setStatus).toHaveBeenCalledWith({ code: 2 });
111
+ expect(end).toHaveBeenCalledTimes(1);
112
+ }
113
+ finally {
114
+ spy.mockRestore();
115
+ }
116
+ });
117
+ });
118
+ describe('withSpanAsync (async-aware span)', () => {
119
+ it('awaits fn and returns its resolved value with no SDK registered', async () => {
120
+ const sentinel = { value: 7 };
121
+ const result = await withSpanAsync('test-scope', 'unit', async () => {
122
+ await Promise.resolve();
123
+ return sentinel;
124
+ });
125
+ expect(result).toBe(sentinel);
126
+ });
127
+ it('ends the span only after the awaited work settles (not when the callback returns)', async () => {
128
+ const events = [];
129
+ const span = {
130
+ setAttributes: vi.fn(),
131
+ setStatus: vi.fn(),
132
+ recordException: vi.fn(),
133
+ end: vi.fn(() => events.push('end')),
134
+ isRecording: () => false,
135
+ };
136
+ const spy = vi.spyOn(trace, 'getTracer').mockReturnValue({
137
+ startActiveSpan: ((_name, fn) => fn(span)),
138
+ });
139
+ try {
140
+ await withSpanAsync('test-scope', 'unit', async () => {
141
+ await Promise.resolve();
142
+ events.push('work-done');
143
+ });
144
+ // The span must end AFTER the awaited work, proving it spans the await.
145
+ expect(events).toEqual(['work-done', 'end']);
146
+ }
147
+ finally {
148
+ spy.mockRestore();
149
+ }
150
+ });
151
+ it('stringifies a non-Error async rejection before recording it', async () => {
152
+ const recordException = vi.fn();
153
+ const span = {
154
+ setAttributes: vi.fn(),
155
+ setStatus: vi.fn(),
156
+ recordException,
157
+ end: vi.fn(),
158
+ isRecording: () => false,
159
+ };
160
+ const spy = vi.spyOn(trace, 'getTracer').mockReturnValue({
161
+ startActiveSpan: ((_name, fn) => fn(span)),
162
+ });
163
+ try {
164
+ await expect(withSpanAsync('test-scope', 'unit', async () => {
165
+ await Promise.resolve();
166
+ // eslint-disable-next-line @typescript-eslint/only-throw-error -- exercising non-Error normalization
167
+ throw 'async string boom';
168
+ })).rejects.toBe('async string boom');
169
+ expect(recordException).toHaveBeenCalledWith('async string boom');
170
+ }
171
+ finally {
172
+ spy.mockRestore();
173
+ }
174
+ });
175
+ it('records an async rejection, sets ERROR status, ends the span, and rejects', async () => {
176
+ const recordException = vi.fn();
177
+ const setStatus = vi.fn();
178
+ const end = vi.fn();
179
+ const span = {
180
+ setAttributes: vi.fn(),
181
+ setStatus,
182
+ recordException,
183
+ end,
184
+ isRecording: () => false,
185
+ };
186
+ const spy = vi.spyOn(trace, 'getTracer').mockReturnValue({
187
+ startActiveSpan: ((_name, fn) => fn(span)),
188
+ });
189
+ const boom = new Error('async boom');
190
+ try {
191
+ await expect(withSpanAsync('test-scope', 'unit', async () => {
192
+ await Promise.resolve();
193
+ throw boom;
194
+ })).rejects.toBe(boom);
195
+ expect(recordException).toHaveBeenCalledWith(boom);
196
+ expect(setStatus).toHaveBeenCalledWith({ code: 2 }); // SpanStatusCode.ERROR
197
+ expect(end).toHaveBeenCalledTimes(1);
198
+ }
199
+ finally {
200
+ spy.mockRestore();
201
+ }
202
+ });
203
+ });
204
+ describe('currentTraceparent (subprocess context propagation)', () => {
205
+ it('returns undefined when no SDK/propagator is registered (standalone runs)', () => {
206
+ // No provider/propagator ⇒ the no-op tracer yields an invalid span context,
207
+ // which the W3C propagator declines to serialize. Standalone runs spawning
208
+ // a child thus pass no TRACEPARENT, and the child emits no spans.
209
+ expect(currentTraceparent()).toBeUndefined();
210
+ });
211
+ });
212
+ //# sourceMappingURL=telemetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/telemetry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEhG;;;;;;;;;;;;GAYG;AACH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,iEAAiE;QACjE,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzE,IAAI,SAA8B,CAAC;QACnC,SAAS,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxD,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QACH,gCAAgC;QAChC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,IAAI,QAAiB,CAAC;QACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACtC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,8DAA8D;QAC9D,MAAM,CAAC,OAAQ,QAA6B,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,6EAA6E;QAC7E,MAAM,IAAI,GAAG;YACX,aAAa;YACb,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;YACxB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACzB,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC;YACvD,eAAe,EAAE,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU;SAC5E,CAAC,CAAC;QACZ,IAAI,CAAC;YACH,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG;YACX,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,eAAe;YACf,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACzB,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC;YACvD,eAAe,EAAE,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU;SAC5E,CAAC,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CACV,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE;gBAClC,uEAAuE;gBACvE,qGAAqG;gBACrG,MAAM,aAAa,CAAC;YACtB,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACzB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG;YACX,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,SAAS;YACT,eAAe;YACf,GAAG;YACH,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACzB,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC;YACvD,eAAe,EAAE,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU;SAC5E,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CACV,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE;gBAClC,MAAM,IAAI,CAAC;YACb,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACnD,6BAA6B;YAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG;YACX,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;YACxB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACzB,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC;YACvD,eAAe,EAAE,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU;SAC5E,CAAC,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;gBACnD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YACH,wEAAwE;YACxE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG;YACX,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,eAAe;YACf,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACzB,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC;YACvD,eAAe,EAAE,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU;SAC5E,CAAC,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,CACV,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,qGAAqG;gBACrG,MAAM,mBAAmB,CAAC;YAC5B,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACpC,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG;YACX,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;YACtB,SAAS;YACT,eAAe;YACf,GAAG;YACH,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACzB,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,eAAe,CAAC;YACvD,eAAe,EAAE,CAAC,CAAC,KAAa,EAAE,EAA2B,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAU;SAC5E,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,CACV,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC;YACb,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;YAC5E,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,4EAA4E;QAC5E,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * verdict-policy — the host-owned findings gate (ADR-0035). Pins the truth table
3
+ * for `policyPasses` and the reserved-key resolution + per-key `{1,0}` fallback
4
+ * of `resolveVerdictPolicy`, so a future edit can't silently drift the gate.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=verdict-policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-policy.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/verdict-policy.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * verdict-policy — the host-owned findings gate (ADR-0035). Pins the truth table
3
+ * for `policyPasses` and the reserved-key resolution + per-key `{1,0}` fallback
4
+ * of `resolveVerdictPolicy`, so a future edit can't silently drift the gate.
5
+ */
6
+ import { describe, expect, it } from 'vitest';
7
+ import { LanguageRegistry } from '../../languages/registry.js';
8
+ import { ToolRegistry } from '../../tools/registry.js';
9
+ import { RunScope, runWithScopeSync } from '../run-scope.js';
10
+ import { DEFAULT_FAIL_ON_DEGRADED, HOST_VERDICT_POLICY_FALLBACK, policyPasses, resolveFailOnDegraded, resolveVerdictPolicy, } from '../verdict-policy.js';
11
+ /** Fresh scope with empty registries — core-internal stand-in for the retired
12
+ * `test-utils/with-scope` sugar (ADR-0040: the shared helper moved to
13
+ * `@opensip-cli/test-support`, which core cannot dev-depend on — that
14
+ * package depends on core, so the edge would make the package graph cyclic). */
15
+ const makeTestScope = () => new RunScope({ languages: new LanguageRegistry(), tools: new ToolRegistry() });
16
+ describe('policyPasses', () => {
17
+ // [errors, warnings, failOnErrors, failOnWarnings, expectedPasses]
18
+ const cases = [
19
+ // {1,0} fallback: fail on any error, warnings informational.
20
+ [0, 0, 1, 0, true],
21
+ [1, 0, 1, 0, false],
22
+ [0, 5, 1, 0, true], // warning-only run PASSES with failOnWarnings:0
23
+ // failOnErrors:0 disables the error gate.
24
+ [3, 0, 0, 0, true],
25
+ // failOnWarnings:k boundary (k active when > 0).
26
+ [0, 1, 1, 2, true], // 1 < 2 → pass
27
+ [0, 2, 1, 2, false], // 2 >= 2 → fail
28
+ [0, 1, 1, 1, false], // 1 >= 1 → fail
29
+ // error gate boundary.
30
+ [2, 0, 3, 0, true], // 2 < 3 → pass
31
+ [3, 0, 3, 0, false], // 3 >= 3 → fail
32
+ ];
33
+ for (const [errors, warnings, failOnErrors, failOnWarnings, expected] of cases) {
34
+ it(`(${errors}e,${warnings}w) vs {${failOnErrors},${failOnWarnings}} → ${expected ? 'PASS' : 'FAIL'}`, () => {
35
+ const policy = { failOnErrors, failOnWarnings };
36
+ expect(policyPasses({ errors, warnings }, policy)).toBe(expected);
37
+ });
38
+ }
39
+ });
40
+ /** Resolve a tool's policy inside a scope carrying the given resolved toolConfig. */
41
+ function resolveWith(toolConfig, ns = 'graph') {
42
+ const scope = makeTestScope();
43
+ if (toolConfig !== undefined)
44
+ Object.assign(scope, { toolConfig });
45
+ return runWithScopeSync(scope, () => resolveVerdictPolicy(ns));
46
+ }
47
+ describe('resolveVerdictPolicy', () => {
48
+ it('returns the host fallback {1,0} when the namespace declares neither key', () => {
49
+ expect(resolveWith({ graph: {} })).toEqual(HOST_VERDICT_POLICY_FALLBACK);
50
+ });
51
+ it('returns the host fallback {1,0} when there is no toolConfig at all', () => {
52
+ expect(resolveWith(undefined)).toEqual(HOST_VERDICT_POLICY_FALLBACK);
53
+ });
54
+ it('reads both reserved keys when declared', () => {
55
+ expect(resolveWith({ fitness: { failOnErrors: 0, failOnWarnings: 2 } }, 'fitness')).toEqual({
56
+ failOnErrors: 0,
57
+ failOnWarnings: 2,
58
+ });
59
+ });
60
+ it('falls back per-key: a tool may declare one key and inherit the other', () => {
61
+ expect(resolveWith({ graph: { failOnWarnings: 3 } })).toEqual({
62
+ failOnErrors: 1, // inherited
63
+ failOnWarnings: 3, // declared
64
+ });
65
+ });
66
+ it('ignores non-integer / negative values, falling back to the host default', () => {
67
+ expect(resolveWith({ graph: { failOnErrors: -1, failOnWarnings: 1.5 } })).toEqual(HOST_VERDICT_POLICY_FALLBACK);
68
+ });
69
+ });
70
+ /** Resolve failOnDegraded inside a scope carrying the given resolved toolConfig. */
71
+ function degradedWith(toolConfig, ns = 'graph') {
72
+ const scope = makeTestScope();
73
+ if (toolConfig !== undefined)
74
+ Object.assign(scope, { toolConfig });
75
+ return runWithScopeSync(scope, () => resolveFailOnDegraded(ns));
76
+ }
77
+ describe('resolveFailOnDegraded (ADR-0036)', () => {
78
+ it('defaults to true when no toolConfig / no key is present', () => {
79
+ expect(DEFAULT_FAIL_ON_DEGRADED).toBe(true);
80
+ expect(degradedWith(undefined)).toBe(true);
81
+ expect(degradedWith({ graph: {} })).toBe(true);
82
+ });
83
+ it('honours an explicit boolean (ratchet-as-report when false)', () => {
84
+ expect(degradedWith({ graph: { failOnDegraded: false } })).toBe(false);
85
+ expect(degradedWith({ graph: { failOnDegraded: true } })).toBe(true);
86
+ });
87
+ it('ignores a non-boolean value, falling back to the default', () => {
88
+ expect(degradedWith({ graph: { failOnDegraded: 'yes' } })).toBe(true);
89
+ });
90
+ });
91
+ //# sourceMappingURL=verdict-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-policy.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/verdict-policy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for `readYamlFile` — the permissive helper used
3
+ * by plugin-discovery sites.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=yaml.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/yaml.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview Tests for `readYamlFile` — the permissive helper used
3
+ * by plugin-discovery sites.
4
+ */
5
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { SystemError, ValidationError } from '../errors.js';
10
+ import { readYamlFile, readYamlFileOrThrow } from '../yaml.js';
11
+ let testDir;
12
+ beforeEach(() => {
13
+ testDir = mkdtempSync(join(tmpdir(), 'opensip-yaml-test-'));
14
+ });
15
+ afterEach(() => {
16
+ rmSync(testDir, { recursive: true, force: true });
17
+ });
18
+ describe('readYamlFile', () => {
19
+ it('returns undefined when the file does not exist', () => {
20
+ expect(readYamlFile(join(testDir, 'missing.yml'))).toBeUndefined();
21
+ });
22
+ it('returns undefined for malformed YAML', () => {
23
+ const path = join(testDir, 'bad.yml');
24
+ writeFileSync(path, 'a: [unterminated');
25
+ expect(readYamlFile(path)).toBeUndefined();
26
+ });
27
+ it('returns the parsed document for valid YAML', () => {
28
+ const path = join(testDir, 'good.yml');
29
+ writeFileSync(path, 'plugins:\n fit:\n - one\n - two\n');
30
+ expect(readYamlFile(path)).toEqual({ plugins: { fit: ['one', 'two'] } });
31
+ });
32
+ it('returns null when the document is an empty YAML', () => {
33
+ const path = join(testDir, 'empty.yml');
34
+ writeFileSync(path, '');
35
+ // js-yaml returns undefined for completely empty input
36
+ expect(readYamlFile(path)).toBeUndefined();
37
+ });
38
+ });
39
+ describe('readYamlFileOrThrow (audit-round-2 Finding F)', () => {
40
+ it('returns the parsed document for valid YAML', () => {
41
+ const path = join(testDir, 'good.yml');
42
+ writeFileSync(path, 'fitness:\n failOnErrors: 1\n');
43
+ expect(readYamlFileOrThrow(path)).toEqual({ fitness: { failOnErrors: 1 } });
44
+ });
45
+ it('returns {} for empty YAML rather than undefined', () => {
46
+ const path = join(testDir, 'empty.yml');
47
+ writeFileSync(path, '');
48
+ expect(readYamlFileOrThrow(path)).toEqual({});
49
+ });
50
+ it('throws ValidationError for a missing file with loader attribution', () => {
51
+ const path = join(testDir, 'missing.yml');
52
+ expect(() => readYamlFileOrThrow(path, { loader: 'signalers' })).toThrow(ValidationError);
53
+ });
54
+ it('throws ValidationError for malformed YAML', () => {
55
+ const path = join(testDir, 'bad.yml');
56
+ writeFileSync(path, 'a: [unterminated');
57
+ try {
58
+ readYamlFileOrThrow(path, { loader: 'signalers' });
59
+ throw new Error('expected throw');
60
+ }
61
+ catch (error) {
62
+ expect(error).toBeInstanceOf(ValidationError);
63
+ expect(error.message).toContain('invalid YAML');
64
+ }
65
+ });
66
+ it('throws SystemError when the file exceeds maxBytes', () => {
67
+ const path = join(testDir, 'big.yml');
68
+ writeFileSync(path, 'x: '.repeat(2000));
69
+ try {
70
+ readYamlFileOrThrow(path, { maxBytes: 64, loader: 'signalers' });
71
+ throw new Error('expected throw');
72
+ }
73
+ catch (error) {
74
+ expect(error).toBeInstanceOf(SystemError);
75
+ expect(error.code).toBe('SYSTEM.FILE.TOO_LARGE');
76
+ }
77
+ });
78
+ });
79
+ //# sourceMappingURL=yaml.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/yaml.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @fileoverview Permissive reader for the top-level `schemaVersion:`
3
+ * field of opensip-cli.config.yml + a compatibility classifier.
4
+ *
5
+ * The CLI's pre-action-hook calls these BEFORE any tool's strict loader
6
+ * runs, so the reader must tolerate every "couldn't determine" case
7
+ * (missing file, malformed YAML, missing field, non-integer field) and
8
+ * treat them all as v1. Forward compat for existing user configs
9
+ * written before the field existed.
10
+ *
11
+ * Lives in `core/lib/` alongside `paths.ts` because version detection
12
+ * is a kernel-level concern; every tool's loader benefits.
13
+ */
14
+ /**
15
+ * The schema version this CLI binary knows how to load. Bumped when
16
+ * the project config structure changes in a way that requires
17
+ * migration.
18
+ */
19
+ export declare const CLI_SUPPORTED_SCHEMA_VERSION: 1;
20
+ /** Outcome of `checkSchemaCompat`. */
21
+ export type SchemaCompat = {
22
+ readonly kind: 'ok';
23
+ readonly configVersion: number;
24
+ } | {
25
+ readonly kind: 'older';
26
+ readonly configVersion: number;
27
+ readonly cliVersion: number;
28
+ } | {
29
+ readonly kind: 'cli-too-old';
30
+ readonly configVersion: number;
31
+ readonly cliVersion: number;
32
+ };
33
+ /**
34
+ * Read the top-level `schemaVersion:` field. Returns 1 for any
35
+ * "couldn't read it" outcome, by design.
36
+ */
37
+ export declare function readConfigSchemaVersion(configPath: string): number;
38
+ /**
39
+ * Classify a config's declared version against the CLI's supported version.
40
+ *
41
+ * - 'ok' — versions match; proceed silently.
42
+ * - 'older' — config is older than CLI; CLI can read it (today).
43
+ * Future: `opensip-cli migrate` updates it. For
44
+ * now the CLI runs it as-is.
45
+ * - 'cli-too-old' — config is newer than CLI knows. CLI cannot safely
46
+ * load it. User must upgrade the CLI.
47
+ */
48
+ export declare function checkSchemaCompat(configVersion: number): SchemaCompat;
49
+ //# sourceMappingURL=config-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-version.d.ts","sourceRoot":"","sources":["../../src/lib/config-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAG,CAAU,CAAC;AAEvD,sCAAsC;AACtC,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CAQrE"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview Permissive reader for the top-level `schemaVersion:`
3
+ * field of opensip-cli.config.yml + a compatibility classifier.
4
+ *
5
+ * The CLI's pre-action-hook calls these BEFORE any tool's strict loader
6
+ * runs, so the reader must tolerate every "couldn't determine" case
7
+ * (missing file, malformed YAML, missing field, non-integer field) and
8
+ * treat them all as v1. Forward compat for existing user configs
9
+ * written before the field existed.
10
+ *
11
+ * Lives in `core/lib/` alongside `paths.ts` because version detection
12
+ * is a kernel-level concern; every tool's loader benefits.
13
+ */
14
+ import { existsSync } from 'node:fs';
15
+ import { readYamlFile } from './yaml.js';
16
+ /**
17
+ * The schema version this CLI binary knows how to load. Bumped when
18
+ * the project config structure changes in a way that requires
19
+ * migration.
20
+ */
21
+ export const CLI_SUPPORTED_SCHEMA_VERSION = 1;
22
+ /**
23
+ * Read the top-level `schemaVersion:` field. Returns 1 for any
24
+ * "couldn't read it" outcome, by design.
25
+ */
26
+ export function readConfigSchemaVersion(configPath) {
27
+ if (!existsSync(configPath))
28
+ return 1;
29
+ const doc = readYamlFile(configPath);
30
+ if (doc === null || typeof doc !== 'object' || Array.isArray(doc))
31
+ return 1;
32
+ const raw = doc.schemaVersion;
33
+ if (typeof raw !== 'number' || !Number.isInteger(raw) || raw < 1)
34
+ return 1;
35
+ return raw;
36
+ }
37
+ /**
38
+ * Classify a config's declared version against the CLI's supported version.
39
+ *
40
+ * - 'ok' — versions match; proceed silently.
41
+ * - 'older' — config is older than CLI; CLI can read it (today).
42
+ * Future: `opensip-cli migrate` updates it. For
43
+ * now the CLI runs it as-is.
44
+ * - 'cli-too-old' — config is newer than CLI knows. CLI cannot safely
45
+ * load it. User must upgrade the CLI.
46
+ */
47
+ export function checkSchemaCompat(configVersion) {
48
+ if (configVersion === CLI_SUPPORTED_SCHEMA_VERSION) {
49
+ return { kind: 'ok', configVersion };
50
+ }
51
+ if (configVersion < CLI_SUPPORTED_SCHEMA_VERSION) {
52
+ return { kind: 'older', configVersion, cliVersion: CLI_SUPPORTED_SCHEMA_VERSION };
53
+ }
54
+ return { kind: 'cli-too-old', configVersion, cliVersion: CLI_SUPPORTED_SCHEMA_VERSION };
55
+ }
56
+ //# sourceMappingURL=config-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-version.js","sourceRoot":"","sources":["../../src/lib/config-version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAU,CAAC;AAQvD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAI,GAA+B,CAAC,aAAa,CAAC;IAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB;IACrD,IAAI,aAAa,KAAK,4BAA4B,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,aAAa,GAAG,4BAA4B,EAAE,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,4BAA4B,EAAE,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * DiagnosticsBus — the scope-owned collector that gathers {@link DiagnosticEvent}s
3
+ * across the uniform tool lifecycle and snapshots them as {@link RunDiagnostics}
4
+ * to ride on a `CommandOutcome` (north-star §5.10, launch).
5
+ *
6
+ * Per-invocation state, held on {@link RunScope} (the no-module-singleton rule):
7
+ * library code deep in the call tree emits via `currentScope()?.diagnostics`, and
8
+ * the host assembler attaches `scope.diagnostics.snapshot()` to every outcome.
9
+ * Additive — the logger, runId, and graph OTEL spans stay; this is the
10
+ * structured, JSON-emittable layer on top.
11
+ *
12
+ * The bus is a runtime collector (like the logger), so it stamps wall-clock time
13
+ * (`new Date().toISOString()`) — the `Date.now()`-free contract applies to the
14
+ * pure formatters (`buildSignalEnvelope`), not to this collector. The OTEL trace
15
+ * bridge is best-effort: `snapshot().trace` carries the active span's
16
+ * trace/span ids when telemetry is on, parsed from the W3C `traceparent` the
17
+ * kernel already exposes — so bundled and external tools are observable
18
+ * identically, with no SDK dependency in the kernel.
19
+ */
20
+ import type { DiagnosticEvent, DiagnosticLevel, DiagnosticPhase, RunDiagnostics } from './run-diagnostics.js';
21
+ /** A diagnostic event with the timestamp left to the bus to stamp. */
22
+ export type DiagnosticEventInput = Omit<DiagnosticEvent, 'at'> & {
23
+ readonly at?: string;
24
+ };
25
+ /**
26
+ * The per-invocation diagnostics collector. Construct one per {@link RunScope}.
27
+ */
28
+ export declare class DiagnosticsBus {
29
+ private readonly runId;
30
+ private readonly events;
31
+ private readonly metrics;
32
+ constructor(runId: string);
33
+ /**
34
+ * Append a lifecycle event. The bus stamps `at` (ISO-8601) when the caller did
35
+ * not supply one. Cheap and allocation-light; safe to call from any phase.
36
+ */
37
+ emit(event: DiagnosticEventInput): void;
38
+ /** Convenience: emit at a given phase/level with an optional data bag. */
39
+ event(phase: DiagnosticPhase, level: DiagnosticLevel, message: string, data?: Readonly<Record<string, unknown>>): void;
40
+ /** Increment a named counter (e.g. `'plugins.loaded'`). Defaults to +1. */
41
+ counter(name: string, delta?: number): void;
42
+ /**
43
+ * Materialize the JSON-emittable snapshot carried on a `CommandOutcome`. Pure
44
+ * read: copies the event stream + metrics and bridges the active OTEL trace.
45
+ */
46
+ snapshot(): RunDiagnostics;
47
+ }
48
+ //# sourceMappingURL=diagnostics-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics-bus.d.ts","sourceRoot":"","sources":["../../src/lib/diagnostics-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,sEAAsE;AACtE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAe1F;;GAEG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,KAAK;IAHlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;gBAExB,KAAK,EAAE,MAAM;IAE1C;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAIvC,0EAA0E;IAC1E,KAAK,CACH,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,IAAI;IAIP,2EAA2E;IAC3E,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;IAItC;;;OAGG;IACH,QAAQ,IAAI,cAAc;CAS3B"}