@owlmeans/viable-common 0.0.4

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 (453) hide show
  1. package/README.md +68 -0
  2. package/agent-meta/manifest.json +16 -0
  3. package/agent-meta/skills/viable-common/SKILL.md +179 -0
  4. package/build/agent/index.d.ts +4 -0
  5. package/build/agent/index.d.ts.map +1 -0
  6. package/build/agent/index.js +3 -0
  7. package/build/agent/index.js.map +1 -0
  8. package/build/agent/memory.d.ts +12 -0
  9. package/build/agent/memory.d.ts.map +1 -0
  10. package/build/agent/memory.js +11 -0
  11. package/build/agent/memory.js.map +1 -0
  12. package/build/agent/spectator/consts.d.ts +9 -0
  13. package/build/agent/spectator/consts.d.ts.map +1 -0
  14. package/build/agent/spectator/consts.js +10 -0
  15. package/build/agent/spectator/consts.js.map +1 -0
  16. package/build/agent/spectator/index.d.ts +3 -0
  17. package/build/agent/spectator/index.d.ts.map +1 -0
  18. package/build/agent/spectator/index.js +2 -0
  19. package/build/agent/spectator/index.js.map +1 -0
  20. package/build/agent/spectator/types.d.ts +13 -0
  21. package/build/agent/spectator/types.d.ts.map +1 -0
  22. package/build/agent/spectator/types.js +2 -0
  23. package/build/agent/spectator/types.js.map +1 -0
  24. package/build/agent/types.d.ts +10 -0
  25. package/build/agent/types.d.ts.map +1 -0
  26. package/build/agent/types.js +2 -0
  27. package/build/agent/types.js.map +1 -0
  28. package/build/areas/consts.d.ts +88 -0
  29. package/build/areas/consts.d.ts.map +1 -0
  30. package/build/areas/consts.js +106 -0
  31. package/build/areas/consts.js.map +1 -0
  32. package/build/areas/index.d.ts +3 -0
  33. package/build/areas/index.d.ts.map +1 -0
  34. package/build/areas/index.js +2 -0
  35. package/build/areas/index.js.map +1 -0
  36. package/build/areas/types.d.ts +28 -0
  37. package/build/areas/types.d.ts.map +1 -0
  38. package/build/areas/types.js +2 -0
  39. package/build/areas/types.js.map +1 -0
  40. package/build/ba/consts.d.ts +38 -0
  41. package/build/ba/consts.d.ts.map +1 -0
  42. package/build/ba/consts.js +41 -0
  43. package/build/ba/consts.js.map +1 -0
  44. package/build/ba/helpers.d.ts +41 -0
  45. package/build/ba/helpers.d.ts.map +1 -0
  46. package/build/ba/helpers.js +79 -0
  47. package/build/ba/helpers.js.map +1 -0
  48. package/build/ba/index.d.ts +5 -0
  49. package/build/ba/index.d.ts.map +1 -0
  50. package/build/ba/index.js +4 -0
  51. package/build/ba/index.js.map +1 -0
  52. package/build/ba/schemas.d.ts +13 -0
  53. package/build/ba/schemas.d.ts.map +1 -0
  54. package/build/ba/schemas.js +181 -0
  55. package/build/ba/schemas.js.map +1 -0
  56. package/build/ba/types.d.ts +113 -0
  57. package/build/ba/types.d.ts.map +1 -0
  58. package/build/ba/types.js +2 -0
  59. package/build/ba/types.js.map +1 -0
  60. package/build/blueprint/case.d.ts +73 -0
  61. package/build/blueprint/case.d.ts.map +1 -0
  62. package/build/blueprint/case.js +244 -0
  63. package/build/blueprint/case.js.map +1 -0
  64. package/build/blueprint/consts.d.ts +11 -0
  65. package/build/blueprint/consts.d.ts.map +1 -0
  66. package/build/blueprint/consts.js +11 -0
  67. package/build/blueprint/consts.js.map +1 -0
  68. package/build/blueprint/index.d.ts +6 -0
  69. package/build/blueprint/index.d.ts.map +1 -0
  70. package/build/blueprint/index.js +6 -0
  71. package/build/blueprint/index.js.map +1 -0
  72. package/build/blueprint/resolve.d.ts +51 -0
  73. package/build/blueprint/resolve.d.ts.map +1 -0
  74. package/build/blueprint/resolve.js +108 -0
  75. package/build/blueprint/resolve.js.map +1 -0
  76. package/build/blueprint/schemas.d.ts +41 -0
  77. package/build/blueprint/schemas.d.ts.map +1 -0
  78. package/build/blueprint/schemas.js +27 -0
  79. package/build/blueprint/schemas.js.map +1 -0
  80. package/build/blueprint/types.d.ts +186 -0
  81. package/build/blueprint/types.d.ts.map +1 -0
  82. package/build/blueprint/types.js +32 -0
  83. package/build/blueprint/types.js.map +1 -0
  84. package/build/branding.d.ts +19 -0
  85. package/build/branding.d.ts.map +1 -0
  86. package/build/branding.js +32 -0
  87. package/build/branding.js.map +1 -0
  88. package/build/connect/consts.d.ts +378 -0
  89. package/build/connect/consts.d.ts.map +1 -0
  90. package/build/connect/consts.js +425 -0
  91. package/build/connect/consts.js.map +1 -0
  92. package/build/connect/entrypoints.d.ts +41 -0
  93. package/build/connect/entrypoints.d.ts.map +1 -0
  94. package/build/connect/entrypoints.js +141 -0
  95. package/build/connect/entrypoints.js.map +1 -0
  96. package/build/connect/errors.d.ts +50 -0
  97. package/build/connect/errors.d.ts.map +1 -0
  98. package/build/connect/errors.js +77 -0
  99. package/build/connect/errors.js.map +1 -0
  100. package/build/connect/index.d.ts +8 -0
  101. package/build/connect/index.d.ts.map +1 -0
  102. package/build/connect/index.js +6 -0
  103. package/build/connect/index.js.map +1 -0
  104. package/build/connect/ops.d.ts +192 -0
  105. package/build/connect/ops.d.ts.map +1 -0
  106. package/build/connect/ops.js +2 -0
  107. package/build/connect/ops.js.map +1 -0
  108. package/build/connect/references.d.ts +194 -0
  109. package/build/connect/references.d.ts.map +1 -0
  110. package/build/connect/references.js +62 -0
  111. package/build/connect/references.js.map +1 -0
  112. package/build/connect/schemas.d.ts +59 -0
  113. package/build/connect/schemas.d.ts.map +1 -0
  114. package/build/connect/schemas.js +346 -0
  115. package/build/connect/schemas.js.map +1 -0
  116. package/build/connect/types.d.ts +428 -0
  117. package/build/connect/types.d.ts.map +1 -0
  118. package/build/connect/types.js +2 -0
  119. package/build/connect/types.js.map +1 -0
  120. package/build/consts.d.ts +9 -0
  121. package/build/consts.d.ts.map +1 -0
  122. package/build/consts.js +31 -0
  123. package/build/consts.js.map +1 -0
  124. package/build/convert/consts.d.ts +539 -0
  125. package/build/convert/consts.d.ts.map +1 -0
  126. package/build/convert/consts.js +630 -0
  127. package/build/convert/consts.js.map +1 -0
  128. package/build/convert/helpers.d.ts +91 -0
  129. package/build/convert/helpers.d.ts.map +1 -0
  130. package/build/convert/helpers.js +301 -0
  131. package/build/convert/helpers.js.map +1 -0
  132. package/build/convert/index.d.ts +11 -0
  133. package/build/convert/index.d.ts.map +1 -0
  134. package/build/convert/index.js +4 -0
  135. package/build/convert/index.js.map +1 -0
  136. package/build/convert/schemas.d.ts +62 -0
  137. package/build/convert/schemas.d.ts.map +1 -0
  138. package/build/convert/schemas.js +626 -0
  139. package/build/convert/schemas.js.map +1 -0
  140. package/build/convert/types.d.ts +683 -0
  141. package/build/convert/types.d.ts.map +1 -0
  142. package/build/convert/types.js +2 -0
  143. package/build/convert/types.js.map +1 -0
  144. package/build/design/consts.d.ts +25 -0
  145. package/build/design/consts.d.ts.map +1 -0
  146. package/build/design/consts.js +26 -0
  147. package/build/design/consts.js.map +1 -0
  148. package/build/design/helpers.d.ts +60 -0
  149. package/build/design/helpers.d.ts.map +1 -0
  150. package/build/design/helpers.js +221 -0
  151. package/build/design/helpers.js.map +1 -0
  152. package/build/design/index.d.ts +6 -0
  153. package/build/design/index.d.ts.map +1 -0
  154. package/build/design/index.js +5 -0
  155. package/build/design/index.js.map +1 -0
  156. package/build/design/runtime.d.ts +126 -0
  157. package/build/design/runtime.d.ts.map +1 -0
  158. package/build/design/runtime.js +65 -0
  159. package/build/design/runtime.js.map +1 -0
  160. package/build/design/schemas.d.ts +21 -0
  161. package/build/design/schemas.d.ts.map +1 -0
  162. package/build/design/schemas.js +369 -0
  163. package/build/design/schemas.js.map +1 -0
  164. package/build/design/types.d.ts +199 -0
  165. package/build/design/types.d.ts.map +1 -0
  166. package/build/design/types.js +2 -0
  167. package/build/design/types.js.map +1 -0
  168. package/build/dev/consts.d.ts +32 -0
  169. package/build/dev/consts.d.ts.map +1 -0
  170. package/build/dev/consts.js +33 -0
  171. package/build/dev/consts.js.map +1 -0
  172. package/build/dev/index.d.ts +4 -0
  173. package/build/dev/index.d.ts.map +1 -0
  174. package/build/dev/index.js +3 -0
  175. package/build/dev/index.js.map +1 -0
  176. package/build/dev/schemas.d.ts +15 -0
  177. package/build/dev/schemas.d.ts.map +1 -0
  178. package/build/dev/schemas.js +116 -0
  179. package/build/dev/schemas.js.map +1 -0
  180. package/build/dev/types.d.ts +42 -0
  181. package/build/dev/types.d.ts.map +1 -0
  182. package/build/dev/types.js +2 -0
  183. package/build/dev/types.js.map +1 -0
  184. package/build/execution/consts.d.ts +36 -0
  185. package/build/execution/consts.d.ts.map +1 -0
  186. package/build/execution/consts.js +37 -0
  187. package/build/execution/consts.js.map +1 -0
  188. package/build/execution/index.d.ts +3 -0
  189. package/build/execution/index.d.ts.map +1 -0
  190. package/build/execution/index.js +2 -0
  191. package/build/execution/index.js.map +1 -0
  192. package/build/execution/types.d.ts +50 -0
  193. package/build/execution/types.d.ts.map +1 -0
  194. package/build/execution/types.js +2 -0
  195. package/build/execution/types.js.map +1 -0
  196. package/build/index.d.ts +22 -0
  197. package/build/index.d.ts.map +1 -0
  198. package/build/index.js +21 -0
  199. package/build/index.js.map +1 -0
  200. package/build/integrity/consts.d.ts +226 -0
  201. package/build/integrity/consts.d.ts.map +1 -0
  202. package/build/integrity/consts.js +401 -0
  203. package/build/integrity/consts.js.map +1 -0
  204. package/build/integrity/index.d.ts +4 -0
  205. package/build/integrity/index.d.ts.map +1 -0
  206. package/build/integrity/index.js +3 -0
  207. package/build/integrity/index.js.map +1 -0
  208. package/build/integrity/types.d.ts +35 -0
  209. package/build/integrity/types.d.ts.map +1 -0
  210. package/build/integrity/types.js +2 -0
  211. package/build/integrity/types.js.map +1 -0
  212. package/build/integrity/verify.d.ts +23 -0
  213. package/build/integrity/verify.d.ts.map +1 -0
  214. package/build/integrity/verify.js +198 -0
  215. package/build/integrity/verify.js.map +1 -0
  216. package/build/metadata/consts.d.ts +101 -0
  217. package/build/metadata/consts.d.ts.map +1 -0
  218. package/build/metadata/consts.js +104 -0
  219. package/build/metadata/consts.js.map +1 -0
  220. package/build/metadata/index.d.ts +3 -0
  221. package/build/metadata/index.d.ts.map +1 -0
  222. package/build/metadata/index.js +3 -0
  223. package/build/metadata/index.js.map +1 -0
  224. package/build/metadata/types.d.ts +286 -0
  225. package/build/metadata/types.d.ts.map +1 -0
  226. package/build/metadata/types.js +39 -0
  227. package/build/metadata/types.js.map +1 -0
  228. package/build/moderation/consts.d.ts +58 -0
  229. package/build/moderation/consts.d.ts.map +1 -0
  230. package/build/moderation/consts.js +60 -0
  231. package/build/moderation/consts.js.map +1 -0
  232. package/build/moderation/index.d.ts +5 -0
  233. package/build/moderation/index.d.ts.map +1 -0
  234. package/build/moderation/index.js +4 -0
  235. package/build/moderation/index.js.map +1 -0
  236. package/build/moderation/schemas.d.ts +19 -0
  237. package/build/moderation/schemas.d.ts.map +1 -0
  238. package/build/moderation/schemas.js +26 -0
  239. package/build/moderation/schemas.js.map +1 -0
  240. package/build/moderation/types.d.ts +64 -0
  241. package/build/moderation/types.d.ts.map +1 -0
  242. package/build/moderation/types.js +2 -0
  243. package/build/moderation/types.js.map +1 -0
  244. package/build/moderation/utils.d.ts +21 -0
  245. package/build/moderation/utils.d.ts.map +1 -0
  246. package/build/moderation/utils.js +31 -0
  247. package/build/moderation/utils.js.map +1 -0
  248. package/build/preview/consts.d.ts +10 -0
  249. package/build/preview/consts.d.ts.map +1 -0
  250. package/build/preview/consts.js +11 -0
  251. package/build/preview/consts.js.map +1 -0
  252. package/build/preview/index.d.ts +3 -0
  253. package/build/preview/index.d.ts.map +1 -0
  254. package/build/preview/index.js +2 -0
  255. package/build/preview/index.js.map +1 -0
  256. package/build/preview/types.d.ts +60 -0
  257. package/build/preview/types.d.ts.map +1 -0
  258. package/build/preview/types.js +2 -0
  259. package/build/preview/types.js.map +1 -0
  260. package/build/scaffold/consts.d.ts +25 -0
  261. package/build/scaffold/consts.d.ts.map +1 -0
  262. package/build/scaffold/consts.js +26 -0
  263. package/build/scaffold/consts.js.map +1 -0
  264. package/build/scaffold/helpers.d.ts +35 -0
  265. package/build/scaffold/helpers.d.ts.map +1 -0
  266. package/build/scaffold/helpers.js +54 -0
  267. package/build/scaffold/helpers.js.map +1 -0
  268. package/build/scaffold/index.d.ts +5 -0
  269. package/build/scaffold/index.d.ts.map +1 -0
  270. package/build/scaffold/index.js +4 -0
  271. package/build/scaffold/index.js.map +1 -0
  272. package/build/scaffold/schemas.d.ts +5 -0
  273. package/build/scaffold/schemas.d.ts.map +1 -0
  274. package/build/scaffold/schemas.js +273 -0
  275. package/build/scaffold/schemas.js.map +1 -0
  276. package/build/scaffold/types.d.ts +144 -0
  277. package/build/scaffold/types.d.ts.map +1 -0
  278. package/build/scaffold/types.js +2 -0
  279. package/build/scaffold/types.js.map +1 -0
  280. package/build/skills/catalogue.d.ts +47 -0
  281. package/build/skills/catalogue.d.ts.map +1 -0
  282. package/build/skills/catalogue.js +1566 -0
  283. package/build/skills/catalogue.js.map +1 -0
  284. package/build/skills/consts.d.ts +104 -0
  285. package/build/skills/consts.d.ts.map +1 -0
  286. package/build/skills/consts.js +170 -0
  287. package/build/skills/consts.js.map +1 -0
  288. package/build/skills/index.d.ts +4 -0
  289. package/build/skills/index.d.ts.map +1 -0
  290. package/build/skills/index.js +4 -0
  291. package/build/skills/index.js.map +1 -0
  292. package/build/skills/roles.d.ts +52 -0
  293. package/build/skills/roles.d.ts.map +1 -0
  294. package/build/skills/roles.js +256 -0
  295. package/build/skills/roles.js.map +1 -0
  296. package/build/slot/consts.d.ts +305 -0
  297. package/build/slot/consts.d.ts.map +1 -0
  298. package/build/slot/consts.js +376 -0
  299. package/build/slot/consts.js.map +1 -0
  300. package/build/slot/helpers.d.ts +25 -0
  301. package/build/slot/helpers.d.ts.map +1 -0
  302. package/build/slot/helpers.js +27 -0
  303. package/build/slot/helpers.js.map +1 -0
  304. package/build/slot/index.d.ts +6 -0
  305. package/build/slot/index.d.ts.map +1 -0
  306. package/build/slot/index.js +5 -0
  307. package/build/slot/index.js.map +1 -0
  308. package/build/slot/layout.d.ts +72 -0
  309. package/build/slot/layout.d.ts.map +1 -0
  310. package/build/slot/layout.js +82 -0
  311. package/build/slot/layout.js.map +1 -0
  312. package/build/slot/schemas.d.ts +12 -0
  313. package/build/slot/schemas.d.ts.map +1 -0
  314. package/build/slot/schemas.js +43 -0
  315. package/build/slot/schemas.js.map +1 -0
  316. package/build/slot/types.d.ts +147 -0
  317. package/build/slot/types.d.ts.map +1 -0
  318. package/build/slot/types.js +2 -0
  319. package/build/slot/types.js.map +1 -0
  320. package/build/topology/card.d.ts +23 -0
  321. package/build/topology/card.d.ts.map +1 -0
  322. package/build/topology/card.js +95 -0
  323. package/build/topology/card.js.map +1 -0
  324. package/build/topology/consts.d.ts +32 -0
  325. package/build/topology/consts.d.ts.map +1 -0
  326. package/build/topology/consts.js +55 -0
  327. package/build/topology/consts.js.map +1 -0
  328. package/build/topology/helpers.d.ts +44 -0
  329. package/build/topology/helpers.d.ts.map +1 -0
  330. package/build/topology/helpers.js +112 -0
  331. package/build/topology/helpers.js.map +1 -0
  332. package/build/topology/index.d.ts +5 -0
  333. package/build/topology/index.d.ts.map +1 -0
  334. package/build/topology/index.js +4 -0
  335. package/build/topology/index.js.map +1 -0
  336. package/build/topology/types.d.ts +83 -0
  337. package/build/topology/types.d.ts.map +1 -0
  338. package/build/topology/types.js +2 -0
  339. package/build/topology/types.js.map +1 -0
  340. package/build/types.d.ts +88 -0
  341. package/build/types.d.ts.map +1 -0
  342. package/build/types.js +2 -0
  343. package/build/types.js.map +1 -0
  344. package/build/ux/consts.d.ts +5 -0
  345. package/build/ux/consts.d.ts.map +1 -0
  346. package/build/ux/consts.js +6 -0
  347. package/build/ux/consts.js.map +1 -0
  348. package/build/ux/index.d.ts +4 -0
  349. package/build/ux/index.d.ts.map +1 -0
  350. package/build/ux/index.js +3 -0
  351. package/build/ux/index.js.map +1 -0
  352. package/build/ux/schemas.d.ts +8 -0
  353. package/build/ux/schemas.d.ts.map +1 -0
  354. package/build/ux/schemas.js +91 -0
  355. package/build/ux/schemas.js.map +1 -0
  356. package/build/ux/types.d.ts +21 -0
  357. package/build/ux/types.d.ts.map +1 -0
  358. package/build/ux/types.js +2 -0
  359. package/build/ux/types.js.map +1 -0
  360. package/package.json +71 -0
  361. package/src/agent/index.ts +4 -0
  362. package/src/agent/memory.ts +16 -0
  363. package/src/agent/spectator/consts.ts +10 -0
  364. package/src/agent/spectator/index.ts +3 -0
  365. package/src/agent/spectator/types.ts +14 -0
  366. package/src/agent/types.ts +10 -0
  367. package/src/areas/consts.ts +112 -0
  368. package/src/areas/index.ts +3 -0
  369. package/src/areas/types.ts +29 -0
  370. package/src/ba/consts.ts +40 -0
  371. package/src/ba/helpers.ts +93 -0
  372. package/src/ba/index.ts +5 -0
  373. package/src/ba/schemas.ts +196 -0
  374. package/src/ba/types.ts +125 -0
  375. package/src/blueprint/case.ts +272 -0
  376. package/src/blueprint/consts.ts +11 -0
  377. package/src/blueprint/index.ts +6 -0
  378. package/src/blueprint/resolve.ts +133 -0
  379. package/src/blueprint/schemas.ts +44 -0
  380. package/src/blueprint/types.ts +204 -0
  381. package/src/branding.ts +34 -0
  382. package/src/connect/consts.ts +441 -0
  383. package/src/connect/entrypoints.ts +291 -0
  384. package/src/connect/errors.ts +91 -0
  385. package/src/connect/index.ts +7 -0
  386. package/src/connect/ops.ts +208 -0
  387. package/src/connect/references.ts +89 -0
  388. package/src/connect/schemas.ts +384 -0
  389. package/src/connect/types.ts +456 -0
  390. package/src/consts.ts +34 -0
  391. package/src/convert/consts.ts +672 -0
  392. package/src/convert/helpers.ts +340 -0
  393. package/src/convert/index.ts +10 -0
  394. package/src/convert/schemas.ts +663 -0
  395. package/src/convert/types.ts +741 -0
  396. package/src/design/consts.ts +26 -0
  397. package/src/design/helpers.ts +255 -0
  398. package/src/design/index.ts +5 -0
  399. package/src/design/runtime.ts +142 -0
  400. package/src/design/schemas.ts +384 -0
  401. package/src/design/types.ts +191 -0
  402. package/src/dev/consts.ts +35 -0
  403. package/src/dev/index.ts +4 -0
  404. package/src/dev/schemas.ts +124 -0
  405. package/src/dev/types.ts +47 -0
  406. package/src/execution/consts.ts +37 -0
  407. package/src/execution/index.ts +3 -0
  408. package/src/execution/types.ts +55 -0
  409. package/src/index.ts +22 -0
  410. package/src/integrity/consts.ts +477 -0
  411. package/src/integrity/index.ts +3 -0
  412. package/src/integrity/types.ts +37 -0
  413. package/src/integrity/verify.ts +221 -0
  414. package/src/metadata/consts.ts +118 -0
  415. package/src/metadata/index.ts +3 -0
  416. package/src/metadata/types.ts +310 -0
  417. package/src/moderation/consts.ts +59 -0
  418. package/src/moderation/index.ts +4 -0
  419. package/src/moderation/schemas.ts +28 -0
  420. package/src/moderation/types.ts +68 -0
  421. package/src/moderation/utils.ts +35 -0
  422. package/src/preview/consts.ts +9 -0
  423. package/src/preview/index.ts +3 -0
  424. package/src/preview/types.ts +79 -0
  425. package/src/scaffold/consts.ts +26 -0
  426. package/src/scaffold/helpers.ts +84 -0
  427. package/src/scaffold/index.ts +4 -0
  428. package/src/scaffold/schemas.ts +283 -0
  429. package/src/scaffold/types.ts +118 -0
  430. package/src/skills/catalogue.ts +1617 -0
  431. package/src/skills/consts.ts +183 -0
  432. package/src/skills/index.ts +4 -0
  433. package/src/skills/roles.ts +299 -0
  434. package/src/slot/consts.ts +393 -0
  435. package/src/slot/helpers.ts +34 -0
  436. package/src/slot/index.ts +5 -0
  437. package/src/slot/layout.ts +141 -0
  438. package/src/slot/schemas.ts +46 -0
  439. package/src/slot/types.ts +164 -0
  440. package/src/topology/card.ts +106 -0
  441. package/src/topology/consts.ts +59 -0
  442. package/src/topology/helpers.ts +138 -0
  443. package/src/topology/index.ts +5 -0
  444. package/src/topology/types.ts +86 -0
  445. package/src/types.ts +104 -0
  446. package/src/ux/consts.ts +5 -0
  447. package/src/ux/index.ts +4 -0
  448. package/src/ux/schemas.ts +97 -0
  449. package/src/ux/types.ts +25 -0
  450. package/tests/connect-convert.spec.ts +161 -0
  451. package/tests/convert.spec.ts +318 -0
  452. package/tests/design.spec.ts +136 -0
  453. package/tsconfig.json +16 -0
