@owlmeans/viable-common 0.0.43 → 0.0.45

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 (708) hide show
  1. package/README.md +3 -3
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/agent-presentation/SKILL.md +4 -4
  4. package/agent-meta/skills/viable-common/SKILL.md +59 -36
  5. package/build/agent/consts.d.ts +58 -0
  6. package/build/agent/consts.d.ts.map +1 -0
  7. package/build/agent/consts.js +63 -0
  8. package/build/agent/consts.js.map +1 -0
  9. package/build/agent/consts.local.d.ts +21 -0
  10. package/build/agent/consts.local.d.ts.map +1 -0
  11. package/build/agent/consts.local.js +44 -0
  12. package/build/agent/consts.local.js.map +1 -0
  13. package/build/agent/index.d.ts +2 -0
  14. package/build/agent/index.d.ts.map +1 -1
  15. package/build/agent/index.js +1 -0
  16. package/build/agent/index.js.map +1 -1
  17. package/build/agent/presentation/types.d.ts +21 -0
  18. package/build/agent/presentation/types.d.ts.map +1 -0
  19. package/build/agent/presentation/types.js.map +1 -0
  20. package/build/agent/presentation.d.ts +12 -94
  21. package/build/agent/presentation.d.ts.map +1 -1
  22. package/build/agent/presentation.js +218 -299
  23. package/build/agent/presentation.js.map +1 -1
  24. package/build/agent/types.d.ts +30 -0
  25. package/build/agent/types.d.ts.map +1 -1
  26. package/build/agent/types.local.d.ts +4 -0
  27. package/build/agent/types.local.d.ts.map +1 -0
  28. package/build/agent/types.local.js +2 -0
  29. package/build/agent/types.local.js.map +1 -0
  30. package/build/areas/consts.d.ts +5 -0
  31. package/build/areas/consts.d.ts.map +1 -1
  32. package/build/areas/consts.js +4 -0
  33. package/build/areas/consts.js.map +1 -1
  34. package/build/areas/index.d.ts +1 -0
  35. package/build/areas/index.d.ts.map +1 -1
  36. package/build/areas/index.js.map +1 -1
  37. package/build/areas/tenancy/types.d.ts +23 -0
  38. package/build/areas/tenancy/types.d.ts.map +1 -0
  39. package/build/areas/tenancy/types.js +2 -0
  40. package/build/areas/tenancy/types.js.map +1 -0
  41. package/build/areas/tenancy.d.ts +6 -50
  42. package/build/areas/tenancy.d.ts.map +1 -1
  43. package/build/areas/tenancy.js +21 -31
  44. package/build/areas/tenancy.js.map +1 -1
  45. package/build/areas/types.d.ts +32 -0
  46. package/build/areas/types.d.ts.map +1 -1
  47. package/build/ba/connecting/types.d.ts +45 -0
  48. package/build/ba/connecting/types.d.ts.map +1 -0
  49. package/build/ba/connecting/types.js +2 -0
  50. package/build/ba/connecting/types.js.map +1 -0
  51. package/build/ba/connecting.d.ts +4 -0
  52. package/build/ba/connecting.d.ts.map +1 -0
  53. package/build/ba/connecting.js +47 -0
  54. package/build/ba/connecting.js.map +1 -0
  55. package/build/ba/helpers.d.ts +4 -39
  56. package/build/ba/helpers.d.ts.map +1 -1
  57. package/build/ba/helpers.js +5 -79
  58. package/build/ba/helpers.js.map +1 -1
  59. package/build/ba/index.d.ts +2 -0
  60. package/build/ba/index.d.ts.map +1 -1
  61. package/build/ba/index.js +1 -0
  62. package/build/ba/index.js.map +1 -1
  63. package/build/ba/types.d.ts +1 -1
  64. package/build/ba/types.d.ts.map +1 -1
  65. package/build/blueprint/consts.d.ts +41 -0
  66. package/build/blueprint/consts.d.ts.map +1 -1
  67. package/build/blueprint/consts.js +51 -0
  68. package/build/blueprint/consts.js.map +1 -1
  69. package/build/blueprint/consts.local.d.ts +2 -0
  70. package/build/blueprint/consts.local.d.ts.map +1 -0
  71. package/build/blueprint/consts.local.js +3 -0
  72. package/build/blueprint/consts.local.js.map +1 -0
  73. package/build/blueprint/index.d.ts +1 -0
  74. package/build/blueprint/index.d.ts.map +1 -1
  75. package/build/blueprint/index.js +1 -0
  76. package/build/blueprint/index.js.map +1 -1
  77. package/build/blueprint/types.d.ts +3 -52
  78. package/build/blueprint/types.d.ts.map +1 -1
  79. package/build/blueprint/types.js +1 -65
  80. package/build/blueprint/types.js.map +1 -1
  81. package/build/blueprint/utils.d.ts +11 -0
  82. package/build/blueprint/utils.d.ts.map +1 -0
  83. package/build/blueprint/utils.js +16 -0
  84. package/build/blueprint/utils.js.map +1 -0
  85. package/build/branding.d.ts +0 -8
  86. package/build/branding.d.ts.map +1 -1
  87. package/build/branding.js +0 -16
  88. package/build/branding.js.map +1 -1
  89. package/build/connect/branding/types.d.ts +28 -0
  90. package/build/connect/branding/types.d.ts.map +1 -0
  91. package/build/connect/branding/types.js +2 -0
  92. package/build/connect/branding/types.js.map +1 -0
  93. package/build/connect/consts.d.ts +2 -10
  94. package/build/connect/consts.d.ts.map +1 -1
  95. package/build/connect/consts.js +2 -23
  96. package/build/connect/consts.js.map +1 -1
  97. package/build/connect/conversion/types.d.ts +93 -0
  98. package/build/connect/conversion/types.d.ts.map +1 -0
  99. package/build/connect/conversion/types.js +2 -0
  100. package/build/connect/conversion/types.js.map +1 -0
  101. package/build/connect/entrypoints/types.d.ts +30 -0
  102. package/build/connect/entrypoints/types.d.ts.map +1 -0
  103. package/build/connect/entrypoints/types.js +2 -0
  104. package/build/connect/entrypoints/types.js.map +1 -0
  105. package/build/connect/entrypoints.d.ts +61 -92
  106. package/build/connect/entrypoints.d.ts.map +1 -1
  107. package/build/connect/entrypoints.js +5 -2
  108. package/build/connect/entrypoints.js.map +1 -1
  109. package/build/connect/errors/types.d.ts +20 -0
  110. package/build/connect/errors/types.d.ts.map +1 -0
  111. package/build/connect/errors/types.js +2 -0
  112. package/build/connect/errors/types.js.map +1 -0
  113. package/build/connect/errors.d.ts +32 -0
  114. package/build/connect/errors.d.ts.map +1 -1
  115. package/build/connect/errors.js +65 -0
  116. package/build/connect/errors.js.map +1 -1
  117. package/build/connect/index.d.ts +13 -2
  118. package/build/connect/index.d.ts.map +1 -1
  119. package/build/connect/index.js +1 -0
  120. package/build/connect/index.js.map +1 -1
  121. package/build/connect/kit/types.d.ts +52 -0
  122. package/build/connect/kit/types.d.ts.map +1 -0
  123. package/build/connect/kit/types.js +2 -0
  124. package/build/connect/{types.js.map → kit/types.js.map} +1 -1
  125. package/build/connect/model-tier/types.d.ts +16 -0
  126. package/build/connect/model-tier/types.d.ts.map +1 -0
  127. package/build/connect/model-tier/types.js +2 -0
  128. package/build/connect/model-tier/types.js.map +1 -0
  129. package/build/connect/model-tier.d.ts +4 -0
  130. package/build/connect/model-tier.d.ts.map +1 -0
  131. package/build/connect/model-tier.js +21 -0
  132. package/build/connect/model-tier.js.map +1 -0
  133. package/build/connect/{ops.d.ts → ops/types.d.ts} +13 -4
  134. package/build/connect/ops/types.d.ts.map +1 -0
  135. package/build/connect/ops/types.js +2 -0
  136. package/build/connect/ops/types.js.map +1 -0
  137. package/build/connect/pipeline/types.d.ts +39 -0
  138. package/build/connect/pipeline/types.d.ts.map +1 -0
  139. package/build/connect/pipeline/types.js +2 -0
  140. package/build/connect/pipeline/types.js.map +1 -0
  141. package/build/connect/project/types.d.ts +127 -0
  142. package/build/connect/project/types.d.ts.map +1 -0
  143. package/build/connect/project/types.js +2 -0
  144. package/build/connect/project/types.js.map +1 -0
  145. package/build/connect/references/types.d.ts +157 -0
  146. package/build/connect/references/types.d.ts.map +1 -0
  147. package/build/connect/references/types.js +2 -0
  148. package/build/connect/references/types.js.map +1 -0
  149. package/build/connect/references/types.local.d.ts +5 -0
  150. package/build/connect/references/types.local.d.ts.map +1 -0
  151. package/build/connect/references/types.local.js +2 -0
  152. package/build/connect/references/types.local.js.map +1 -0
  153. package/build/connect/references.d.ts +1 -153
  154. package/build/connect/references.d.ts.map +1 -1
  155. package/build/connect/references.js.map +1 -1
  156. package/build/connect/schemas.d.ts +9 -5
  157. package/build/connect/schemas.d.ts.map +1 -1
  158. package/build/connect/schemas.js +10 -3
  159. package/build/connect/schemas.js.map +1 -1
  160. package/build/connect/session/types.d.ts +73 -0
  161. package/build/connect/session/types.d.ts.map +1 -0
  162. package/build/connect/session/types.js +2 -0
  163. package/build/connect/session/types.js.map +1 -0
  164. package/build/connect/settings/types.d.ts +48 -0
  165. package/build/connect/settings/types.d.ts.map +1 -0
  166. package/build/connect/settings/types.js +2 -0
  167. package/build/connect/settings/types.js.map +1 -0
  168. package/build/consts.d.ts +8 -0
  169. package/build/consts.d.ts.map +1 -1
  170. package/build/consts.js +16 -0
  171. package/build/consts.js.map +1 -1
  172. package/build/convert/analysis/types.d.ts +93 -0
  173. package/build/convert/analysis/types.d.ts.map +1 -0
  174. package/build/convert/analysis/types.js +2 -0
  175. package/build/convert/analysis/types.js.map +1 -0
  176. package/build/convert/census/consts.local.d.ts +55 -0
  177. package/build/convert/census/consts.local.d.ts.map +1 -0
  178. package/build/convert/census/consts.local.js +104 -0
  179. package/build/convert/census/consts.local.js.map +1 -0
  180. package/build/convert/census/types.d.ts +176 -0
  181. package/build/convert/census/types.d.ts.map +1 -0
  182. package/build/convert/census/types.js +2 -0
  183. package/build/convert/census/types.js.map +1 -0
  184. package/build/convert/census.d.ts +4 -0
  185. package/build/convert/census.d.ts.map +1 -0
  186. package/build/convert/census.js +83 -0
  187. package/build/convert/census.js.map +1 -0
  188. package/build/convert/consts.d.ts +4 -12
  189. package/build/convert/consts.d.ts.map +1 -1
  190. package/build/convert/consts.js +4 -3
  191. package/build/convert/consts.js.map +1 -1
  192. package/build/convert/detection/types.d.ts +67 -0
  193. package/build/convert/detection/types.d.ts.map +1 -0
  194. package/build/convert/detection/types.js +2 -0
  195. package/build/convert/detection/types.js.map +1 -0
  196. package/build/convert/docs/types.d.ts +129 -0
  197. package/build/convert/docs/types.d.ts.map +1 -0
  198. package/build/convert/docs/types.js +2 -0
  199. package/build/convert/docs/types.js.map +1 -0
  200. package/build/convert/docs.d.ts +4 -0
  201. package/build/convert/docs.d.ts.map +1 -0
  202. package/build/convert/docs.js +9 -0
  203. package/build/convert/docs.js.map +1 -0
  204. package/build/convert/estimate/types.d.ts +77 -0
  205. package/build/convert/estimate/types.d.ts.map +1 -0
  206. package/build/convert/estimate/types.js +2 -0
  207. package/build/convert/estimate/types.js.map +1 -0
  208. package/build/convert/estimate.d.ts +11 -0
  209. package/build/convert/estimate.d.ts.map +1 -0
  210. package/build/convert/estimate.js +18 -0
  211. package/build/convert/estimate.js.map +1 -0
  212. package/build/convert/helpers.d.ts +14 -78
  213. package/build/convert/helpers.d.ts.map +1 -1
  214. package/build/convert/helpers.js +27 -300
  215. package/build/convert/helpers.js.map +1 -1
  216. package/build/convert/index.d.ts +15 -0
  217. package/build/convert/index.d.ts.map +1 -1
  218. package/build/convert/index.js +6 -0
  219. package/build/convert/index.js.map +1 -1
  220. package/build/convert/origin/types.d.ts +41 -0
  221. package/build/convert/origin/types.d.ts.map +1 -0
  222. package/build/convert/origin/types.js +2 -0
  223. package/build/convert/origin/types.js.map +1 -0
  224. package/build/convert/origin.d.ts +4 -0
  225. package/build/convert/origin.d.ts.map +1 -0
  226. package/build/convert/origin.js +25 -0
  227. package/build/convert/origin.js.map +1 -0
  228. package/build/convert/record/types.d.ts +98 -0
  229. package/build/convert/record/types.d.ts.map +1 -0
  230. package/build/convert/record/types.js +2 -0
  231. package/build/convert/record/types.js.map +1 -0
  232. package/build/convert/schemas.d.ts +7 -6
  233. package/build/convert/schemas.d.ts.map +1 -1
  234. package/build/convert/schemas.js +1 -5
  235. package/build/convert/schemas.js.map +1 -1
  236. package/build/convert/stage/types.d.ts +27 -0
  237. package/build/convert/stage/types.d.ts.map +1 -0
  238. package/build/convert/stage/types.js +2 -0
  239. package/build/convert/stage/types.js.map +1 -0
  240. package/build/convert/stage.d.ts +4 -0
  241. package/build/convert/stage.d.ts.map +1 -0
  242. package/build/convert/stage.js +25 -0
  243. package/build/convert/stage.js.map +1 -0
  244. package/build/convert/taxonomy/types.d.ts +71 -0
  245. package/build/convert/taxonomy/types.d.ts.map +1 -0
  246. package/build/convert/taxonomy/types.js +2 -0
  247. package/build/convert/taxonomy/types.js.map +1 -0
  248. package/build/convert/types.d.ts +1 -648
  249. package/build/convert/types.d.ts.map +1 -1
  250. package/build/convert/utils.d.ts +5 -0
  251. package/build/convert/utils.d.ts.map +1 -0
  252. package/build/convert/utils.js +6 -0
  253. package/build/convert/utils.js.map +1 -0
  254. package/build/design/consts.d.ts +37 -0
  255. package/build/design/consts.d.ts.map +1 -1
  256. package/build/design/consts.js +44 -8
  257. package/build/design/consts.js.map +1 -1
  258. package/build/design/helpers.d.ts +9 -49
  259. package/build/design/helpers.d.ts.map +1 -1
  260. package/build/design/helpers.js +17 -224
  261. package/build/design/helpers.js.map +1 -1
  262. package/build/design/index.d.ts +3 -0
  263. package/build/design/index.d.ts.map +1 -1
  264. package/build/design/index.js +1 -0
  265. package/build/design/index.js.map +1 -1
  266. package/build/design/runtime/types.d.ts +16 -0
  267. package/build/design/runtime/types.d.ts.map +1 -0
  268. package/build/design/runtime/types.js +2 -0
  269. package/build/design/runtime/types.js.map +1 -0
  270. package/build/design/runtime.d.ts +8 -105
  271. package/build/design/runtime.d.ts.map +1 -1
  272. package/build/design/runtime.js +13 -48
  273. package/build/design/runtime.js.map +1 -1
  274. package/build/design/schemas.d.ts +1 -9
  275. package/build/design/schemas.d.ts.map +1 -1
  276. package/build/design/schemas.js +1 -1
  277. package/build/design/schemas.js.map +1 -1
  278. package/build/design/story/types.d.ts +67 -0
  279. package/build/design/story/types.d.ts.map +1 -0
  280. package/build/design/story/types.js +2 -0
  281. package/build/design/story/types.js.map +1 -0
  282. package/build/design/story.d.ts +4 -0
  283. package/build/design/story.d.ts.map +1 -0
  284. package/build/design/story.js +184 -0
  285. package/build/design/story.js.map +1 -0
  286. package/build/design/types.d.ts +75 -1
  287. package/build/design/types.d.ts.map +1 -1
  288. package/build/dev/schemas.d.ts.map +1 -1
  289. package/build/dev/schemas.js.map +1 -1
  290. package/build/dev/types.local.d.ts +5 -0
  291. package/build/dev/types.local.d.ts.map +1 -0
  292. package/build/dev/types.local.js +2 -0
  293. package/build/dev/types.local.js.map +1 -0
  294. package/build/integrity/consts.d.ts +0 -117
  295. package/build/integrity/consts.d.ts.map +1 -1
  296. package/build/integrity/consts.js +0 -281
  297. package/build/integrity/consts.js.map +1 -1
  298. package/build/integrity/consts.local.d.ts +5 -0
  299. package/build/integrity/consts.local.d.ts.map +1 -0
  300. package/build/integrity/consts.local.js +5 -0
  301. package/build/integrity/consts.local.js.map +1 -0
  302. package/build/integrity/index.d.ts +5 -0
  303. package/build/integrity/index.d.ts.map +1 -1
  304. package/build/integrity/index.js +3 -0
  305. package/build/integrity/index.js.map +1 -1
  306. package/build/integrity/layout/consts.d.ts +59 -0
  307. package/build/integrity/layout/consts.d.ts.map +1 -0
  308. package/build/integrity/layout/consts.js +66 -0
  309. package/build/integrity/layout/consts.js.map +1 -0
  310. package/build/integrity/layout/consts.local.d.ts +18 -0
  311. package/build/integrity/layout/consts.local.d.ts.map +1 -0
  312. package/build/integrity/layout/consts.local.js +176 -0
  313. package/build/integrity/layout/consts.local.js.map +1 -0
  314. package/build/integrity/layout/types.d.ts +35 -0
  315. package/build/integrity/layout/types.d.ts.map +1 -0
  316. package/build/integrity/layout/types.js +2 -0
  317. package/build/integrity/layout/types.js.map +1 -0
  318. package/build/integrity/layout.d.ts +4 -0
  319. package/build/integrity/layout.d.ts.map +1 -0
  320. package/build/integrity/layout.js +25 -0
  321. package/build/integrity/layout.js.map +1 -0
  322. package/build/integrity/types.d.ts +36 -2
  323. package/build/integrity/types.d.ts.map +1 -1
  324. package/build/integrity/utils.d.ts +13 -0
  325. package/build/integrity/utils.d.ts.map +1 -0
  326. package/build/integrity/utils.js +12 -0
  327. package/build/integrity/utils.js.map +1 -0
  328. package/build/integrity/verify/types.d.ts +26 -0
  329. package/build/integrity/verify/types.d.ts.map +1 -0
  330. package/build/integrity/verify/types.js +2 -0
  331. package/build/integrity/verify/types.js.map +1 -0
  332. package/build/integrity/verify.d.ts +5 -19
  333. package/build/integrity/verify.d.ts.map +1 -1
  334. package/build/integrity/verify.js +165 -175
  335. package/build/integrity/verify.js.map +1 -1
  336. package/build/intent/consts.d.ts +16 -0
  337. package/build/intent/consts.d.ts.map +1 -1
  338. package/build/intent/consts.js +63 -0
  339. package/build/intent/consts.js.map +1 -1
  340. package/build/intent/entrypoints.d.ts +2 -12
  341. package/build/intent/entrypoints.d.ts.map +1 -1
  342. package/build/intent/entrypoints.js.map +1 -1
  343. package/build/intent/index.d.ts +0 -1
  344. package/build/intent/index.d.ts.map +1 -1
  345. package/build/intent/index.js +0 -1
  346. package/build/intent/index.js.map +1 -1
  347. package/build/intent/types.d.ts +13 -0
  348. package/build/intent/types.d.ts.map +1 -1
  349. package/build/metadata/consts.d.ts +33 -0
  350. package/build/metadata/consts.d.ts.map +1 -1
  351. package/build/metadata/consts.js +37 -0
  352. package/build/metadata/consts.js.map +1 -1
  353. package/build/metadata/types.d.ts +1 -33
  354. package/build/metadata/types.d.ts.map +1 -1
  355. package/build/metadata/types.js +1 -38
  356. package/build/metadata/types.js.map +1 -1
  357. package/build/moderation/index.d.ts +2 -0
  358. package/build/moderation/index.d.ts.map +1 -1
  359. package/build/moderation/index.js +1 -0
  360. package/build/moderation/index.js.map +1 -1
  361. package/build/moderation/utils.d.ts +3 -15
  362. package/build/moderation/utils.d.ts.map +1 -1
  363. package/build/moderation/utils.js +5 -30
  364. package/build/moderation/utils.js.map +1 -1
  365. package/build/moderation/verdict/types.d.ts +24 -0
  366. package/build/moderation/verdict/types.d.ts.map +1 -0
  367. package/build/moderation/verdict/types.js +2 -0
  368. package/build/moderation/verdict/types.js.map +1 -0
  369. package/build/moderation/verdict.d.ts +4 -0
  370. package/build/moderation/verdict.d.ts.map +1 -0
  371. package/build/moderation/verdict.js +21 -0
  372. package/build/moderation/verdict.js.map +1 -0
  373. package/build/planning/card/types.d.ts +42 -0
  374. package/build/planning/card/types.d.ts.map +1 -0
  375. package/build/planning/card/types.js +2 -0
  376. package/build/planning/card/types.js.map +1 -0
  377. package/build/planning/card.d.ts +4 -0
  378. package/build/planning/card.d.ts.map +1 -0
  379. package/build/planning/card.js +51 -0
  380. package/build/planning/card.js.map +1 -0
  381. package/build/planning/consts.d.ts +13 -1
  382. package/build/planning/consts.d.ts.map +1 -1
  383. package/build/planning/consts.js +13 -0
  384. package/build/planning/consts.js.map +1 -1
  385. package/build/planning/helpers.d.ts +11 -37
  386. package/build/planning/helpers.d.ts.map +1 -1
  387. package/build/planning/helpers.js +24 -103
  388. package/build/planning/helpers.js.map +1 -1
  389. package/build/planning/index.d.ts +5 -1
  390. package/build/planning/index.d.ts.map +1 -1
  391. package/build/planning/index.js +2 -1
  392. package/build/planning/index.js.map +1 -1
  393. package/build/planning/landing/types.d.ts +16 -0
  394. package/build/planning/landing/types.d.ts.map +1 -0
  395. package/build/planning/landing/types.js +2 -0
  396. package/build/planning/landing/types.js.map +1 -0
  397. package/build/planning/landing.d.ts +5 -22
  398. package/build/planning/landing.d.ts.map +1 -1
  399. package/build/planning/landing.js +21 -35
  400. package/build/planning/landing.js.map +1 -1
  401. package/build/planning/schemas.d.ts +33 -0
  402. package/build/planning/schemas.d.ts.map +1 -1
  403. package/build/planning/schemas.js +173 -4
  404. package/build/planning/schemas.js.map +1 -1
  405. package/build/planning/spec/types.d.ts +22 -0
  406. package/build/planning/spec/types.d.ts.map +1 -0
  407. package/build/planning/spec/types.js +2 -0
  408. package/build/planning/spec/types.js.map +1 -0
  409. package/build/planning/spec.d.ts +4 -0
  410. package/build/planning/spec.d.ts.map +1 -0
  411. package/build/planning/spec.js +30 -0
  412. package/build/planning/spec.js.map +1 -0
  413. package/build/planning/types.d.ts +6 -5
  414. package/build/planning/types.d.ts.map +1 -1
  415. package/build/preview/consts.d.ts +3 -1
  416. package/build/preview/consts.d.ts.map +1 -1
  417. package/build/preview/consts.js +2 -0
  418. package/build/preview/consts.js.map +1 -1
  419. package/build/preview/types.d.ts +17 -2
  420. package/build/preview/types.d.ts.map +1 -1
  421. package/build/scaffold/consts.d.ts +40 -1
  422. package/build/scaffold/consts.d.ts.map +1 -1
  423. package/build/scaffold/consts.js +52 -0
  424. package/build/scaffold/consts.js.map +1 -1
  425. package/build/scaffold/helpers.d.ts +5 -30
  426. package/build/scaffold/helpers.d.ts.map +1 -1
  427. package/build/scaffold/helpers.js +9 -53
  428. package/build/scaffold/helpers.js.map +1 -1
  429. package/build/scaffold/index.d.ts +4 -0
  430. package/build/scaffold/index.d.ts.map +1 -1
  431. package/build/scaffold/index.js +2 -0
  432. package/build/scaffold/index.js.map +1 -1
  433. package/build/scaffold/landing/types.d.ts +48 -0
  434. package/build/scaffold/landing/types.d.ts.map +1 -0
  435. package/build/scaffold/landing/types.js +2 -0
  436. package/build/scaffold/landing/types.js.map +1 -0
  437. package/build/scaffold/landing.d.ts +4 -0
  438. package/build/scaffold/landing.d.ts.map +1 -0
  439. package/build/scaffold/landing.js +95 -0
  440. package/build/scaffold/landing.js.map +1 -0
  441. package/build/scaffold/schemas.d.ts +3 -2
  442. package/build/scaffold/schemas.d.ts.map +1 -1
  443. package/build/scaffold/schemas.js +177 -7
  444. package/build/scaffold/schemas.js.map +1 -1
  445. package/build/scaffold/share/types.d.ts +35 -0
  446. package/build/scaffold/share/types.d.ts.map +1 -0
  447. package/build/scaffold/share/types.js +2 -0
  448. package/build/scaffold/share/types.js.map +1 -0
  449. package/build/scaffold/share.d.ts +4 -0
  450. package/build/scaffold/share.d.ts.map +1 -0
  451. package/build/scaffold/share.js +42 -0
  452. package/build/scaffold/share.js.map +1 -0
  453. package/build/scaffold/types.d.ts +114 -2
  454. package/build/scaffold/types.d.ts.map +1 -1
  455. package/build/skills/consts.d.ts +42 -0
  456. package/build/skills/consts.d.ts.map +1 -1
  457. package/build/skills/consts.js +43 -0
  458. package/build/skills/consts.js.map +1 -1
  459. package/build/skills/index.d.ts +0 -1
  460. package/build/skills/index.d.ts.map +1 -1
  461. package/build/skills/index.js +0 -1
  462. package/build/skills/index.js.map +1 -1
  463. package/build/slot/command/types.d.ts +21 -0
  464. package/build/slot/command/types.d.ts.map +1 -0
  465. package/build/slot/command/types.js +2 -0
  466. package/build/slot/command/types.js.map +1 -0
  467. package/build/slot/command.d.ts +4 -0
  468. package/build/slot/command.d.ts.map +1 -0
  469. package/build/slot/command.js +31 -0
  470. package/build/slot/command.js.map +1 -0
  471. package/build/slot/consts.d.ts +7 -13
  472. package/build/slot/consts.d.ts.map +1 -1
  473. package/build/slot/consts.js +10 -36
  474. package/build/slot/consts.js.map +1 -1
  475. package/build/slot/helpers.d.ts +3 -22
  476. package/build/slot/helpers.d.ts.map +1 -1
  477. package/build/slot/helpers.js +5 -26
  478. package/build/slot/helpers.js.map +1 -1
  479. package/build/slot/index.d.ts +6 -0
  480. package/build/slot/index.d.ts.map +1 -1
  481. package/build/slot/index.js +3 -0
  482. package/build/slot/index.js.map +1 -1
  483. package/build/slot/layout/types.d.ts +17 -0
  484. package/build/slot/layout/types.d.ts.map +1 -0
  485. package/build/slot/layout/types.js +2 -0
  486. package/build/slot/layout/types.js.map +1 -0
  487. package/build/slot/layout.d.ts +5 -66
  488. package/build/slot/layout.d.ts.map +1 -1
  489. package/build/slot/layout.js +13 -27
  490. package/build/slot/layout.js.map +1 -1
  491. package/build/slot/origin/types.d.ts +23 -0
  492. package/build/slot/origin/types.d.ts.map +1 -0
  493. package/build/slot/origin/types.js +2 -0
  494. package/build/slot/origin/types.js.map +1 -0
  495. package/build/slot/origin.d.ts +4 -0
  496. package/build/slot/origin.d.ts.map +1 -0
  497. package/build/slot/origin.js +15 -0
  498. package/build/slot/origin.js.map +1 -0
  499. package/build/slot/types.d.ts +55 -1
  500. package/build/slot/types.d.ts.map +1 -1
  501. package/build/slot/utils.d.ts +6 -0
  502. package/build/slot/utils.d.ts.map +1 -0
  503. package/build/slot/utils.js +6 -0
  504. package/build/slot/utils.js.map +1 -0
  505. package/build/topology/card/types.d.ts +21 -0
  506. package/build/topology/card/types.d.ts.map +1 -0
  507. package/build/topology/card/types.js +2 -0
  508. package/build/topology/card/types.js.map +1 -0
  509. package/build/topology/card.d.ts +7 -19
  510. package/build/topology/card.d.ts.map +1 -1
  511. package/build/topology/card.js +84 -89
  512. package/build/topology/card.js.map +1 -1
  513. package/build/topology/consts.local.d.ts +4 -0
  514. package/build/topology/consts.local.d.ts.map +1 -0
  515. package/build/topology/consts.local.js +4 -0
  516. package/build/topology/consts.local.js.map +1 -0
  517. package/build/topology/helpers.d.ts +7 -33
  518. package/build/topology/helpers.d.ts.map +1 -1
  519. package/build/topology/helpers.js +15 -111
  520. package/build/topology/helpers.js.map +1 -1
  521. package/build/topology/index.d.ts +3 -0
  522. package/build/topology/index.d.ts.map +1 -1
  523. package/build/topology/index.js +1 -0
  524. package/build/topology/index.js.map +1 -1
  525. package/build/topology/resolve/types.d.ts +47 -0
  526. package/build/topology/resolve/types.d.ts.map +1 -0
  527. package/build/topology/resolve/types.js +2 -0
  528. package/build/topology/resolve/types.js.map +1 -0
  529. package/build/topology/resolve.d.ts +4 -0
  530. package/build/topology/resolve.d.ts.map +1 -0
  531. package/build/topology/resolve.js +89 -0
  532. package/build/topology/resolve.js.map +1 -0
  533. package/build/topology/types.d.ts +5 -0
  534. package/build/topology/types.d.ts.map +1 -1
  535. package/package.json +13 -13
  536. package/src/agent/consts.local.ts +47 -0
  537. package/src/agent/consts.ts +61 -0
  538. package/src/agent/index.ts +2 -0
  539. package/src/agent/presentation/types.ts +21 -0
  540. package/src/agent/presentation.ts +200 -309
  541. package/src/agent/types.local.ts +3 -0
  542. package/src/agent/types.ts +40 -0
  543. package/src/areas/consts.ts +7 -0
  544. package/src/areas/index.ts +1 -0
  545. package/src/areas/tenancy/types.ts +23 -0
  546. package/src/areas/tenancy.ts +26 -61
  547. package/src/areas/types.ts +31 -0
  548. package/src/ba/connecting/types.ts +45 -0
  549. package/src/ba/connecting.ts +64 -0
  550. package/src/ba/helpers.ts +8 -92
  551. package/src/ba/index.ts +2 -0
  552. package/src/ba/types.ts +1 -1
  553. package/src/blueprint/consts.local.ts +3 -0
  554. package/src/blueprint/consts.ts +52 -0
  555. package/src/blueprint/index.ts +1 -0
  556. package/src/blueprint/types.ts +4 -74
  557. package/src/blueprint/utils.ts +20 -0
  558. package/src/branding.ts +0 -17
  559. package/src/connect/branding/types.ts +29 -0
  560. package/src/connect/consts.ts +3 -22
  561. package/src/connect/conversion/types.ts +96 -0
  562. package/src/connect/entrypoints/types.ts +25 -0
  563. package/src/connect/entrypoints.ts +18 -35
  564. package/src/connect/errors/types.ts +22 -0
  565. package/src/connect/errors.ts +75 -0
  566. package/src/connect/index.ts +13 -2
  567. package/src/connect/kit/types.ts +56 -0
  568. package/src/connect/model-tier/types.ts +16 -0
  569. package/src/connect/model-tier.ts +22 -0
  570. package/src/connect/{ops.ts → ops/types.ts} +13 -3
  571. package/src/connect/pipeline/types.ts +41 -0
  572. package/src/connect/project/types.ts +127 -0
  573. package/src/connect/references/types.local.ts +5 -0
  574. package/src/connect/references/types.ts +73 -0
  575. package/src/connect/references.ts +15 -75
  576. package/src/connect/schemas.ts +19 -12
  577. package/src/connect/session/types.ts +81 -0
  578. package/src/connect/settings/types.ts +52 -0
  579. package/src/consts.ts +17 -0
  580. package/src/convert/analysis/types.ts +89 -0
  581. package/src/convert/census/consts.local.ts +120 -0
  582. package/src/convert/census/types.ts +181 -0
  583. package/src/convert/census.ts +95 -0
  584. package/src/convert/consts.ts +5 -14
  585. package/src/convert/detection/types.ts +74 -0
  586. package/src/convert/docs/types.ts +151 -0
  587. package/src/convert/docs.ts +15 -0
  588. package/src/convert/estimate/types.ts +75 -0
  589. package/src/convert/estimate.ts +19 -0
  590. package/src/convert/helpers.ts +29 -328
  591. package/src/convert/index.ts +15 -0
  592. package/src/convert/origin/types.ts +43 -0
  593. package/src/convert/origin.ts +33 -0
  594. package/src/convert/record/types.ts +105 -0
  595. package/src/convert/schemas.ts +13 -12
  596. package/src/convert/stage/types.ts +27 -0
  597. package/src/convert/stage.ts +31 -0
  598. package/src/convert/taxonomy/types.ts +74 -0
  599. package/src/convert/types.ts +5 -703
  600. package/src/convert/utils.ts +7 -0
  601. package/src/design/consts.ts +48 -0
  602. package/src/design/helpers.ts +20 -245
  603. package/src/design/index.ts +3 -0
  604. package/src/design/runtime/types.ts +14 -0
  605. package/src/design/runtime.ts +18 -116
  606. package/src/design/schemas.ts +2 -10
  607. package/src/design/story/types.ts +67 -0
  608. package/src/design/story.ts +221 -0
  609. package/src/design/types.ts +81 -1
  610. package/src/dev/schemas.ts +1 -3
  611. package/src/dev/types.local.ts +4 -0
  612. package/src/integrity/consts.local.ts +5 -0
  613. package/src/integrity/consts.ts +0 -348
  614. package/src/integrity/index.ts +5 -0
  615. package/src/integrity/layout/consts.local.ts +188 -0
  616. package/src/integrity/layout/consts.ts +79 -0
  617. package/src/integrity/layout/types.ts +35 -0
  618. package/src/integrity/layout.ts +39 -0
  619. package/src/integrity/types.ts +37 -2
  620. package/src/integrity/utils.ts +21 -0
  621. package/src/integrity/verify/types.ts +26 -0
  622. package/src/integrity/verify.ts +178 -184
  623. package/src/intent/consts.ts +67 -0
  624. package/src/intent/entrypoints.ts +2 -3
  625. package/src/intent/index.ts +0 -1
  626. package/src/intent/types.ts +10 -0
  627. package/src/metadata/consts.ts +37 -0
  628. package/src/metadata/types.ts +1 -37
  629. package/src/moderation/index.ts +2 -0
  630. package/src/moderation/utils.ts +7 -30
  631. package/src/moderation/verdict/types.ts +22 -0
  632. package/src/moderation/verdict.ts +28 -0
  633. package/src/planning/card/types.ts +44 -0
  634. package/src/planning/card.ts +77 -0
  635. package/src/planning/consts.ts +15 -2
  636. package/src/planning/helpers.ts +28 -116
  637. package/src/planning/index.ts +5 -1
  638. package/src/planning/landing/types.ts +15 -0
  639. package/src/planning/landing.ts +28 -38
  640. package/src/planning/schemas.ts +191 -4
  641. package/src/planning/spec/types.ts +22 -0
  642. package/src/planning/spec.ts +41 -0
  643. package/src/planning/types.ts +6 -6
  644. package/src/preview/consts.ts +2 -0
  645. package/src/preview/types.ts +19 -0
  646. package/src/scaffold/consts.ts +65 -1
  647. package/src/scaffold/helpers.ts +14 -80
  648. package/src/scaffold/index.ts +4 -0
  649. package/src/scaffold/landing/types.ts +48 -0
  650. package/src/scaffold/landing.ts +120 -0
  651. package/src/scaffold/schemas.ts +183 -7
  652. package/src/scaffold/share/types.ts +35 -0
  653. package/src/scaffold/share.ts +60 -0
  654. package/src/scaffold/types.ts +123 -1
  655. package/src/skills/consts.ts +46 -0
  656. package/src/skills/index.ts +0 -1
  657. package/src/slot/command/types.ts +21 -0
  658. package/src/slot/command.ts +38 -0
  659. package/src/slot/consts.ts +11 -40
  660. package/src/slot/helpers.ts +6 -31
  661. package/src/slot/index.ts +6 -0
  662. package/src/slot/layout/types.ts +17 -0
  663. package/src/slot/layout.ts +19 -77
  664. package/src/slot/origin/types.ts +23 -0
  665. package/src/slot/origin.ts +20 -0
  666. package/src/slot/types.ts +58 -1
  667. package/src/slot/utils.ts +10 -0
  668. package/src/topology/card/types.ts +21 -0
  669. package/src/topology/card.ts +85 -90
  670. package/src/topology/consts.local.ts +6 -0
  671. package/src/topology/helpers.ts +20 -125
  672. package/src/topology/index.ts +3 -0
  673. package/src/topology/resolve/types.ts +47 -0
  674. package/src/topology/resolve.ts +118 -0
  675. package/src/topology/types.ts +6 -0
  676. package/tests/blueprint.spec.ts +1 -2
  677. package/tests/branding.spec.ts +2 -2
  678. package/tests/connect-convert.spec.ts +21 -1
  679. package/tests/connect-errors.spec.ts +34 -1
  680. package/tests/convert.spec.ts +51 -52
  681. package/tests/design.spec.ts +13 -16
  682. package/tests/error-status.spec.ts +7 -1
  683. package/tests/planning.spec.ts +58 -75
  684. package/tests/presentation.spec.ts +21 -23
  685. package/tests/scaffold.spec.ts +286 -6
  686. package/tests/tenancy.spec.ts +21 -21
  687. package/build/connect/ops.d.ts.map +0 -1
  688. package/build/connect/ops.js +0 -2
  689. package/build/connect/ops.js.map +0 -1
  690. package/build/connect/types.d.ts +0 -437
  691. package/build/connect/types.d.ts.map +0 -1
  692. package/build/intent/flow.d.ts +0 -17
  693. package/build/intent/flow.d.ts.map +0 -1
  694. package/build/intent/flow.js +0 -65
  695. package/build/intent/flow.js.map +0 -1
  696. package/build/planning/flows.d.ts +0 -34
  697. package/build/planning/flows.d.ts.map +0 -1
  698. package/build/planning/flows.js +0 -174
  699. package/build/planning/flows.js.map +0 -1
  700. package/build/skills/roles.d.ts +0 -43
  701. package/build/skills/roles.d.ts.map +0 -1
  702. package/build/skills/roles.js +0 -44
  703. package/build/skills/roles.js.map +0 -1
  704. package/src/connect/types.ts +0 -466
  705. package/src/intent/flow.ts +0 -67
  706. package/src/planning/flows.ts +0 -204
  707. package/src/skills/roles.ts +0 -46
  708. /package/build/{connect → agent/presentation}/types.js +0 -0