@@ -0,0 +1,97 @@
1
+ import type { JSONSchemaType } from "ajv"
2
+ import type { UXScreenList, UXComponentList, UXScreenToComponent, UXTransition, UXTransitionList } from "./types.js"
3
+ import { UXTransitionType } from "./consts.js"
4
+
5
+ export const UXScreenListSchema: JSONSchemaType<UXScreenList> = {
6
+ type: "object",
7
+ title: "UXScreenList",
8
+ description: "Object with screen list",
9
+ properties: {
10
+ screens: {
11
+ type: "array",
12
+ items: {
13
+ type: "string",
14
+ description: "Technical screen name, no spaces, kebab-case notation with slashes allowed"
15
+ },
16
+ description: "List of screens"
17
+ },
18
+ },
19
+ required: ["screens"],
20
+ additionalProperties: false,
21
+ }
22
+
23
+ export const UXComponentListSchema: JSONSchemaType<UXComponentList> = {
24
+ type: "object",
25
+ title: "UXComponentList",
26
+ description: "Object with component list",
27
+ properties: {
28
+ components: {
29
+ type: "array",
30
+ items: {
31
+ type: "string",
32
+ description: "Technical component name, no spaces, kebab-case notation with slashes allowed"
33
+ },
34
+ description: "List of components"
35
+ },
36
+ },
37
+ required: ["components"],
38
+ additionalProperties: false,
39
+ }
40
+
41
+ export const UXScreenToComponentSchema: JSONSchemaType<UXScreenToComponent> = {
42
+ type: "object",
43
+ properties: {},
44
+ additionalProperties: {
45
+ type: "array",
46
+ items: {
47
+ type: "string",
48
+ },
49
+ },
50
+ required: []
51
+ }
52
+
53
+ export const UXTransitionSchema: JSONSchemaType<UXTransition> = {
54
+ type: "object",
55
+ title: "UXTransition",
56
+ description: "Transition between screens or components during interaction",
57
+ properties: {
58
+ from: {
59
+ type: "string",
60
+ description: "Initial screen or component"
61
+ },
62
+ to: {
63
+ type: "string",
64
+ description: "Final screen or component"
65
+ },
66
+ initiator: {
67
+ type: "string",
68
+ description: "Component that initiated the transition"
69
+ },
70
+ action: {
71
+ type: "string",
72
+ description: "Action that triggered the transition"
73
+ },
74
+ type: {
75
+ type: "string",
76
+ enum: Object.values(UXTransitionType),
77
+ description: "Transition happens between (type level of transition)"
78
+ }
79
+ },
80
+ required: ["from", "to", "initiator", "action", "type"],
81
+ additionalProperties: false,
82
+ }
83
+
84
+ export const UXTransitionListSchema: JSONSchemaType<UXTransitionList> = {
85
+ type: "object",
86
+ title: "UXTransitionList",
87
+ description: "Object with transition list",
88
+ properties: {
89
+ transitions: {
90
+ type: "array",
91
+ items: UXTransitionSchema,
92
+ description: "Transitions"
93
+ },
94
+ },
95
+ required: ["transitions"],
96
+ additionalProperties: false,
97
+ }
@@ -0,0 +1,25 @@
1
+ import type { UXTransitionType } from "./consts.js"
2
+
3
+ export interface UXScreenList {
4
+ screens: string[]
5
+ }
6
+
7
+ export interface UXComponentList {
8
+ components: string[]
9
+ }
10
+
11
+ export interface UXScreenToComponent {
12
+ [screen: string]: string[]
13
+ }
14
+
15
+ export interface UXTransition {
16
+ from: string
17
+ to: string
18
+ initiator: string
19
+ action: string
20
+ type: UXTransitionType
21
+ }
22
+
23
+ export interface UXTransitionList {
24
+ transitions: UXTransition[]
25
+ }
@@ -0,0 +1,161 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import Ajv from 'ajv'
3
+ import addFormats from 'ajv-formats'
4
+ import { RouteMethod } from '@owlmeans/route'
5
+ import { connect, ConnectInquiryKind, ConnectJobKind, ConnectOpKind } from '../src/connect/consts.js'
6
+ import { connectEntrypoints } from '../src/connect/entrypoints.js'
7
+ import { connectRef } from '../src/connect/references.js'
8
+ import {
9
+ ConnectCapabilitiesSchema, ConnectConvertCreateBodySchema, ConnectConvertProceedBodySchema,
10
+ ConnectInquiryParamsSchema, ConnectPipelineResumeBodySchema, InquiryAnswerSchema
11
+ } from '../src/connect/schemas.js'
12
+ import { ConnectExecutor } from '../src/connect/consts.js'
13
+ import { InquiryKind } from '@owlmeans/llm-common'
14
+ import { ConversionDecision, OriginKind } from '../src/convert/consts.js'
15
+
16
+ const compiler = () => addFormats(new Ajv({ strict: false }))
17
+
18
+ const entrypoints = () => connectEntrypoints({
19
+ guard: 'test-guard',
20
+ gate: { alias: 'test-gate', params: ['id'] },
21
+ localLlm: { alias: 'test-paid-llm', params: ['id'] },
22
+ updateBase: 'test:update:base',
23
+ })
24
+
25
+ const entrypointOf = (alias: string) => {
26
+ const found = entrypoints().find(item => item.alias === alias)
27
+ expect(found, alias).toBeDefined()
28
+
29
+ return found!
30
+ }
31
+
32
+ /** The immutable declaration a route model wraps — path, method and parent as written. */
33
+ const routeOf = (alias: string) => entrypointOf(alias).route.route
34
+
35
+ describe('viable-common - the conversion additions to the connector contract', () => {
36
+ test('every new schema compiles', () => {
37
+ const ajv = compiler()
38
+ const schemas: [string, object][] = [
39
+ ['InquiryAnswerSchema', InquiryAnswerSchema],
40
+ ['ConnectInquiryParamsSchema', ConnectInquiryParamsSchema],
41
+ ['ConnectConvertCreateBodySchema', ConnectConvertCreateBodySchema],
42
+ ['ConnectConvertProceedBodySchema', ConnectConvertProceedBodySchema],
43
+ ['ConnectPipelineResumeBodySchema', ConnectPipelineResumeBodySchema],
44
+ ['ConnectCapabilitiesSchema', ConnectCapabilitiesSchema],
45
+ ]
46
+
47
+ for (const [name, schema] of schemas) {
48
+ expect(() => ajv.compile(schema as never), name).not.toThrow()
49
+ }
50
+ })
51
+
52
+ test('an answer carries one value or several, and declining is a value too', () => {
53
+ const validate = compiler().compile(InquiryAnswerSchema as never)
54
+
55
+ expect(validate({ inquiryId: 'q1', value: 'yes' })).toBe(true)
56
+ expect(validate({ inquiryId: 'q1', value: ['a', 'b'] })).toBe(true)
57
+ expect(validate({ inquiryId: 'q1', declined: true })).toBe(true)
58
+ expect(validate({ inquiryId: 'q1', text: 'because the origin has two admin roles' })).toBe(true)
59
+ expect(validate({ value: 'orphaned' })).toBe(false)
60
+ })
61
+
62
+ test('a resume carries the answers the parked run asked for', () => {
63
+ const validate = compiler().compile(ConnectPipelineResumeBodySchema as never)
64
+
65
+ expect(validate({ answers: { q1: { inquiryId: 'q1', value: 'yes' } } })).toBe(true)
66
+ expect(validate({})).toBe(true)
67
+ })
68
+
69
+ test('the convert bodies accept an origin and a decision', () => {
70
+ const ajv = compiler()
71
+ const create = ajv.compile(ConnectConvertCreateBodySchema as never)
72
+ const proceed = ajv.compile(ConnectConvertProceedBodySchema as never)
73
+
74
+ expect(create({
75
+ name: 'Deskflow',
76
+ origin: { kind: OriginKind.Github, repoUrl: 'https://github.com/acme/deskflow' },
77
+ })).toBe(true)
78
+ // A local target the connector is already attached to fetches nothing.
79
+ expect(create({})).toBe(true)
80
+ expect(proceed({ decision: ConversionDecision.Extract })).toBe(true)
81
+ expect(proceed({ decision: 'teleport' })).toBe(false)
82
+ })
83
+
84
+ test('capabilities accept an executor kind this platform has never heard of', () => {
85
+ // The SDK and the platform ship separately: a connector built against a newer package must not
86
+ // be refused a session because it advertises one more capability than this platform knows.
87
+ const validate = compiler().compile(ConnectCapabilitiesSchema as never)
88
+
89
+ expect(validate({
90
+ harness: 'claude-code',
91
+ tiers: {},
92
+ subagents: true,
93
+ effortControl: true,
94
+ executors: [ConnectExecutor.Files, ConnectExecutor.Human, 'telepathy'],
95
+ })).toBe(true)
96
+ })
97
+
98
+ test('the conversion and generated-file routes are declared, at their paths and methods', () => {
99
+ const expected: [string, string, RouteMethod][] = [
100
+ [connect.convert.create, '/convert', RouteMethod.POST],
101
+ [connect.convert.check, '/convert/:id/check', RouteMethod.GET],
102
+ [connect.convert.start, '/convert/:id/start', RouteMethod.POST],
103
+ [connect.convert.proceed, '/convert/:id/proceed', RouteMethod.POST],
104
+ [connect.convert.cancel, '/convert/:id/cancel', RouteMethod.POST],
105
+ [connect.convert.status, '/convert/:id', RouteMethod.GET],
106
+ [connect.convert.purge, '/convert/:id/purge', RouteMethod.POST],
107
+ [connect.inquiry.answer, '/project/:id/inquiry/:inquiryId', RouteMethod.POST],
108
+ [connect.project.converterLlm, '/project/:id/converter-llm', RouteMethod.POST],
109
+ [connect.files.list, '/project/:id/files', RouteMethod.GET],
110
+ ]
111
+
112
+ for (const [alias, path, method] of expected) {
113
+ const route = routeOf(alias)
114
+ expect(route.path, alias).toBe(path)
115
+ expect(route.method, alias).toBe(method)
116
+ }
117
+ })
118
+
119
+ test('every conversion route has the typed reference used by connector adapters', () => {
120
+ expect(connectRef.convert.create.alias).toBe(connect.convert.create)
121
+ expect(connectRef.convert.check.alias).toBe(connect.convert.check)
122
+ expect(connectRef.convert.start.alias).toBe(connect.convert.start)
123
+ expect(connectRef.convert.proceed.alias).toBe(connect.convert.proceed)
124
+ expect(connectRef.convert.cancel.alias).toBe(connect.convert.cancel)
125
+ expect(connectRef.convert.status.alias).toBe(connect.convert.status)
126
+ expect(connectRef.convert.purge.alias).toBe(connect.convert.purge)
127
+ expect(connectRef.inquiry.answer.alias).toBe(connect.inquiry.answer)
128
+ expect(connectRef.project.converterLlm.alias).toBe(connect.project.converterLlm)
129
+ expect(connectRef.files.list.alias).toBe(connect.files.list)
130
+ })
131
+
132
+ test('the conversion routes hang under the connector base and carry no paid gate', () => {
133
+ // Delegated inference is the DEFAULT for a conversion, not an experimental capability — so
134
+ // unlike `project.llm`, nothing here sits behind the local-LLM gate.
135
+ expect(entrypointOf(connect.project.llm).gate).toBe('test-paid-llm')
136
+
137
+ const gated = [...Object.values(connect.convert), connect.inquiry.answer,
138
+ connect.project.converterLlm]
139
+ for (const alias of gated) {
140
+ expect(entrypointOf(alias).gate, alias).toBeUndefined()
141
+ expect(routeOf(alias).parent, alias).toBe(connect.base)
142
+ }
143
+ })
144
+
145
+ test('the vocabulary a conversion adds to the connector is declared', () => {
146
+ expect(ConnectOpKind.Inquiry).toBe('inquiry')
147
+ expect(ConnectExecutor.Human).toBe('human')
148
+ expect(Object.values(ConnectInquiryKind)).toEqual(['choice', 'text', 'confirm'])
149
+ // The platform's mapper is a widening rather than a translation table, which is only true
150
+ // while the two enums stay byte-identical — `manager-api` does not depend on the model
151
+ // runtime, so nothing else in the stack would notice one of them gaining a fourth shape.
152
+ expect(Object.values(ConnectInquiryKind)).toEqual(Object.values(InquiryKind))
153
+ // One job kind per stage: each stage is its own pipeline run, looked up by the alias its kind
154
+ // names, so a single `convert` kind would match whichever run row happened to be newest.
155
+ expect(ConnectJobKind.ConvertIntake).toBe('convert-intake')
156
+ expect(ConnectJobKind.ConvertAnalysis).toBe('convert-analysis')
157
+ expect(ConnectJobKind.ConvertExtraction).toBe('convert-extraction')
158
+ expect(ConnectJobKind.ConvertImplementation).toBe('convert-implementation')
159
+ expect(ConnectJobKind.ConvertPurge).toBe('convert-purge')
160
+ })
161
+ })
@@ -0,0 +1,318 @@
1
+ import { describe, expect, test } from 'bun:test'
2
+ import Ajv from 'ajv'
3
+ import addFormats from 'ajv-formats'
4
+ import * as convert from '../src/convert/index.js'
5
+ import * as barrel from '../src/index.js'
6
+ import {
7
+ CONVERSION_ARTIFACTS, CONVERSION_DIR, CONVERSION_DOCS, CONVERSION_MEMORY, ConversionStage,
8
+ EntropyClass, FileClass, SizeClass, STACK_FAMILY, StackId, TAXONOMY_ORDER, TaxonomyKind
9
+ } from '../src/convert/index.js'
10
+ import {
11
+ binaryByExtension, canEnter, decisionFor, entropyClassOf, fileClassOf, isOriginPath, originPath,
12
+ sizeClassOf, stageAfter, storyComplexity
13
+ } from '../src/convert/helpers.js'
14
+ import { HISTORY_FILE } from '../src/metadata/consts.js'
15
+ import {
16
+ conversionStoryDoc, CONVERTED_ORIGIN_DIR, ConversionDecision
17
+ } from '../src/convert/consts.js'
18
+
19
+ /**
20
+ * Every `*Schema` a module exports.
21
+ *
22
+ * The two structural walks below are asked of the PACKAGE barrel rather than of the conversion
23
+ * one, although this file is the conversion's. Neither failure they catch is particular to a
24
+ * conversion — a draft-04 tuple and a bare `nullable` refuse wherever the schema reaches a
25
+ * provider or a collection validator — and a walk over `src/convert/` alone would let the same
26
+ * shape through in a design, a slot or a connector schema. Compiling is still asserted over the
27
+ * conversion barrel, where its `> 10` floor means something.
28
+ */
29
+ const schemasOf = (module: Record<string, unknown>): [string, object][] =>
30
+ Object.entries(module)
31
+ .filter(([name, value]) =>
32
+ name.endsWith('Schema') && typeof value === 'object' && value !== null)
33
+ .map(([name, value]) => [name, value as object])
34
+
35
+ /**
36
+ * Walk a schema and report every subschema that says `nullable` without saying what type it is.
37
+ *
38
+ * Ajv refuses that combination, and these schemas are compiled at route registration and re-applied
39
+ * as collection validators — so the refusal takes down whatever compiled it, at boot, rather than
40
+ * failing the one call that would have carried the value.
41
+ */
42
+ const nullableWithoutType = (node: unknown, at: string, found: string[] = []): string[] => {
43
+ if (Array.isArray(node)) {
44
+ node.forEach((item, index) => nullableWithoutType(item, `${at}[${index}]`, found))
45
+
46
+ return found
47
+ }
48
+ if (typeof node !== 'object' || node === null) return found
49
+
50
+ const schema = node as Record<string, unknown>
51
+ if (schema.nullable === true && schema.type == null) found.push(at)
52
+ for (const [key, value] of Object.entries(schema)) {
53
+ nullableWithoutType(value, `${at}.${key}`, found)
54
+ }
55
+
56
+ return found
57
+ }
58
+
59
+ /**
60
+ * Walk a schema and report every `nullable: true` whose `enum` does not list `null`.
61
+ *
62
+ * `nullable` and `enum` are separate Ajv keywords and are checked independently, so that pair
63
+ * widens the TYPE check to admit `null` and then refuses the very same value by enum — the field
64
+ * can only ever be OMITTED, never sent empty. Nothing fails at compile time and nothing fails for
65
+ * a caller that leaves the key out, which is why it survives review: it surfaces only as the one
66
+ * caller that spells absence as `null`.
67
+ */
68
+ const nullableEnumWithoutNull = (node: unknown, at: string, found: string[] = []): string[] => {
69
+ if (Array.isArray(node)) {
70
+ node.forEach((item, index) => nullableEnumWithoutNull(item, `${at}[${index}]`, found))
71
+
72
+ return found
73
+ }
74
+ if (typeof node !== 'object' || node === null) return found
75
+
76
+ const schema = node as Record<string, unknown>
77
+ if (schema.nullable === true && Array.isArray(schema.enum) && !schema.enum.includes(null)) {
78
+ found.push(at)
79
+ }
80
+ for (const [key, value] of Object.entries(schema)) {
81
+ nullableEnumWithoutNull(value, `${at}.${key}`, found)
82
+ }
83
+
84
+ return found
85
+ }
86
+
87
+ /** Walk a schema and report every `items` written as an array of subschemas. */
88
+ const tupleItems = (node: unknown, at: string, found: string[] = []): string[] => {
89
+ if (Array.isArray(node)) {
90
+ node.forEach((item, index) => tupleItems(item, `${at}[${index}]`, found))
91
+
92
+ return found
93
+ }
94
+ if (typeof node !== 'object' || node === null) return found
95
+
96
+ const schema = node as Record<string, unknown>
97
+ if (Array.isArray(schema.items)) found.push(`${at}.items`)
98
+ for (const [key, value] of Object.entries(schema)) {
99
+ tupleItems(value, `${at}.${key}`, found)
100
+ }
101
+
102
+ return found
103
+ }
104
+
105
+ describe('viable-common - the conversion contracts', () => {
106
+ test('every exported schema compiles', () => {
107
+ const ajv = addFormats(new Ajv({ strict: false }))
108
+ const schemas = schemasOf(convert)
109
+
110
+ expect(schemas.length).toBeGreaterThan(10)
111
+ for (const [name, schema] of schemas) {
112
+ expect(() => ajv.compile(schema as never), name).not.toThrow()
113
+ }
114
+ })
115
+
116
+ test('no schema says nullable without saying of what type', () => {
117
+ const offenders = schemasOf(barrel)
118
+ .flatMap(([name, schema]) => nullableWithoutType(schema, name))
119
+
120
+ expect(offenders).toEqual([])
121
+ })
122
+
123
+ test('every nullable enum carries `null` among its values', () => {
124
+ // Asked of the package barrel for the same reason the walk above is: the pair refuses wherever
125
+ // it is written, and a model answer, a wire body and a stored record each pay for it
126
+ // differently. `StackConfirmation.alternative` is the model answer — the intake's ONE stack
127
+ // call is retried three times and then discarded (`llm:retry-exceeded`) because OpenAI's
128
+ // structured output writes an unset optional as `null` rather than dropping the key.
129
+ // `ConverterProjectLlmBody.llmMode` is the wire body, where `null` MEANS "inherit the
130
+ // profile's setting" and has no other spelling at all.
131
+ const offenders = schemasOf(barrel)
132
+ .flatMap(([name, schema]) => nullableEnumWithoutNull(schema, name))
133
+
134
+ expect(offenders).toEqual([])
135
+ })
136
+
137
+ test('a nullable enum accepts null under Ajv, and still refuses an unknown member', () => {
138
+ // The structural walk above says how the schema is written; this says what Ajv does with it.
139
+ const ajv = addFormats(new Ajv({ strict: false }))
140
+ const validate = ajv.compile(convert.StackConfirmationSchema as never)
141
+ const answer = (alternative: unknown) => ({
142
+ stack: StackId.NextJs, case: 'spa-api', confidence: 0.9, reason: 'the manifest says so',
143
+ alternative,
144
+ })
145
+
146
+ expect(validate(answer(null))).toBe(true)
147
+ expect(validate(answer(StackId.ReactSpa))).toBe(true)
148
+ expect(validate(answer('cobol'))).toBe(false)
149
+ })
150
+
151
+ test('no schema declares `items` as a tuple', () => {
152
+ // Ajv accepts the draft-04 tuple form and `JSONSchemaType` demands it for a tuple TYPE, so
153
+ // nothing here fails until the schema reaches a provider: a structured-output endpoint takes
154
+ // `items` as a schema object and answers `400 … is not of type 'object', 'boolean'` for an
155
+ // array of them. One tuple inside `OriginProof` therefore refused the purpose inference, every
156
+ // taxonomy layer, the access model and every story's proofs — a whole conversion's worth of
157
+ // calls, each failing with a message about the wrong thing.
158
+ const offenders = schemasOf(barrel).flatMap(([name, schema]) => tupleItems(schema, name))
159
+
160
+ expect(offenders).toEqual([])
161
+ })
162
+
163
+ test('STACK_FAMILY answers for every stack there is', () => {
164
+ // A partial map with a fall-through default is the target-role bug again: nothing fails, and
165
+ // every unlisted member is simply reported as belonging to another language.
166
+ for (const stack of Object.values(StackId)) {
167
+ expect(STACK_FAMILY[stack], stack).toBeDefined()
168
+ }
169
+ expect(Object.keys(STACK_FAMILY)).toHaveLength(Object.values(StackId).length)
170
+ })
171
+
172
+ test('TAXONOMY_ORDER is a permutation of the layers, not a subset', () => {
173
+ const kinds = Object.values(TaxonomyKind)
174
+
175
+ expect(TAXONOMY_ORDER).toHaveLength(kinds.length)
176
+ expect([...TAXONOMY_ORDER].sort()).toEqual([...kinds].sort())
177
+ })
178
+
179
+ test('canEnter allows a retry and the next stage, and refuses a skip', () => {
180
+ expect(canEnter(ConversionStage.Intake, ConversionStage.Intake)).toBe(true)
181
+ expect(canEnter(ConversionStage.Intake, ConversionStage.Analysis)).toBe(true)
182
+ // Extraction reads the documents analysis wrote; entering it from intake runs it against
183
+ // documents that were never produced.
184
+ expect(canEnter(ConversionStage.Intake, ConversionStage.Extraction)).toBe(false)
185
+ expect(canEnter(ConversionStage.Extraction, ConversionStage.Analysis)).toBe(false)
186
+ })
187
+
188
+ test('the stage ladder ends at implementation rather than falling off it', () => {
189
+ expect(stageAfter(ConversionStage.Intake)).toBe(ConversionStage.Analysis)
190
+ expect(stageAfter(ConversionStage.Implementation)).toBe(ConversionStage.Implementation)
191
+ expect(decisionFor(ConversionStage.Extraction)).toBe(ConversionDecision.Implement)
192
+ expect(decisionFor(ConversionStage.Implementation)).toBe(ConversionDecision.Leave)
193
+ })
194
+
195
+ test('every conversion document lives under the conversion directory', () => {
196
+ for (const doc of CONVERSION_DOCS) {
197
+ expect(doc.startsWith(`${CONVERSION_DIR}/`), doc).toBe(true)
198
+ }
199
+ expect(conversionStoryDoc('US-ABC12').startsWith(`${CONVERSION_DIR}/`)).toBe(true)
200
+ for (const node of CONVERSION_MEMORY) {
201
+ expect(node.startsWith('.agents/memory/'), node).toBe(true)
202
+ }
203
+ })
204
+
205
+ test('what a conversion owns is one list both wipes read', () => {
206
+ // The relocation keeps these at the root and the initialization one step later must leave the
207
+ // same set alone. Two hand-kept copies drifted once already, and the cost was every document
208
+ // the analysis had paid for: kept by the move, deleted by the install.
209
+ expect(CONVERSION_ARTIFACTS).toEqual([CONVERSION_DIR, ...CONVERSION_MEMORY])
210
+ })
211
+
212
+ test('origin paths round-trip and never nest', () => {
213
+ expect(originPath('src/index.ts')).toBe(`${CONVERTED_ORIGIN_DIR}/src/index.ts`)
214
+ expect(isOriginPath(originPath('src/index.ts'))).toBe(true)
215
+ expect(isOriginPath(CONVERTED_ORIGIN_DIR)).toBe(true)
216
+ expect(isOriginPath('sources/web/src/index.ts')).toBe(false)
217
+ // A caller that has lost track of which side of the move it holds must not be able to produce
218
+ // `__viable_converted/__viable_converted/`.
219
+ expect(originPath(originPath('src/index.ts'))).toBe(`${CONVERTED_ORIGIN_DIR}/src/index.ts`)
220
+ })
221
+
222
+ test('sizeClassOf splits on the declared bounds', () => {
223
+ expect(sizeClassOf(0)).toBe(SizeClass.Tiny)
224
+ expect(sizeClassOf(2_047)).toBe(SizeClass.Tiny)
225
+ expect(sizeClassOf(2_048)).toBe(SizeClass.Small)
226
+ expect(sizeClassOf(32_767)).toBe(SizeClass.Small)
227
+ expect(sizeClassOf(32_768)).toBe(SizeClass.Medium)
228
+ expect(sizeClassOf(262_144)).toBe(SizeClass.Large)
229
+ expect(sizeClassOf(2_097_152)).toBe(SizeClass.Huge)
230
+ })
231
+
232
+ test('entropyClassOf tells prose from a minified bundle from binary', () => {
233
+ expect(entropyClassOf('export const answer = 42\nconsole.log(answer)\n'))
234
+ .toBe(EntropyClass.Text)
235
+ // Printable throughout, and not something a model can reason over: no line breaks, no indent.
236
+ expect(entropyClassOf(`const a=1,b=2,c=3;${'x'.repeat(400)}`)).toBe(EntropyClass.Dense)
237
+ expect(entropyClassOf(`‰PNG${'ÿ'.repeat(40)}`))
238
+ .toBe(EntropyClass.Opaque)
239
+ })
240
+
241
+ test('fileClassOf reads the path before the extension', () => {
242
+ expect(fileClassOf('sources/api/src/index.ts', 'ts')).toBe(FileClass.Source)
243
+ expect(fileClassOf('node_modules/left-pad/index.js', 'js')).toBe(FileClass.Generated)
244
+ expect(fileClassOf('tests/api.spec.ts', 'ts')).toBe(FileClass.Test)
245
+ expect(fileClassOf('seed/users.json', 'json')).toBe(FileClass.Data)
246
+ expect(fileClassOf('package.json', 'json')).toBe(FileClass.Manifest)
247
+ expect(fileClassOf('bun.lock', 'lock')).toBe(FileClass.Lock)
248
+ })
249
+
250
+ test('a seed or dump location reclassifies a payload and never a program', () => {
251
+ // Asked before the test check and the extension table, the seed/dump rule answered `Data` for
252
+ // all four of these — real source, out of the census's source budget on a word in its path.
253
+ expect(fileClassOf('tests/fixtures/user.ts', 'ts')).toBe(FileClass.Test)
254
+ expect(fileClassOf('src/seedUsers.ts', 'ts')).toBe(FileClass.Source)
255
+ expect(fileClassOf('src/exportReport.ts', 'ts')).toBe(FileClass.Source)
256
+ expect(fileClassOf('bin/cli.ts', 'ts')).toBe(FileClass.Source)
257
+ // What the rule is for: a payload, and the one language that is a dump as often as it is code.
258
+ expect(fileClassOf('fixtures/orders.csv', 'csv')).toBe(FileClass.Data)
259
+ expect(fileClassOf('db/dumps/2024.sql', 'sql')).toBe(FileClass.Data)
260
+ expect(fileClassOf('db/migrations/0001_init.sql', 'sql')).toBe(FileClass.Source)
261
+ })
262
+
263
+ test('storyComplexity scales on what the extraction actually found', () => {
264
+ const proof = (proofs: number, algorithms: number) => ({
265
+ proofs: Array.from({ length: proofs }, () => ({ path: 'a.ts', note: 'n' })),
266
+ algorithms: Array.from({ length: algorithms }, () => ({
267
+ name: 'rule', steps: ['one'], proof: { path: 'a.ts', note: 'n' },
268
+ })),
269
+ })
270
+
271
+ expect(storyComplexity(proof(2, 0))).toBe(1)
272
+ expect(storyComplexity(proof(5, 0))).toBe(1.5)
273
+ expect(storyComplexity(proof(2, 1))).toBe(1.5)
274
+ expect(storyComplexity(proof(2, 2))).toBe(2)
275
+ })
276
+
277
+ test('the source-list exclusions carry the metadata trees and the origin', () => {
278
+ expect(convert.SOURCE_LIST_EXCLUSIONS).toContain(CONVERTED_ORIGIN_DIR)
279
+ expect(convert.SOURCE_LIST_EXCLUSIONS).toContain('docs')
280
+ expect(convert.SOURCE_LIST_EXCLUSIONS).toContain('.agents')
281
+ })
282
+
283
+ test('both pipeline prefixes are declared, since a conversion runs on two layers', () => {
284
+ expect(convert.CONVERSION_PIPELINE_PREFIXES).toEqual(['vib:project:convert:', 'vib:convert:'])
285
+ })
286
+
287
+ test('a census walk skips only what is never the repository', () => {
288
+ // The three executors answer the SAME question about the same tree, so a directory skipped by
289
+ // one and walked by another means one repository has two different totals. `dist`, `build` and
290
+ // `.next` were in one of the three: ordinary directory names an origin may keep sources in.
291
+ expect(convert.CENSUS_SKIP_DIRS).toEqual(['node_modules', '.git'])
292
+ })
293
+
294
+ test('the relocate keep set names what belongs to the slot rather than to the project', () => {
295
+ expect(convert.RELOCATE_ALWAYS_KEEP).toEqual(['.git', 'sandbox-meta.json', HISTORY_FILE])
296
+ })
297
+
298
+ test('binaryByExtension answers a tail it knows and defers on one it does not', () => {
299
+ // The verdict a probe alone gets wrong: a small `.ico` with no NUL in its first bytes reads as
300
+ // text, which is how a census on a laptop and the same census in the slot disagreed.
301
+ expect(binaryByExtension('assets/logo.ico')).toBe(true)
302
+ expect(binaryByExtension('assets/logo.PNG')).toBe(true)
303
+ expect(binaryByExtension('sources/web/src/app.tsx')).toBe(false)
304
+ expect(binaryByExtension('archive.tar.gz')).toBe(true)
305
+ // Nothing to go on, so the caller has to read it: no tail at all, a dotfile (which
306
+ // `path.extname` also answers nothing for), and a tail neither list carries.
307
+ expect(binaryByExtension('Makefile')).toBeNull()
308
+ expect(binaryByExtension('.env')).toBeNull()
309
+ expect(binaryByExtension('data.parquet')).toBeNull()
310
+ // The tail of the last SEGMENT, never of the path.
311
+ expect(binaryByExtension('release.d/manifest')).toBeNull()
312
+ })
313
+
314
+ test('a head read is bounded, and the binary probe is smaller than the head', () => {
315
+ expect(convert.BINARY_PROBE_BYTES).toBeLessThan(convert.CENSUS_HEAD_BYTES)
316
+ expect(convert.CENSUS_MAX_HEAD_BYTES).toBeGreaterThan(convert.CENSUS_HEAD_BYTES)
317
+ })
318
+ })