@@ -1,335 +1,226 @@
1
- /**
2
- * A compact, runtime-free description of how an agent message should be presented.
3
- *
4
- * The server emits this with thinking events and the browser refines it as streaming output
5
- * becomes parseable. Keeping the vocabulary here prevents the two runtimes from drifting into
6
- * their own guesses about the same model response.
7
- */
8
- export enum AgentMessageCategory {
9
- Code = 'code',
10
- Diff = 'diff',
11
- Structured = 'structured',
12
- Markdown = 'markdown',
13
- Plain = 'plain',
14
- }
15
-
16
- export enum AgentCodeLanguage {
17
- ReactTsx = 'react-tsx',
18
- Css = 'css',
19
- TypeScript = 'typescript',
20
- Json = 'json',
21
- Other = 'other',
22
- }
23
-
24
- /** A semantic shape that the manager can render as a purpose-built card. */
25
- export enum AgentStructuredKind {
26
- ToolCalls = 'tool-calls',
27
- ArtifactSelection = 'artifact-selection',
28
- EntitySelection = 'entity-selection',
29
- StoryPlan = 'story-plan',
30
- ScreenPlan = 'screen-plan',
31
- ComponentPlan = 'component-plan',
32
- TransitionPlan = 'transition-plan',
33
- EntrypointSelection = 'entrypoint-selection',
34
- AccessPolicy = 'access-policy',
35
- ScaffoldPlan = 'scaffold-plan',
36
- RuntimeDecision = 'runtime-decision',
37
- CandidateRanking = 'candidate-ranking',
38
- Decision = 'decision',
39
- GenericRecord = 'generic-record',
40
- GenericList = 'generic-list',
41
- GenericValue = 'generic-value',
42
- }
43
-
44
- export enum AgentMarkdownKind {
45
- Specification = 'specification',
46
- DesignDocument = 'design-document',
47
- Documentation = 'documentation',
48
- }
49
-
50
- /** The family of specialist that produced an output, not an authorization role. */
51
- export enum AgentMessageRole {
52
- Technical = 'technical',
53
- Analytical = 'analytical',
54
- Product = 'product',
55
- Ux = 'ux',
56
- VisualDesign = 'visual-design',
57
- Architect = 'architect',
58
- Developer = 'developer',
59
- Repair = 'repair',
60
- Orchestrator = 'orchestrator',
61
- }
62
-
63
- export interface AgentCodePresentation {
64
- category: AgentMessageCategory.Code | AgentMessageCategory.Diff
65
- language: AgentCodeLanguage
66
- role: AgentMessageRole
67
- }
68
-
69
- export interface AgentStructuredPresentation {
70
- category: AgentMessageCategory.Structured
71
- structure: AgentStructuredKind
72
- role: AgentMessageRole
73
- }
74
-
75
- export interface AgentMarkdownPresentation {
76
- category: AgentMessageCategory.Markdown
77
- document: AgentMarkdownKind
78
- role: AgentMessageRole
79
- }
80
1
 
81
- export interface AgentPlainPresentation {
82
- category: AgentMessageCategory.Plain
83
- role: AgentMessageRole
84
- }
2
+ import { agentLoopActions, codeActions, documentActions, structuredActions } from './consts.local.js'
3
+ import { AgentCodeLanguage, AgentMarkdownKind, AgentMessageCategory, AgentMessageRole, AgentStructuredKind } from './consts.js'
4
+ import type { RecordValue } from './types.local.js'
5
+ import type { AgentMessageClassificationInput, AgentMessagePresentation } from './types.js'
6
+ import type { AgentPresentationHelper } from './presentation/types.js'
7
+
8
+ export const createAgentPresentationHelper = (): AgentPresentationHelper => {
9
+ const asRecord = (value: unknown): RecordValue | undefined =>
10
+ value != null && typeof value === 'object' && !Array.isArray(value)
11
+ ? value as RecordValue
12
+ : undefined
13
+
14
+ const actionOf = (input: AgentMessageClassificationInput): string => input.action?.toLowerCase() ?? ''
15
+
16
+ const sourceOf = (input: AgentMessageClassificationInput): string =>
17
+ `${input.agent ?? ''} ${input.helper ?? ''}`.toLowerCase()
18
+
19
+ const contentOf = (input: AgentMessageClassificationInput): string => input.text?.trim() ?? ''
20
+
21
+ /**
22
+ * Source extraction is an internal context-reduction pass. Its terminal tool call contains only
23
+ * line ranges, which are useful to the coder but add no useful information to a person's journal.
24
+ */
25
+ const isAgentMessageHidden = (input: AgentMessageClassificationInput): boolean =>
26
+ actionOf(input) === 'source-extract'
27
+
28
+ /** Maps the attribution that reached the event boundary to the visual specialist family. */
29
+ const agentMessageRoleOf = (input: AgentMessageClassificationInput): AgentMessageRole => {
30
+ const source = sourceOf(input)
31
+ const action = actionOf(input)
32
+
33
+ if (action === 'arbitrary-modification' || source.includes('orchestrator')) return AgentMessageRole.Orchestrator
34
+ if (source.includes('fix')) return AgentMessageRole.Repair
35
+ if (source.includes('coder') || source.includes('developer') || codeActions.has(action)) return AgentMessageRole.Developer
36
+ if (source.includes('visual') || source.includes('ui-helper')) return AgentMessageRole.VisualDesign
37
+ if (source.includes('ux-')) return AgentMessageRole.Ux
38
+ if (source.includes('business') || source.includes('ba-') || source.includes('analysis') || source.includes('analyst')) return AgentMessageRole.Analytical
39
+ if (source.includes('product') || source.includes('naming')) return AgentMessageRole.Product
40
+ if (source.includes('architect') || source.includes('arch') || source.includes('layout-helper') ||
41
+ source.includes('api-helper') || source.includes('access-helper') || source.includes('datalayer-helper') ||
42
+ source.includes('domain') || source.includes('nav-helper') || source.includes('ui-com-helper') ||
43
+ source.includes('ui-state-helper')) return AgentMessageRole.Architect
44
+ return AgentMessageRole.Technical
45
+ }
85
46
 
86
- export type AgentMessagePresentation =
87
- | AgentCodePresentation
88
- | AgentStructuredPresentation
89
- | AgentMarkdownPresentation
90
- | AgentPlainPresentation
91
-
92
- /** The attribution and content available to either side of a thinking event. */
93
- export interface AgentMessageClassificationInput {
94
- agent?: string
95
- helper?: string
96
- action?: string
97
- outputType?: string
98
- text?: string
99
- value?: unknown
100
- }
47
+ /** Pulls a schema argument out of LangChain's serialised tool-call shape. */
48
+ const agentToolCallArguments = (value: unknown): unknown => {
49
+ if (!Array.isArray(value) || value.length !== 1) return value
50
+ const call = asRecord(value[0])
51
+ return call?.args ?? value
52
+ }
101
53
 
102
- type RecordValue = Record<string, unknown>
54
+ const structuredKindOf = (value: unknown): AgentStructuredKind | undefined => {
55
+ if (value == null) return undefined
103
56
 
104
- const documentActions: Record<string, AgentMarkdownKind> = {
105
- 'write-specification': AgentMarkdownKind.Specification,
106
- 'summarize-specification': AgentMarkdownKind.Specification,
107
- 'write-design-concept': AgentMarkdownKind.DesignDocument,
108
- 'describe-ui-component': AgentMarkdownKind.DesignDocument,
109
- 'describe-ui-screen': AgentMarkdownKind.DesignDocument,
110
- 'describe-ui-layout': AgentMarkdownKind.DesignDocument,
111
- }
57
+ const toolArgs = agentToolCallArguments(value)
58
+ const object = asRecord(toolArgs)
59
+ if (object == null) {
60
+ if (Array.isArray(toolArgs)) return AgentStructuredKind.GenericList
61
+ return undefined
62
+ }
112
63
 
113
- const codeActions = new Set(['code', 'update-code', 'update-code-full'])
114
-
115
- /**
116
- * The model's schema makes the final output self-describing; while it streams, the helper action
117
- * gives the client the same semantic cue before a complete JSON value exists.
118
- */
119
- const structuredActions: Record<string, AgentStructuredKind> = {
120
- 'choose-files-for-fix': AgentStructuredKind.ArtifactSelection,
121
- 'list-files-to-fix': AgentStructuredKind.ArtifactSelection,
122
- 'extract-user-stories-from-spec': AgentStructuredKind.StoryPlan,
123
- 'derive-connecting-stories': AgentStructuredKind.StoryPlan,
124
- 'derive-area-scaffold-stories': AgentStructuredKind.StoryPlan,
125
- 'describe-ux-story-transitions': AgentStructuredKind.TransitionPlan,
126
- 'find-entrypoint-for-screen': AgentStructuredKind.EntrypointSelection,
127
- 'describe-api-access': AgentStructuredKind.AccessPolicy,
128
- 'describe-screen-access': AgentStructuredKind.AccessPolicy,
129
- 'plan-scaffold': AgentStructuredKind.ScaffoldPlan,
130
- 'runtime-gate': AgentStructuredKind.RuntimeDecision,
131
- 'detect-story-with-home-screen': AgentStructuredKind.CandidateRanking,
132
- }
64
+ // Checked ahead of the single-array shapes below: a scaffold plan carries its own `stories`
65
+ // array (so the StoryPlan check would otherwise swallow it), and a runtime decision straight
66
+ // from the MODEL never carries `actor`/`worker` — those are added only once the decision is
67
+ // persisted onto a StoryDesign — so requiring them here missed every live model call.
68
+ if ('identity' in object && 'guestHome' in object && 'areas' in object && 'stories' in object) {
69
+ return AgentStructuredKind.ScaffoldPlan
70
+ }
71
+ if (Array.isArray(object.jobs) && Array.isArray(object.agents) && 'kv' in object) {
72
+ return AgentStructuredKind.RuntimeDecision
73
+ }
133
74
 
134
- const asRecord = (value: unknown): RecordValue | undefined =>
135
- value != null && typeof value === 'object' && !Array.isArray(value)
136
- ? value as RecordValue
137
- : undefined
75
+ if (Array.isArray(object.files)) return AgentStructuredKind.ArtifactSelection
76
+ if (Array.isArray(object.entities)) return AgentStructuredKind.EntitySelection
77
+ if (Array.isArray(object.stories)) return AgentStructuredKind.StoryPlan
78
+ if (Array.isArray(object.screens)) return AgentStructuredKind.ScreenPlan
79
+ if (Array.isArray(object.components)) return AgentStructuredKind.ComponentPlan
80
+ if (Array.isArray(object.transitions)) return AgentStructuredKind.TransitionPlan
81
+ if (Array.isArray(object.entries)) return AgentStructuredKind.EntrypointSelection
82
+ if (Array.isArray(object.candidates)) return AgentStructuredKind.CandidateRanking
83
+ if (Object.values(object).some(value => {
84
+ const entry = asRecord(value)
85
+ return entry != null && Array.isArray(entry.permissions) && 'level' in entry
86
+ })) return AgentStructuredKind.AccessPolicy
87
+ return AgentStructuredKind.GenericRecord
88
+ }
138
89
 
139
- const actionOf = (input: AgentMessageClassificationInput): string => input.action?.toLowerCase() ?? ''
90
+ const decisionAction = (action: string): boolean =>
91
+ action.startsWith('should-') || action.startsWith('is-') || action.includes('blueprint-case') || action.includes('choose-case')
140
92
 
141
- const sourceOf = (input: AgentMessageClassificationInput): string =>
142
- `${input.agent ?? ''} ${input.helper ?? ''}`.toLowerCase()
93
+ const fileExtensionLanguage = (path: string): AgentCodeLanguage => {
94
+ const name = path.toLowerCase().split('?')[0]
95
+ if (/\.(tsx|jsx)$/.test(name)) return AgentCodeLanguage.ReactTsx
96
+ if (/\.css$/.test(name)) return AgentCodeLanguage.Css
97
+ if (/\.(ts|mts|cts|js|mjs|cjs)$/.test(name)) return AgentCodeLanguage.TypeScript
98
+ if (/\.json$/.test(name)) return AgentCodeLanguage.Json
99
+ return AgentCodeLanguage.Other
100
+ }
143
101
 
144
- const contentOf = (input: AgentMessageClassificationInput): string => input.text?.trim() ?? ''
102
+ /** Finds the language of a unified diff from its destination (or source) file path. */
103
+ const agentDiffLanguageOf = (text: string): AgentCodeLanguage => {
104
+ const match = text.match(/^\+\+\+\s+(?:b\/)?(.+)$/m) ?? text.match(/^---\s+(?:a\/)?(.+)$/m)
105
+ return match == null ? AgentCodeLanguage.Other : fileExtensionLanguage(match[1])
106
+ }
145
107
 
146
- /**
147
- * Source extraction is an internal context-reduction pass. Its terminal tool call contains only
148
- * line ranges, which are useful to the coder but add no useful information to a person's journal.
149
- */
150
- export const isAgentMessageHidden = (input: AgentMessageClassificationInput): boolean =>
151
- actionOf(input) === 'source-extract'
152
-
153
- /** Maps the attribution that reached the event boundary to the visual specialist family. */
154
- export const agentMessageRoleOf = (input: AgentMessageClassificationInput): AgentMessageRole => {
155
- const source = sourceOf(input)
156
- const action = actionOf(input)
157
-
158
- if (action === 'arbitrary-modification' || source.includes('orchestrator')) return AgentMessageRole.Orchestrator
159
- if (source.includes('fix')) return AgentMessageRole.Repair
160
- if (source.includes('coder') || source.includes('developer') || codeActions.has(action)) return AgentMessageRole.Developer
161
- if (source.includes('visual') || source.includes('ui-helper')) return AgentMessageRole.VisualDesign
162
- if (source.includes('ux-')) return AgentMessageRole.Ux
163
- if (source.includes('business') || source.includes('ba-') || source.includes('analysis') || source.includes('analyst')) return AgentMessageRole.Analytical
164
- if (source.includes('product') || source.includes('naming')) return AgentMessageRole.Product
165
- if (source.includes('architect') || source.includes('arch') || source.includes('layout-helper') ||
166
- source.includes('api-helper') || source.includes('access-helper') || source.includes('datalayer-helper') ||
167
- source.includes('domain') || source.includes('nav-helper') || source.includes('ui-com-helper') ||
168
- source.includes('ui-state-helper')) return AgentMessageRole.Architect
169
- return AgentMessageRole.Technical
170
- }
108
+ const fencedLanguageOf = (text: string): AgentCodeLanguage | undefined => {
109
+ const match = text.match(/^```([\w+-]+)/m)
110
+ const language = match?.[1]?.toLowerCase()
111
+ if (language == null) return undefined
112
+ if (['tsx', 'jsx', 'react'].includes(language)) return AgentCodeLanguage.ReactTsx
113
+ if (language === 'css') return AgentCodeLanguage.Css
114
+ if (['ts', 'typescript', 'js', 'javascript'].includes(language)) return AgentCodeLanguage.TypeScript
115
+ if (language === 'json') return AgentCodeLanguage.Json
116
+ return AgentCodeLanguage.Other
117
+ }
171
118
 
172
- /** Pulls a schema argument out of LangChain's serialised tool-call shape. */
173
- export const agentToolCallArguments = (value: unknown): unknown => {
174
- if (!Array.isArray(value) || value.length !== 1) return value
175
- const call = asRecord(value[0])
176
- return call?.args ?? value
177
- }
119
+ /** Conservative code detection; prose with one identifier remains plain text. */
120
+ const agentCodeLanguageOf = (text: string): AgentCodeLanguage => {
121
+ const content = text.trim().replace(/^```[\w+-]*\n?|\n?```$/g, '')
122
+ const fenced = fencedLanguageOf(text)
123
+ if (fenced != null) return fenced
124
+ if (content === '') return AgentCodeLanguage.Other
125
+ try {
126
+ JSON.parse(content)
127
+ if (/^[{[]/.test(content)) return AgentCodeLanguage.Json
128
+ } catch {
129
+ // The remaining heuristics deliberately require source-like syntax.
130
+ }
131
+ if (/<[A-Za-z][\w.:-]*(?:\s[^>]*)?\/>|<[A-Za-z][\w.:-]*(?:\s[^>]*)?>/.test(content) &&
132
+ /\b(import|export|const|function|return)\b/.test(content)) return AgentCodeLanguage.ReactTsx
133
+ if (/(^|\n)\s*(?:[.#][\w-]+|[a-z][\w-]*(?:\[[^\]]+\])?)\s*\{[^}]*:[^}]*\}/.test(content)) {
134
+ return AgentCodeLanguage.Css
135
+ }
136
+ if (/\b(import|export|interface|type|const|let|function|class)\b/.test(content) &&
137
+ /[;{}]|=>/.test(content)) return AgentCodeLanguage.TypeScript
138
+ return AgentCodeLanguage.Other
139
+ }
178
140
 
179
- const structuredKindOf = (value: unknown): AgentStructuredKind | undefined => {
180
- if (value == null) return undefined
141
+ const isUnifiedDiff = (text: string): boolean =>
142
+ /^---\s+.+\n\+\+\+\s+.+/m.test(text) || (/^@@\s+[-+]/m.test(text) && /^(?:\+|-)[^+-]/m.test(text))
181
143
 
182
- const toolArgs = agentToolCallArguments(value)
183
- const object = asRecord(toolArgs)
184
- if (object == null) {
185
- if (Array.isArray(toolArgs)) return AgentStructuredKind.GenericList
186
- return undefined
144
+ const markdownKindOf = (text: string): AgentMarkdownKind | undefined => {
145
+ if (/^#{1,6}\s+/m.test(text) || /^>\s+/m.test(text) || /^\|.+\|\s*$/m.test(text)) {
146
+ return AgentMarkdownKind.Documentation
147
+ }
148
+ const listItems = text.match(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/gm)?.length ?? 0
149
+ return listItems >= 2 ? AgentMarkdownKind.Documentation : undefined
187
150
  }
188
151
 
189
- // Checked ahead of the single-array shapes below: a scaffold plan carries its own `stories`
190
- // array (so the StoryPlan check would otherwise swallow it), and a runtime decision straight
191
- // from the MODEL never carries `actor`/`worker` — those are added only once the decision is
192
- // persisted onto a StoryDesign — so requiring them here missed every live model call.
193
- if ('identity' in object && 'guestHome' in object && 'areas' in object && 'stories' in object) {
194
- return AgentStructuredKind.ScaffoldPlan
195
- }
196
- if (Array.isArray(object.jobs) && Array.isArray(object.agents) && 'kv' in object) {
197
- return AgentStructuredKind.RuntimeDecision
152
+ const isGenericStructure = (kind: AgentStructuredKind | undefined): boolean =>
153
+ kind == null || kind === AgentStructuredKind.GenericRecord || kind === AgentStructuredKind.GenericList ||
154
+ kind === AgentStructuredKind.GenericValue
155
+
156
+ const classifyAgentMessage = (input: AgentMessageClassificationInput): AgentMessagePresentation => {
157
+ const role = agentMessageRoleOf(input)
158
+ const action = actionOf(input)
159
+ const text = contentOf(input)
160
+ const structure = structuredKindOf(input.value)
161
+
162
+ if (input.outputType === 'tool_calls') {
163
+ // A single pinned-schema call resolves to its own card; everything else — several calls in
164
+ // one turn, an unconstrained agent-loop action, or a shape too generic to be informative —
165
+ // is a tool call, not a schema result.
166
+ const isMultiCall = Array.isArray(input.value) && input.value.length > 1
167
+ const isToolCalls = isMultiCall || agentLoopActions.has(action) || isGenericStructure(structure)
168
+ return {
169
+ category: AgentMessageCategory.Structured,
170
+ structure: isToolCalls ? AgentStructuredKind.ToolCalls : structure!,
171
+ role,
172
+ }
173
+ }
174
+ if (structure != null) return { category: AgentMessageCategory.Structured, structure, role }
175
+ const actionStructure = structuredActions[action]
176
+ if (actionStructure != null) return { category: AgentMessageCategory.Structured, structure: actionStructure, role }
177
+ if (decisionAction(action)) return { category: AgentMessageCategory.Structured, structure: AgentStructuredKind.Decision, role }
178
+ if (isUnifiedDiff(text) || action === 'update-code') {
179
+ return { category: AgentMessageCategory.Diff, language: agentDiffLanguageOf(text), role }
180
+ }
181
+ if (codeActions.has(action) || fencedLanguageOf(text) != null || agentCodeLanguageOf(text) !== AgentCodeLanguage.Other) {
182
+ return { category: AgentMessageCategory.Code, language: agentCodeLanguageOf(text), role }
183
+ }
184
+ const document = documentActions[action] ?? markdownKindOf(text)
185
+ if (document != null) return { category: AgentMessageCategory.Markdown, document, role }
186
+ if (input.value != null) {
187
+ return {
188
+ category: AgentMessageCategory.Structured,
189
+ structure: Array.isArray(input.value) ? AgentStructuredKind.GenericList : AgentStructuredKind.GenericValue,
190
+ role,
191
+ }
192
+ }
193
+ return { category: AgentMessageCategory.Plain, role }
198
194
  }
199
195
 
200
- if (Array.isArray(object.files)) return AgentStructuredKind.ArtifactSelection
201
- if (Array.isArray(object.entities)) return AgentStructuredKind.EntitySelection
202
- if (Array.isArray(object.stories)) return AgentStructuredKind.StoryPlan
203
- if (Array.isArray(object.screens)) return AgentStructuredKind.ScreenPlan
204
- if (Array.isArray(object.components)) return AgentStructuredKind.ComponentPlan
205
- if (Array.isArray(object.transitions)) return AgentStructuredKind.TransitionPlan
206
- if (Array.isArray(object.entries)) return AgentStructuredKind.EntrypointSelection
207
- if (Array.isArray(object.candidates)) return AgentStructuredKind.CandidateRanking
208
- if (Object.values(object).some(value => {
209
- const entry = asRecord(value)
210
- return entry != null && Array.isArray(entry.permissions) && 'level' in entry
211
- })) return AgentStructuredKind.AccessPolicy
212
- return AgentStructuredKind.GenericRecord
196
+ return {
197
+ isAgentMessageHidden, agentMessageRoleOf, agentToolCallArguments, agentDiffLanguageOf, agentCodeLanguageOf,
198
+ isUnifiedDiff, classifyAgentMessage,
199
+ }
213
200
  }
214
201
 
215
- const decisionAction = (action: string): boolean =>
216
- action.startsWith('should-') || action.startsWith('is-') || action.includes('blueprint-case') || action.includes('choose-case')
202
+ export const agentPresentationHelper = createAgentPresentationHelper()
217
203
 
218
- const fileExtensionLanguage = (path: string): AgentCodeLanguage => {
219
- const name = path.toLowerCase().split('?')[0]
220
- if (/\.(tsx|jsx)$/.test(name)) return AgentCodeLanguage.ReactTsx
221
- if (/\.css$/.test(name)) return AgentCodeLanguage.Css
222
- if (/\.(ts|mts|cts|js|mjs|cjs)$/.test(name)) return AgentCodeLanguage.TypeScript
223
- if (/\.json$/.test(name)) return AgentCodeLanguage.Json
224
- return AgentCodeLanguage.Other
225
- }
204
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.isAgentMessageHidden(…)` */
205
+ export const isAgentMessageHidden = (input: AgentMessageClassificationInput): boolean =>
206
+ agentPresentationHelper.isAgentMessageHidden(input)
226
207
 
227
- /** Finds the language of a unified diff from its destination (or source) file path. */
228
- export const agentDiffLanguageOf = (text: string): AgentCodeLanguage => {
229
- const match = text.match(/^\+\+\+\s+(?:b\/)?(.+)$/m) ?? text.match(/^---\s+(?:a\/)?(.+)$/m)
230
- return match == null ? AgentCodeLanguage.Other : fileExtensionLanguage(match[1])
231
- }
208
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.agentMessageRoleOf(…)` */
209
+ export const agentMessageRoleOf = (input: AgentMessageClassificationInput): AgentMessageRole =>
210
+ agentPresentationHelper.agentMessageRoleOf(input)
232
211
 
233
- const fencedLanguageOf = (text: string): AgentCodeLanguage | undefined => {
234
- const match = text.match(/^```([\w+-]+)/m)
235
- const language = match?.[1]?.toLowerCase()
236
- if (language == null) return undefined
237
- if (['tsx', 'jsx', 'react'].includes(language)) return AgentCodeLanguage.ReactTsx
238
- if (language === 'css') return AgentCodeLanguage.Css
239
- if (['ts', 'typescript', 'js', 'javascript'].includes(language)) return AgentCodeLanguage.TypeScript
240
- if (language === 'json') return AgentCodeLanguage.Json
241
- return AgentCodeLanguage.Other
242
- }
212
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.agentToolCallArguments(…)` */
213
+ export const agentToolCallArguments = (value: unknown): unknown => agentPresentationHelper.agentToolCallArguments(value)
243
214
 
244
- /** Conservative code detection; prose with one identifier remains plain text. */
245
- export const agentCodeLanguageOf = (text: string): AgentCodeLanguage => {
246
- const content = text.trim().replace(/^```[\w+-]*\n?|\n?```$/g, '')
247
- const fenced = fencedLanguageOf(text)
248
- if (fenced != null) return fenced
249
- if (content === '') return AgentCodeLanguage.Other
250
- try {
251
- JSON.parse(content)
252
- if (/^[{[]/.test(content)) return AgentCodeLanguage.Json
253
- } catch {
254
- // The remaining heuristics deliberately require source-like syntax.
255
- }
256
- if (/<[A-Za-z][\w.:-]*(?:\s[^>]*)?\/>|<[A-Za-z][\w.:-]*(?:\s[^>]*)?>/.test(content) &&
257
- /\b(import|export|const|function|return)\b/.test(content)) return AgentCodeLanguage.ReactTsx
258
- if (/(^|\n)\s*(?:[.#][\w-]+|[a-z][\w-]*(?:\[[^\]]+\])?)\s*\{[^}]*:[^}]*\}/.test(content)) {
259
- return AgentCodeLanguage.Css
260
- }
261
- if (/\b(import|export|interface|type|const|let|function|class)\b/.test(content) &&
262
- /[;{}]|=>/.test(content)) return AgentCodeLanguage.TypeScript
263
- return AgentCodeLanguage.Other
264
- }
215
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.agentDiffLanguageOf(…)` */
216
+ export const agentDiffLanguageOf = (text: string): AgentCodeLanguage => agentPresentationHelper.agentDiffLanguageOf(text)
265
217
 
266
- export const isUnifiedDiff = (text: string): boolean =>
267
- /^---\s+.+\n\+\+\+\s+.+/m.test(text) || (/^@@\s+[-+]/m.test(text) && /^(?:\+|-)[^+-]/m.test(text))
218
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.agentCodeLanguageOf(…)` */
219
+ export const agentCodeLanguageOf = (text: string): AgentCodeLanguage => agentPresentationHelper.agentCodeLanguageOf(text)
268
220
 
269
- const markdownKindOf = (text: string): AgentMarkdownKind | undefined => {
270
- if (/^#{1,6}\s+/m.test(text) || /^>\s+/m.test(text) || /^\|.+\|\s*$/m.test(text)) {
271
- return AgentMarkdownKind.Documentation
272
- }
273
- const listItems = text.match(/^\s*(?:[-*+]\s+|\d+[.)]\s+)/gm)?.length ?? 0
274
- return listItems >= 2 ? AgentMarkdownKind.Documentation : undefined
275
- }
221
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.isUnifiedDiff(…)` */
222
+ export const isUnifiedDiff = (text: string): boolean => agentPresentationHelper.isUnifiedDiff(text)
276
223
 
277
- /**
278
- * Classifies known model output by source AND shape. The `value` comes from a caller's JSON
279
- * parser; this runtime-free package intentionally never repairs or parses streamed JSON itself.
280
- */
281
- /**
282
- * Actions run by an unconstrained tool-calling loop (the coding agent, the repair/architect/
283
- * lookup sub-agents, source extraction) rather than a single pinned-schema call. Their tool calls
284
- * are file/shell operations, not model-schema output, so they always render as ToolCalls even
285
- * when a call's arguments happen to shape-match a schema kind — `read_sources({ files })` looks
286
- * exactly like an ArtifactSelection.
287
- */
288
- const agentLoopActions = new Set([
289
- 'coding-agent-ask', 'arbitrary-modification', 'fix-agent', 'architect', 'declaration-lookup',
290
- 'source-extract',
291
- ])
292
-
293
- const isGenericStructure = (kind: AgentStructuredKind | undefined): boolean =>
294
- kind == null || kind === AgentStructuredKind.GenericRecord || kind === AgentStructuredKind.GenericList ||
295
- kind === AgentStructuredKind.GenericValue
296
-
297
- export const classifyAgentMessage = (input: AgentMessageClassificationInput): AgentMessagePresentation => {
298
- const role = agentMessageRoleOf(input)
299
- const action = actionOf(input)
300
- const text = contentOf(input)
301
- const structure = structuredKindOf(input.value)
302
-
303
- if (input.outputType === 'tool_calls') {
304
- // A single pinned-schema call resolves to its own card; everything else — several calls in
305
- // one turn, an unconstrained agent-loop action, or a shape too generic to be informative —
306
- // is a tool call, not a schema result.
307
- const isMultiCall = Array.isArray(input.value) && input.value.length > 1
308
- const isToolCalls = isMultiCall || agentLoopActions.has(action) || isGenericStructure(structure)
309
- return {
310
- category: AgentMessageCategory.Structured,
311
- structure: isToolCalls ? AgentStructuredKind.ToolCalls : structure!,
312
- role,
313
- }
314
- }
315
- if (structure != null) return { category: AgentMessageCategory.Structured, structure, role }
316
- const actionStructure = structuredActions[action]
317
- if (actionStructure != null) return { category: AgentMessageCategory.Structured, structure: actionStructure, role }
318
- if (decisionAction(action)) return { category: AgentMessageCategory.Structured, structure: AgentStructuredKind.Decision, role }
319
- if (isUnifiedDiff(text) || action === 'update-code') {
320
- return { category: AgentMessageCategory.Diff, language: agentDiffLanguageOf(text), role }
321
- }
322
- if (codeActions.has(action) || fencedLanguageOf(text) != null || agentCodeLanguageOf(text) !== AgentCodeLanguage.Other) {
323
- return { category: AgentMessageCategory.Code, language: agentCodeLanguageOf(text), role }
324
- }
325
- const document = documentActions[action] ?? markdownKindOf(text)
326
- if (document != null) return { category: AgentMessageCategory.Markdown, document, role }
327
- if (input.value != null) {
328
- return {
329
- category: AgentMessageCategory.Structured,
330
- structure: Array.isArray(input.value) ? AgentStructuredKind.GenericList : AgentStructuredKind.GenericValue,
331
- role,
332
- }
333
- }
334
- return { category: AgentMessageCategory.Plain, role }
335
- }
224
+ /** @deprecated compat:factory-refactor — use `agentPresentationHelper.classifyAgentMessage(…)` */
225
+ export const classifyAgentMessage = (input: AgentMessageClassificationInput): AgentMessagePresentation =>
226
+ agentPresentationHelper.classifyAgentMessage(input)
@@ -0,0 +1,3 @@
1
+ export interface RecordValue {
2
+ [key: string]: unknown
3
+ }
@@ -1,4 +1,5 @@
1
1
  import type { LlmPurpose } from '@owlmeans/llm-common'
2
+ import { AgentCodeLanguage, AgentMarkdownKind, AgentMessageCategory, AgentMessageRole, AgentStructuredKind } from './consts.js'
2
3
 
3
4
  /**
4
5
  * Observability metadata attached to every model call. Extends the generic
@@ -8,3 +9,42 @@ export interface PurposeMetadata extends LlmPurpose {
8
9
  viableAgent?: string
9
10
  viableHelper?: string
10
11
  }
12
+
13
+ export interface AgentCodePresentation {
14
+ category: AgentMessageCategory.Code | AgentMessageCategory.Diff
15
+ language: AgentCodeLanguage
16
+ role: AgentMessageRole
17
+ }
18
+
19
+ export interface AgentStructuredPresentation {
20
+ category: AgentMessageCategory.Structured
21
+ structure: AgentStructuredKind
22
+ role: AgentMessageRole
23
+ }
24
+
25
+ export interface AgentMarkdownPresentation {
26
+ category: AgentMessageCategory.Markdown
27
+ document: AgentMarkdownKind
28
+ role: AgentMessageRole
29
+ }
30
+
31
+ export interface AgentPlainPresentation {
32
+ category: AgentMessageCategory.Plain
33
+ role: AgentMessageRole
34
+ }
35
+
36
+ export type AgentMessagePresentation =
37
+ | AgentCodePresentation
38
+ | AgentStructuredPresentation
39
+ | AgentMarkdownPresentation
40
+ | AgentPlainPresentation
41
+
42
+ /** The attribution and content available to either side of a thinking event. */
43
+ export interface AgentMessageClassificationInput {
44
+ agent?: string
45
+ helper?: string
46
+ action?: string
47
+ outputType?: string
48
+ text?: string
49
+ value?: unknown
50
+ }
@@ -1,4 +1,5 @@
1
1
  import { AccessLevel } from '../dev/consts.js'
2
+ import type { ProjectTenancy } from './types.js'
2
3
 
3
4
  /**
4
5
  * The audiences a generated application serves.
@@ -110,3 +111,9 @@ export const AREA_TIER: Record<ProjectArea, string | null> = {
110
111
  [ProjectArea.Admin]: null,
111
112
  [ProjectArea.Operator]: ProjectArea.Operator,
112
113
  }
114
+
115
+ /** The longest requester sentence a tenancy decision quotes — a card refuses a longer one. */
116
+ export const TENANCY_QUOTE_MAX = 1024
117
+
118
+ /** A single-organization application — what every project is until a decision says otherwise. */
119
+ export const NO_TENANCY: ProjectTenancy = Object.freeze({ operators: false, users: false })
@@ -1,4 +1,5 @@
1
1
  export type * from './types.js'
2
+ export type * from './tenancy/types.js'
2
3
 
3
4
  export * from './consts.js'
4
5
  export * from './tenancy.js'
@@ -0,0 +1,23 @@
1
+ import type { Blueprint } from '../../blueprint/types.js'
2
+ import type { ProjectArea } from '../consts.js'
3
+ import type { ProjectTenancy } from '../types.js'
4
+
5
+ /** Which of a product's audiences act inside a tenant organization. */
6
+ export interface TenancyHelper {
7
+ /**
8
+ * The tenancy of a resolved blueprint.
9
+ *
10
+ * Total, like `landingGatePreferenceOf`: an absent layer, an absent key and a value this deploy
11
+ * cannot read all answer {@link NO_TENANCY}. Only a literal `true` turns a flag on, because a flag
12
+ * read as on by mistake splits a product's people into organizations nobody asked for, while one
13
+ * read as off leaves the application exactly as it was before tenancy existed.
14
+ */
15
+ tenancyOf: (blueprint?: Pick<Blueprint, 'experience'> | null) => ProjectTenancy
16
+ /**
17
+ * Whether an AREA's people act inside a tenant organization.
18
+ *
19
+ * Guest has no organization to act in, and admin is the project owner, who stands above every
20
+ * tenant rather than inside one — so both are never tenanted, whatever the flags say.
21
+ */
22
+ tenantedArea: (area: ProjectArea, tenancy: ProjectTenancy) => boolean
23
+ }