@canonical/pragma-cli 0.34.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (832) hide show
  1. package/README.md +153 -30
  2. package/bundled-skills/add-standard/SKILL.md +338 -0
  3. package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
  4. package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
  5. package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
  6. package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
  7. package/bundled-skills/anatomy-author/SKILL.md +1226 -0
  8. package/bundled-skills/design-auditor/SKILL.md +455 -0
  9. package/bundled-skills/implement-component/SKILL.md +333 -0
  10. package/bundled-skills/specify-component/SKILL.md +331 -0
  11. package/bundled-skills/specify-pattern/SKILL.md +292 -0
  12. package/dist/.build-ok +0 -0
  13. package/dist/package.json +84 -0
  14. package/dist/pragma.conf.js +1016 -0
  15. package/dist/pragma.conf.js.map +1 -0
  16. package/dist/src/bin.js +356 -0
  17. package/dist/src/bin.js.map +1 -0
  18. package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
  19. package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
  20. package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
  21. package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
  22. package/dist/src/capabilities/capabilities/catalog.js +130 -0
  23. package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
  24. package/dist/src/capabilities/capabilities/hints.js +195 -0
  25. package/dist/src/capabilities/capabilities/hints.js.map +1 -0
  26. package/dist/src/capabilities/capabilities/index.js +11 -0
  27. package/dist/src/capabilities/capabilities/index.js.map +1 -0
  28. package/dist/src/capabilities/capabilities/types.js +11 -0
  29. package/dist/src/capabilities/capabilities/types.js.map +1 -0
  30. package/dist/src/capabilities/colophon/collectColophon.js +83 -0
  31. package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
  32. package/dist/src/capabilities/colophon/colophon.render.js +59 -0
  33. package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
  34. package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
  35. package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
  36. package/dist/src/capabilities/colophon/index.js +5 -0
  37. package/dist/src/capabilities/colophon/index.js.map +1 -0
  38. package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
  39. package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
  40. package/dist/src/capabilities/colophon/types.js +10 -0
  41. package/dist/src/capabilities/colophon/types.js.map +1 -0
  42. package/dist/src/capabilities/config/collectConfigShow.js +59 -0
  43. package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
  44. package/dist/src/capabilities/config/field.render.js +22 -0
  45. package/dist/src/capabilities/config/field.render.js.map +1 -0
  46. package/dist/src/capabilities/config/fields.js +46 -0
  47. package/dist/src/capabilities/config/fields.js.map +1 -0
  48. package/dist/src/capabilities/config/get.verb.js +61 -0
  49. package/dist/src/capabilities/config/get.verb.js.map +1 -0
  50. package/dist/src/capabilities/config/index.js +5 -0
  51. package/dist/src/capabilities/config/index.js.map +1 -0
  52. package/dist/src/capabilities/config/runField.js +59 -0
  53. package/dist/src/capabilities/config/runField.js.map +1 -0
  54. package/dist/src/capabilities/config/runGet.js +28 -0
  55. package/dist/src/capabilities/config/runGet.js.map +1 -0
  56. package/dist/src/capabilities/config/runSet.js +53 -0
  57. package/dist/src/capabilities/config/runSet.js.map +1 -0
  58. package/dist/src/capabilities/config/set.verb.js +66 -0
  59. package/dist/src/capabilities/config/set.verb.js.map +1 -0
  60. package/dist/src/capabilities/config/show.render.js +84 -0
  61. package/dist/src/capabilities/config/show.render.js.map +1 -0
  62. package/dist/src/capabilities/config/show.verb.js +44 -0
  63. package/dist/src/capabilities/config/show.verb.js.map +1 -0
  64. package/dist/src/capabilities/config/types.js +5 -0
  65. package/dist/src/capabilities/config/types.js.map +1 -0
  66. package/dist/src/capabilities/config/unset.verb.js +49 -0
  67. package/dist/src/capabilities/config/unset.verb.js.map +1 -0
  68. package/dist/src/capabilities/create/cliProjection.js +195 -0
  69. package/dist/src/capabilities/create/cliProjection.js.map +1 -0
  70. package/dist/src/capabilities/create/constants.js +47 -0
  71. package/dist/src/capabilities/create/constants.js.map +1 -0
  72. package/dist/src/capabilities/create/create.render.js +100 -0
  73. package/dist/src/capabilities/create/create.render.js.map +1 -0
  74. package/dist/src/capabilities/create/create.verb.js +438 -0
  75. package/dist/src/capabilities/create/create.verb.js.map +1 -0
  76. package/dist/src/capabilities/create/createHelp.js +47 -0
  77. package/dist/src/capabilities/create/createHelp.js.map +1 -0
  78. package/dist/src/capabilities/create/createSurface.generated.js +394 -0
  79. package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
  80. package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
  81. package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
  82. package/dist/src/capabilities/create/index.js +18 -0
  83. package/dist/src/capabilities/create/index.js.map +1 -0
  84. package/dist/src/capabilities/create/messages.js +16 -0
  85. package/dist/src/capabilities/create/messages.js.map +1 -0
  86. package/dist/src/capabilities/create/mount.js +294 -0
  87. package/dist/src/capabilities/create/mount.js.map +1 -0
  88. package/dist/src/capabilities/create/pathJail.js +65 -0
  89. package/dist/src/capabilities/create/pathJail.js.map +1 -0
  90. package/dist/src/capabilities/create/pickGenerator.js +53 -0
  91. package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
  92. package/dist/src/capabilities/create/types.js +2 -0
  93. package/dist/src/capabilities/create/types.js.map +1 -0
  94. package/dist/src/capabilities/distribution.js +40 -0
  95. package/dist/src/capabilities/distribution.js.map +1 -0
  96. package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
  97. package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
  98. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
  99. package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
  100. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
  101. package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
  102. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
  103. package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
  104. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
  105. package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
  106. package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
  107. package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
  108. package/dist/src/capabilities/doctor/checks/index.js +27 -0
  109. package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
  110. package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
  111. package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
  112. package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
  113. package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
  114. package/dist/src/capabilities/doctor/doctor.render.js +164 -0
  115. package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
  116. package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
  117. package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
  118. package/dist/src/capabilities/doctor/index.js +5 -0
  119. package/dist/src/capabilities/doctor/index.js.map +1 -0
  120. package/dist/src/capabilities/doctor/runChecks.js +86 -0
  121. package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
  122. package/dist/src/capabilities/doctor/types.js +5 -0
  123. package/dist/src/capabilities/doctor/types.js.map +1 -0
  124. package/dist/src/capabilities/graph/index.js +19 -0
  125. package/dist/src/capabilities/graph/index.js.map +1 -0
  126. package/dist/src/capabilities/graph/inspect.render.js +76 -0
  127. package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
  128. package/dist/src/capabilities/graph/inspect.verb.js +53 -0
  129. package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
  130. package/dist/src/capabilities/graph/query.render.js +73 -0
  131. package/dist/src/capabilities/graph/query.render.js.map +1 -0
  132. package/dist/src/capabilities/graph/query.verb.js +49 -0
  133. package/dist/src/capabilities/graph/query.verb.js.map +1 -0
  134. package/dist/src/capabilities/graph/runQuery.js +41 -0
  135. package/dist/src/capabilities/graph/runQuery.js.map +1 -0
  136. package/dist/src/capabilities/index.js +56 -0
  137. package/dist/src/capabilities/index.js.map +1 -0
  138. package/dist/src/capabilities/info/collectInfo.js +72 -0
  139. package/dist/src/capabilities/info/collectInfo.js.map +1 -0
  140. package/dist/src/capabilities/info/index.js +5 -0
  141. package/dist/src/capabilities/info/index.js.map +1 -0
  142. package/dist/src/capabilities/info/info.render.js +57 -0
  143. package/dist/src/capabilities/info/info.render.js.map +1 -0
  144. package/dist/src/capabilities/info/info.verb.js +42 -0
  145. package/dist/src/capabilities/info/info.verb.js.map +1 -0
  146. package/dist/src/capabilities/info/types.js +5 -0
  147. package/dist/src/capabilities/info/types.js.map +1 -0
  148. package/dist/src/capabilities/meta/complete.verb.js +43 -0
  149. package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
  150. package/dist/src/capabilities/meta/index.js +13 -0
  151. package/dist/src/capabilities/meta/index.js.map +1 -0
  152. package/dist/src/capabilities/meta/mcp.verb.js +34 -0
  153. package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
  154. package/dist/src/capabilities/ontology/index.js +21 -0
  155. package/dist/src/capabilities/ontology/index.js.map +1 -0
  156. package/dist/src/capabilities/ontology/queries.js +123 -0
  157. package/dist/src/capabilities/ontology/queries.js.map +1 -0
  158. package/dist/src/capabilities/ontology/render.js +66 -0
  159. package/dist/src/capabilities/ontology/render.js.map +1 -0
  160. package/dist/src/capabilities/ontology/verbs.js +181 -0
  161. package/dist/src/capabilities/ontology/verbs.js.map +1 -0
  162. package/dist/src/capabilities/prompt/index.js +16 -0
  163. package/dist/src/capabilities/prompt/index.js.map +1 -0
  164. package/dist/src/capabilities/prompt/prompt.render.js +78 -0
  165. package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
  166. package/dist/src/capabilities/prompt/types.js +10 -0
  167. package/dist/src/capabilities/prompt/types.js.map +1 -0
  168. package/dist/src/capabilities/prompt/verbs.js +93 -0
  169. package/dist/src/capabilities/prompt/verbs.js.map +1 -0
  170. package/dist/src/capabilities/resources/index.js +10 -0
  171. package/dist/src/capabilities/resources/index.js.map +1 -0
  172. package/dist/src/capabilities/resources/provider.js +423 -0
  173. package/dist/src/capabilities/resources/provider.js.map +1 -0
  174. package/dist/src/capabilities/setup/buildPlan.js +172 -0
  175. package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
  176. package/dist/src/capabilities/setup/index.js +5 -0
  177. package/dist/src/capabilities/setup/index.js.map +1 -0
  178. package/dist/src/capabilities/setup/mode.js +53 -0
  179. package/dist/src/capabilities/setup/mode.js.map +1 -0
  180. package/dist/src/capabilities/setup/operations/index.js +39 -0
  181. package/dist/src/capabilities/setup/operations/index.js.map +1 -0
  182. package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
  183. package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
  184. package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
  185. package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
  186. package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
  187. package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
  188. package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
  189. package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
  190. package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
  191. package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
  192. package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
  193. package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
  194. package/dist/src/capabilities/setup/plan.js +128 -0
  195. package/dist/src/capabilities/setup/plan.js.map +1 -0
  196. package/dist/src/capabilities/setup/plan.render.js +271 -0
  197. package/dist/src/capabilities/setup/plan.render.js.map +1 -0
  198. package/dist/src/capabilities/setup/setup.render.js +54 -0
  199. package/dist/src/capabilities/setup/setup.render.js.map +1 -0
  200. package/dist/src/capabilities/setup/setup.verb.js +387 -0
  201. package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
  202. package/dist/src/capabilities/setup/shell.js +196 -0
  203. package/dist/src/capabilities/setup/shell.js.map +1 -0
  204. package/dist/src/capabilities/setup/targets.js +328 -0
  205. package/dist/src/capabilities/setup/targets.js.map +1 -0
  206. package/dist/src/capabilities/setup/types.js +5 -0
  207. package/dist/src/capabilities/setup/types.js.map +1 -0
  208. package/dist/src/capabilities/shared/assertExecOk.js +137 -0
  209. package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
  210. package/dist/src/capabilities/shared/index.js +27 -0
  211. package/dist/src/capabilities/shared/index.js.map +1 -0
  212. package/dist/src/capabilities/shared/packageManager.js +349 -0
  213. package/dist/src/capabilities/shared/packageManager.js.map +1 -0
  214. package/dist/src/capabilities/shared/registry.js +55 -0
  215. package/dist/src/capabilities/shared/registry.js.map +1 -0
  216. package/dist/src/capabilities/skill/discover.js +281 -0
  217. package/dist/src/capabilities/skill/discover.js.map +1 -0
  218. package/dist/src/capabilities/skill/index.js +10 -0
  219. package/dist/src/capabilities/skill/index.js.map +1 -0
  220. package/dist/src/capabilities/skill/render.js +49 -0
  221. package/dist/src/capabilities/skill/render.js.map +1 -0
  222. package/dist/src/capabilities/skill/verbs.js +83 -0
  223. package/dist/src/capabilities/skill/verbs.js.map +1 -0
  224. package/dist/src/capabilities/sources/collectStatus.js +103 -0
  225. package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
  226. package/dist/src/capabilities/sources/index.js +13 -0
  227. package/dist/src/capabilities/sources/index.js.map +1 -0
  228. package/dist/src/capabilities/sources/installSkills.js +309 -0
  229. package/dist/src/capabilities/sources/installSkills.js.map +1 -0
  230. package/dist/src/capabilities/sources/runUpdate.js +460 -0
  231. package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
  232. package/dist/src/capabilities/sources/status.render.js +64 -0
  233. package/dist/src/capabilities/sources/status.render.js.map +1 -0
  234. package/dist/src/capabilities/sources/status.verb.js +40 -0
  235. package/dist/src/capabilities/sources/status.verb.js.map +1 -0
  236. package/dist/src/capabilities/sources/types.js +6 -0
  237. package/dist/src/capabilities/sources/types.js.map +1 -0
  238. package/dist/src/capabilities/sources/update.render.js +34 -0
  239. package/dist/src/capabilities/sources/update.render.js.map +1 -0
  240. package/dist/src/capabilities/sources/update.verb.js +55 -0
  241. package/dist/src/capabilities/sources/update.verb.js.map +1 -0
  242. package/dist/src/capabilities/upgrade/index.js +5 -0
  243. package/dist/src/capabilities/upgrade/index.js.map +1 -0
  244. package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
  245. package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
  246. package/dist/src/capabilities/upgrade/types.js +5 -0
  247. package/dist/src/capabilities/upgrade/types.js.map +1 -0
  248. package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
  249. package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
  250. package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
  251. package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
  252. package/dist/src/capabilities/version/index.js +10 -0
  253. package/dist/src/capabilities/version/index.js.map +1 -0
  254. package/dist/src/capabilities/version/version.verb.js +36 -0
  255. package/dist/src/capabilities/version/version.verb.js.map +1 -0
  256. package/dist/src/constants.js +87 -0
  257. package/dist/src/constants.js.map +1 -0
  258. package/dist/src/index.js +12 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/kernel/completion/complete.js +66 -0
  261. package/dist/src/kernel/completion/complete.js.map +1 -0
  262. package/dist/src/kernel/completion/emitScripts.js +92 -0
  263. package/dist/src/kernel/completion/emitScripts.js.map +1 -0
  264. package/dist/src/kernel/completion/entitySource.js +285 -0
  265. package/dist/src/kernel/completion/entitySource.js.map +1 -0
  266. package/dist/src/kernel/completion/index.js +14 -0
  267. package/dist/src/kernel/completion/index.js.map +1 -0
  268. package/dist/src/kernel/completion/model.js +301 -0
  269. package/dist/src/kernel/completion/model.js.map +1 -0
  270. package/dist/src/kernel/completion/parse.js +253 -0
  271. package/dist/src/kernel/completion/parse.js.map +1 -0
  272. package/dist/src/kernel/completion/rank.js +101 -0
  273. package/dist/src/kernel/completion/rank.js.map +1 -0
  274. package/dist/src/kernel/completion/resolve.js +100 -0
  275. package/dist/src/kernel/completion/resolve.js.map +1 -0
  276. package/dist/src/kernel/completion/templates/bash.js +209 -0
  277. package/dist/src/kernel/completion/templates/bash.js.map +1 -0
  278. package/dist/src/kernel/completion/templates/fish.js +214 -0
  279. package/dist/src/kernel/completion/templates/fish.js.map +1 -0
  280. package/dist/src/kernel/completion/templates/index.js +23 -0
  281. package/dist/src/kernel/completion/templates/index.js.map +1 -0
  282. package/dist/src/kernel/completion/templates/shared.js +98 -0
  283. package/dist/src/kernel/completion/templates/shared.js.map +1 -0
  284. package/dist/src/kernel/completion/templates/zsh.js +201 -0
  285. package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
  286. package/dist/src/kernel/completion/types.js +13 -0
  287. package/dist/src/kernel/completion/types.js.map +1 -0
  288. package/dist/src/kernel/config/defaults.js +17 -0
  289. package/dist/src/kernel/config/defaults.js.map +1 -0
  290. package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
  291. package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
  292. package/dist/src/kernel/config/findProjectConfig.js +43 -0
  293. package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
  294. package/dist/src/kernel/config/firstRun.js +34 -0
  295. package/dist/src/kernel/config/firstRun.js.map +1 -0
  296. package/dist/src/kernel/config/globalConfig.js +79 -0
  297. package/dist/src/kernel/config/globalConfig.js.map +1 -0
  298. package/dist/src/kernel/config/index.js +16 -0
  299. package/dist/src/kernel/config/index.js.map +1 -0
  300. package/dist/src/kernel/config/paths.js +35 -0
  301. package/dist/src/kernel/config/paths.js.map +1 -0
  302. package/dist/src/kernel/config/readConfig.js +78 -0
  303. package/dist/src/kernel/config/readConfig.js.map +1 -0
  304. package/dist/src/kernel/config/schema.js +130 -0
  305. package/dist/src/kernel/config/schema.js.map +1 -0
  306. package/dist/src/kernel/config/types.js +19 -0
  307. package/dist/src/kernel/config/types.js.map +1 -0
  308. package/dist/src/kernel/config/writeConfigField.js +59 -0
  309. package/dist/src/kernel/config/writeConfigField.js.map +1 -0
  310. package/dist/src/kernel/copy.js +43 -0
  311. package/dist/src/kernel/copy.js.map +1 -0
  312. package/dist/src/kernel/error/PragmaError.js +149 -0
  313. package/dist/src/kernel/error/PragmaError.js.map +1 -0
  314. package/dist/src/kernel/error/constants.js +40 -0
  315. package/dist/src/kernel/error/constants.js.map +1 -0
  316. package/dist/src/kernel/error/fromTaskError.js +96 -0
  317. package/dist/src/kernel/error/fromTaskError.js.map +1 -0
  318. package/dist/src/kernel/error/index.js +13 -0
  319. package/dist/src/kernel/error/index.js.map +1 -0
  320. package/dist/src/kernel/error/recovery.js +52 -0
  321. package/dist/src/kernel/error/recovery.js.map +1 -0
  322. package/dist/src/kernel/error/renderError.js +115 -0
  323. package/dist/src/kernel/error/renderError.js.map +1 -0
  324. package/dist/src/kernel/error/serialize.js +25 -0
  325. package/dist/src/kernel/error/serialize.js.map +1 -0
  326. package/dist/src/kernel/error/types.js +9 -0
  327. package/dist/src/kernel/error/types.js.map +1 -0
  328. package/dist/src/kernel/index.js +34 -0
  329. package/dist/src/kernel/index.js.map +1 -0
  330. package/dist/src/kernel/interactivity.js +68 -0
  331. package/dist/src/kernel/interactivity.js.map +1 -0
  332. package/dist/src/kernel/packs/collect.js +187 -0
  333. package/dist/src/kernel/packs/collect.js.map +1 -0
  334. package/dist/src/kernel/packs/compile.js +304 -0
  335. package/dist/src/kernel/packs/compile.js.map +1 -0
  336. package/dist/src/kernel/packs/disclosure.js +76 -0
  337. package/dist/src/kernel/packs/disclosure.js.map +1 -0
  338. package/dist/src/kernel/packs/glob.js +38 -0
  339. package/dist/src/kernel/packs/glob.js.map +1 -0
  340. package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
  341. package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
  342. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
  343. package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
  344. package/dist/src/kernel/packs/graphql/index.js +20 -0
  345. package/dist/src/kernel/packs/graphql/index.js.map +1 -0
  346. package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
  347. package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
  348. package/dist/src/kernel/packs/index.js +34 -0
  349. package/dist/src/kernel/packs/index.js.map +1 -0
  350. package/dist/src/kernel/packs/iri.js +110 -0
  351. package/dist/src/kernel/packs/iri.js.map +1 -0
  352. package/dist/src/kernel/packs/renderPack.js +129 -0
  353. package/dist/src/kernel/packs/renderPack.js.map +1 -0
  354. package/dist/src/kernel/packs/resolveEntity.js +274 -0
  355. package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
  356. package/dist/src/kernel/packs/runBodies.js +140 -0
  357. package/dist/src/kernel/packs/runBodies.js.map +1 -0
  358. package/dist/src/kernel/packs/sample.js +56 -0
  359. package/dist/src/kernel/packs/sample.js.map +1 -0
  360. package/dist/src/kernel/packs/schema.js +421 -0
  361. package/dist/src/kernel/packs/schema.js.map +1 -0
  362. package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
  363. package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
  364. package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
  365. package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
  366. package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
  367. package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
  368. package/dist/src/kernel/packs/sparql/escape.js +21 -0
  369. package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
  370. package/dist/src/kernel/packs/sparql/index.js +31 -0
  371. package/dist/src/kernel/packs/sparql/index.js.map +1 -0
  372. package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
  373. package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
  374. package/dist/src/kernel/packs/types.js +30 -0
  375. package/dist/src/kernel/packs/types.js.map +1 -0
  376. package/dist/src/kernel/packs/uniqueness.js +30 -0
  377. package/dist/src/kernel/packs/uniqueness.js.map +1 -0
  378. package/dist/src/kernel/project/cli/buildProgram.js +263 -0
  379. package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
  380. package/dist/src/kernel/project/cli/constants.js +27 -0
  381. package/dist/src/kernel/project/cli/constants.js.map +1 -0
  382. package/dist/src/kernel/project/cli/dispatch.js +420 -0
  383. package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
  384. package/dist/src/kernel/project/cli/exitCodes.js +66 -0
  385. package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
  386. package/dist/src/kernel/project/cli/globalFlags.js +219 -0
  387. package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
  388. package/dist/src/kernel/project/cli/helpFormat.js +58 -0
  389. package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
  390. package/dist/src/kernel/project/cli/index.js +14 -0
  391. package/dist/src/kernel/project/cli/index.js.map +1 -0
  392. package/dist/src/kernel/project/cli/rootHelp.js +227 -0
  393. package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
  394. package/dist/src/kernel/project/cli/suggest.js +75 -0
  395. package/dist/src/kernel/project/cli/suggest.js.map +1 -0
  396. package/dist/src/kernel/project/cli/suggestNames.js +96 -0
  397. package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
  398. package/dist/src/kernel/project/cli/verbHelp.js +131 -0
  399. package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
  400. package/dist/src/kernel/project/mcp/buildServer.js +67 -0
  401. package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
  402. package/dist/src/kernel/project/mcp/envelope.js +37 -0
  403. package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
  404. package/dist/src/kernel/project/mcp/index.js +8 -0
  405. package/dist/src/kernel/project/mcp/index.js.map +1 -0
  406. package/dist/src/kernel/project/mcp/instructions.js +44 -0
  407. package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
  408. package/dist/src/kernel/project/mcp/mcpError.js +42 -0
  409. package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
  410. package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
  411. package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
  412. package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
  413. package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
  414. package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
  415. package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
  416. package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
  417. package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
  418. package/dist/src/kernel/project/mcp/serve.js +35 -0
  419. package/dist/src/kernel/project/mcp/serve.js.map +1 -0
  420. package/dist/src/kernel/render/compactUri.js +24 -0
  421. package/dist/src/kernel/render/compactUri.js.map +1 -0
  422. package/dist/src/kernel/render/contracts.js +10 -0
  423. package/dist/src/kernel/render/contracts.js.map +1 -0
  424. package/dist/src/kernel/render/disclosure.js +34 -0
  425. package/dist/src/kernel/render/disclosure.js.map +1 -0
  426. package/dist/src/kernel/render/envelope.js +30 -0
  427. package/dist/src/kernel/render/envelope.js.map +1 -0
  428. package/dist/src/kernel/render/formatters.js +27 -0
  429. package/dist/src/kernel/render/formatters.js.map +1 -0
  430. package/dist/src/kernel/render/index.js +15 -0
  431. package/dist/src/kernel/render/index.js.map +1 -0
  432. package/dist/src/kernel/render/prefixes.js +46 -0
  433. package/dist/src/kernel/render/prefixes.js.map +1 -0
  434. package/dist/src/kernel/render/renderers.js +468 -0
  435. package/dist/src/kernel/render/renderers.js.map +1 -0
  436. package/dist/src/kernel/render/style.js +105 -0
  437. package/dist/src/kernel/render/style.js.map +1 -0
  438. package/dist/src/kernel/render/turtle.js +194 -0
  439. package/dist/src/kernel/render/turtle.js.map +1 -0
  440. package/dist/src/kernel/render/vocabulary.js +174 -0
  441. package/dist/src/kernel/render/vocabulary.js.map +1 -0
  442. package/dist/src/kernel/render/writeStdout.js +43 -0
  443. package/dist/src/kernel/render/writeStdout.js.map +1 -0
  444. package/dist/src/kernel/runtime/boot.js +49 -0
  445. package/dist/src/kernel/runtime/boot.js.map +1 -0
  446. package/dist/src/kernel/runtime/facade.js +39 -0
  447. package/dist/src/kernel/runtime/facade.js.map +1 -0
  448. package/dist/src/kernel/runtime/graphpack/build.js +122 -0
  449. package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
  450. package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
  451. package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
  452. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
  453. package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
  454. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
  455. package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
  456. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
  457. package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
  458. package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
  459. package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
  460. package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
  461. package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
  462. package/dist/src/kernel/runtime/graphpack/index.js +11 -0
  463. package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
  464. package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
  465. package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
  466. package/dist/src/kernel/runtime/graphpack/read.js +92 -0
  467. package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
  468. package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
  469. package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
  470. package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
  471. package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
  472. package/dist/src/kernel/runtime/graphpack/types.js +55 -0
  473. package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
  474. package/dist/src/kernel/runtime/index.js +8 -0
  475. package/dist/src/kernel/runtime/index.js.map +1 -0
  476. package/dist/src/kernel/runtime/loadSession.js +34 -0
  477. package/dist/src/kernel/runtime/loadSession.js.map +1 -0
  478. package/dist/src/kernel/runtime/paths.js +78 -0
  479. package/dist/src/kernel/runtime/paths.js.map +1 -0
  480. package/dist/src/kernel/runtime/probe.js +37 -0
  481. package/dist/src/kernel/runtime/probe.js.map +1 -0
  482. package/dist/src/kernel/runtime/readEntity.js +363 -0
  483. package/dist/src/kernel/runtime/readEntity.js.map +1 -0
  484. package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
  485. package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
  486. package/dist/src/kernel/runtime/refs/index.js +29 -0
  487. package/dist/src/kernel/runtime/refs/index.js.map +1 -0
  488. package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
  489. package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
  490. package/dist/src/kernel/runtime/refs/resolve.js +332 -0
  491. package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
  492. package/dist/src/kernel/runtime/resolveSources.js +62 -0
  493. package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
  494. package/dist/src/kernel/runtime/store.js +75 -0
  495. package/dist/src/kernel/runtime/store.js.map +1 -0
  496. package/dist/src/kernel/runtime/storeReadiness.js +51 -0
  497. package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
  498. package/dist/src/kernel/runtime/types.js +11 -0
  499. package/dist/src/kernel/runtime/types.js.map +1 -0
  500. package/dist/src/kernel/spec/asVerb.js +21 -0
  501. package/dist/src/kernel/spec/asVerb.js.map +1 -0
  502. package/dist/src/kernel/spec/emitReference.js +578 -0
  503. package/dist/src/kernel/spec/emitReference.js.map +1 -0
  504. package/dist/src/kernel/spec/emitSurface.js +202 -0
  505. package/dist/src/kernel/spec/emitSurface.js.map +1 -0
  506. package/dist/src/kernel/spec/index.js +11 -0
  507. package/dist/src/kernel/spec/index.js.map +1 -0
  508. package/dist/src/kernel/spec/surfaceConformance.js +103 -0
  509. package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
  510. package/dist/src/kernel/spec/types.js +14 -0
  511. package/dist/src/kernel/spec/types.js.map +1 -0
  512. package/dist/src/kernel/spec/validate.js +110 -0
  513. package/dist/src/kernel/spec/validate.js.map +1 -0
  514. package/dist/src/kernel/vocabulary.js +97 -0
  515. package/dist/src/kernel/vocabulary.js.map +1 -0
  516. package/dist/src/types.js +11 -0
  517. package/dist/src/types.js.map +1 -0
  518. package/package.json +22 -23
  519. package/pragma.conf.ts +486 -90
  520. package/src/bin.ts +274 -82
  521. package/src/capabilities/block.parity.test.ts +29 -12
  522. package/src/capabilities/block.shipped.exec.test.ts +282 -0
  523. package/src/capabilities/block.tierRank.exec.test.ts +300 -0
  524. package/src/capabilities/capabilities/capabilities.render.ts +1 -1
  525. package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
  526. package/src/capabilities/capabilities/catalog.ts +3 -3
  527. package/src/capabilities/capabilities/hints.ts +32 -7
  528. package/src/capabilities/capabilities/index.ts +1 -1
  529. package/src/capabilities/colophon/collectColophon.ts +35 -24
  530. package/src/capabilities/colophon/colophon.render.ts +24 -1
  531. package/src/capabilities/colophon/colophon.test.ts +42 -21
  532. package/src/capabilities/colophon/colophon.verb.ts +4 -4
  533. package/src/capabilities/config/collectConfigShow.test.ts +1 -0
  534. package/src/capabilities/config/collectConfigShow.ts +3 -3
  535. package/src/capabilities/config/field.render.ts +4 -5
  536. package/src/capabilities/config/fields.ts +17 -10
  537. package/src/capabilities/config/get.verb.ts +70 -0
  538. package/src/capabilities/config/getUnset.test.ts +264 -0
  539. package/src/capabilities/config/index.ts +5 -1
  540. package/src/capabilities/config/runField.ts +40 -22
  541. package/src/capabilities/config/runGet.ts +34 -0
  542. package/src/capabilities/config/runSet.ts +35 -9
  543. package/src/capabilities/config/set.test.ts +48 -14
  544. package/src/capabilities/config/set.verb.ts +8 -7
  545. package/src/capabilities/config/show.render.ts +1 -1
  546. package/src/capabilities/config/show.verb.ts +9 -6
  547. package/src/capabilities/config/types.ts +18 -4
  548. package/src/capabilities/config/unset.verb.ts +58 -0
  549. package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
  550. package/src/capabilities/create/byteEquality.test.ts +25 -11
  551. package/src/capabilities/create/cliProjection.ts +227 -0
  552. package/src/capabilities/create/constants.ts +36 -61
  553. package/src/capabilities/create/create.mcp.test.ts +89 -5
  554. package/src/capabilities/create/create.render.ts +71 -7
  555. package/src/capabilities/create/create.test.ts +433 -219
  556. package/src/capabilities/create/create.verb.ts +297 -328
  557. package/src/capabilities/create/createGrammar.test.ts +865 -0
  558. package/src/capabilities/create/createHelp.ts +71 -0
  559. package/src/capabilities/create/createSurface.generated.ts +400 -0
  560. package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
  561. package/src/capabilities/create/cwdJail.test.ts +24 -5
  562. package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
  563. package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
  564. package/src/capabilities/create/index.ts +7 -4
  565. package/src/capabilities/create/messages.ts +18 -0
  566. package/src/capabilities/create/mount.ts +391 -0
  567. package/src/capabilities/create/pathJail.test.ts +90 -0
  568. package/src/capabilities/create/pathJail.ts +8 -5
  569. package/src/capabilities/create/pickGenerator.ts +23 -35
  570. package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
  571. package/src/capabilities/create/types.ts +20 -0
  572. package/src/capabilities/distribution.parity.test.ts +4 -0
  573. package/src/capabilities/distribution.test.ts +3 -1
  574. package/src/capabilities/distribution.ts +10 -15
  575. package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
  576. package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
  577. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
  578. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
  579. package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
  580. package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
  581. package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
  582. package/src/capabilities/doctor/checks/index.ts +27 -0
  583. package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
  584. package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
  585. package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
  586. package/src/capabilities/doctor/doctor.render.test.ts +125 -38
  587. package/src/capabilities/doctor/doctor.render.ts +74 -74
  588. package/src/capabilities/doctor/doctor.test.ts +338 -37
  589. package/src/capabilities/doctor/doctor.verb.ts +8 -3
  590. package/src/capabilities/doctor/runChecks.ts +65 -63
  591. package/src/capabilities/doctor/types.ts +22 -15
  592. package/src/capabilities/emptyRecovery.test.ts +21 -8
  593. package/src/capabilities/graph/examples.exec.test.ts +107 -0
  594. package/src/capabilities/graph/index.ts +1 -1
  595. package/src/capabilities/graph/inspect.render.ts +70 -22
  596. package/src/capabilities/graph/inspect.test.ts +260 -5
  597. package/src/capabilities/graph/inspect.verb.ts +18 -6
  598. package/src/capabilities/graph/query.render.ts +15 -3
  599. package/src/capabilities/graph/query.verb.ts +3 -3
  600. package/src/capabilities/graph/runQuery.ts +2 -3
  601. package/src/capabilities/index.ts +3 -1
  602. package/src/capabilities/info/collectInfo.ts +13 -5
  603. package/src/capabilities/info/info.render.ts +7 -3
  604. package/src/capabilities/info/info.test.ts +37 -1
  605. package/src/capabilities/info/info.verb.ts +1 -1
  606. package/src/capabilities/info/types.ts +10 -2
  607. package/src/capabilities/lazy.test.ts +32 -0
  608. package/src/capabilities/meta/complete.verb.ts +1 -1
  609. package/src/capabilities/meta/index.ts +1 -1
  610. package/src/capabilities/meta/mcp.verb.ts +10 -8
  611. package/src/capabilities/ontology/index.ts +15 -11
  612. package/src/capabilities/ontology/ontology.test.ts +6 -55
  613. package/src/capabilities/ontology/queries.ts +2 -2
  614. package/src/capabilities/ontology/render.ts +3 -4
  615. package/src/capabilities/ontology/verbs.ts +27 -68
  616. package/src/capabilities/prompt/index.ts +2 -2
  617. package/src/capabilities/prompt/prompt.render.ts +6 -2
  618. package/src/capabilities/prompt/types.ts +1 -1
  619. package/src/capabilities/prompt/verbs.ts +4 -5
  620. package/src/capabilities/reference.test.ts +63 -0
  621. package/src/capabilities/renderVocabularySync.test.ts +82 -0
  622. package/src/capabilities/resources/provider.ts +342 -85
  623. package/src/capabilities/resources/resources.test.ts +355 -59
  624. package/src/capabilities/scopeTypeSync.test.ts +29 -15
  625. package/src/capabilities/setup/buildPlan.ts +240 -0
  626. package/src/capabilities/setup/index.ts +7 -7
  627. package/src/capabilities/setup/mode.ts +74 -0
  628. package/src/capabilities/setup/operations/index.ts +79 -0
  629. package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
  630. package/src/capabilities/setup/operations/setupConfig.ts +124 -0
  631. package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
  632. package/src/capabilities/setup/operations/setupLsp.ts +420 -67
  633. package/src/capabilities/setup/operations/setupMcp.ts +238 -127
  634. package/src/capabilities/setup/operations/setupSkills.ts +667 -105
  635. package/src/capabilities/setup/plan.render.ts +336 -0
  636. package/src/capabilities/setup/plan.ts +241 -0
  637. package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
  638. package/src/capabilities/setup/setup.render.test.ts +297 -75
  639. package/src/capabilities/setup/setup.render.ts +45 -77
  640. package/src/capabilities/setup/setup.test.ts +1819 -225
  641. package/src/capabilities/setup/setup.verb.ts +288 -78
  642. package/src/capabilities/setup/shell.test.ts +86 -0
  643. package/src/capabilities/setup/shell.ts +137 -11
  644. package/src/capabilities/setup/targets.ts +435 -0
  645. package/src/capabilities/setup/types.ts +23 -70
  646. package/src/capabilities/shared/assertExecOk.ts +68 -10
  647. package/src/capabilities/shared/index.ts +43 -0
  648. package/src/capabilities/shared/packageManager.test.ts +470 -0
  649. package/src/capabilities/shared/packageManager.ts +425 -34
  650. package/src/capabilities/skill/bundledSkills.test.ts +347 -0
  651. package/src/capabilities/skill/discover.ts +131 -10
  652. package/src/capabilities/skill/index.ts +1 -1
  653. package/src/capabilities/skill/render.ts +10 -9
  654. package/src/capabilities/skill/skill.test.ts +22 -7
  655. package/src/capabilities/skill/verbs.ts +3 -4
  656. package/src/capabilities/sources/collectStatus.ts +7 -2
  657. package/src/capabilities/sources/index.ts +1 -1
  658. package/src/capabilities/sources/installSkills.ts +265 -10
  659. package/src/capabilities/sources/runUpdate.ts +131 -23
  660. package/src/capabilities/sources/sources.test.ts +382 -2
  661. package/src/capabilities/sources/status.render.ts +1 -1
  662. package/src/capabilities/sources/status.verb.ts +1 -1
  663. package/src/capabilities/sources/update.render.ts +1 -1
  664. package/src/capabilities/sources/update.verb.ts +4 -4
  665. package/src/capabilities/surface.test.ts +136 -19
  666. package/src/capabilities/upgrade/runUpgrade.ts +53 -14
  667. package/src/capabilities/upgrade/types.ts +10 -2
  668. package/src/capabilities/upgrade/upgrade.render.ts +13 -7
  669. package/src/capabilities/upgrade/upgrade.test.ts +75 -3
  670. package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
  671. package/src/capabilities/version/index.ts +12 -0
  672. package/src/capabilities/version/version.test.ts +66 -0
  673. package/src/capabilities/version/version.verb.ts +39 -0
  674. package/src/constants.ts +36 -1
  675. package/src/identity.test.ts +57 -29
  676. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
  677. package/src/kernel/completion/complete.test.ts +12 -2
  678. package/src/kernel/completion/complete.ts +1 -1
  679. package/src/kernel/completion/emitScripts.ts +1 -1
  680. package/src/kernel/completion/entitySource.test.ts +16 -3
  681. package/src/kernel/completion/entitySource.ts +21 -8
  682. package/src/kernel/completion/model.test.ts +164 -12
  683. package/src/kernel/completion/model.ts +94 -14
  684. package/src/kernel/completion/parse.test.ts +4 -7
  685. package/src/kernel/completion/parse.ts +15 -0
  686. package/src/kernel/completion/resolve.test.ts +0 -1
  687. package/src/kernel/completion/safety.test.ts +50 -35
  688. package/src/kernel/completion/shellDrive.test.ts +28 -9
  689. package/src/kernel/completion/templates/bash.ts +7 -2
  690. package/src/kernel/completion/templates/index.ts +23 -0
  691. package/src/kernel/completion/types.ts +7 -0
  692. package/src/kernel/config/defaults.test.ts +27 -3
  693. package/src/kernel/config/defaults.ts +4 -3
  694. package/src/kernel/config/evaluateProjectConfig.ts +31 -8
  695. package/src/kernel/config/firstRun.test.ts +44 -38
  696. package/src/kernel/config/firstRun.ts +24 -88
  697. package/src/kernel/config/index.ts +1 -1
  698. package/src/kernel/config/readConfig.test.ts +6 -3
  699. package/src/kernel/config/readConfig.ts +1 -1
  700. package/src/kernel/config/schema.ts +3 -1
  701. package/src/kernel/config/types.ts +3 -1
  702. package/src/kernel/copy.test.ts +34 -4
  703. package/src/kernel/copy.ts +54 -0
  704. package/src/kernel/error/PragmaError.test.ts +5 -2
  705. package/src/kernel/error/PragmaError.ts +4 -2
  706. package/src/kernel/error/constants.ts +7 -5
  707. package/src/kernel/error/fromTaskError.ts +28 -6
  708. package/src/kernel/error/recovery.ts +14 -0
  709. package/src/kernel/error/renderError.ts +42 -1
  710. package/src/kernel/error/types.ts +21 -1
  711. package/src/kernel/index.ts +35 -0
  712. package/src/kernel/interactivity.test.ts +76 -0
  713. package/src/kernel/interactivity.ts +69 -0
  714. package/src/kernel/packs/collect.ts +12 -16
  715. package/src/kernel/packs/compile.test.ts +222 -1
  716. package/src/kernel/packs/compile.ts +93 -3
  717. package/src/kernel/packs/disclosure.ts +2 -2
  718. package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
  719. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
  720. package/src/kernel/packs/graphql/index.ts +20 -0
  721. package/src/kernel/packs/index.ts +40 -0
  722. package/src/kernel/packs/iri.test.ts +73 -0
  723. package/src/kernel/packs/iri.ts +66 -14
  724. package/src/kernel/packs/renderPack.ts +25 -6
  725. package/src/kernel/packs/resolveEntity.test.ts +274 -0
  726. package/src/kernel/packs/resolveEntity.ts +200 -42
  727. package/src/kernel/packs/runBodies.ts +86 -22
  728. package/src/kernel/packs/sample.ts +1 -1
  729. package/src/kernel/packs/schema.ts +78 -5
  730. package/src/kernel/packs/sparql/applyFilters.ts +136 -16
  731. package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
  732. package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
  733. package/src/kernel/packs/sparql/index.ts +37 -0
  734. package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
  735. package/src/kernel/packs/sparql/runSelect.ts +3 -4
  736. package/src/kernel/packs/toolDescription.test.ts +77 -4
  737. package/src/kernel/packs/types.ts +136 -0
  738. package/src/kernel/packs/uniqueness.ts +1 -1
  739. package/src/kernel/project/cli/buildProgram.test.ts +218 -12
  740. package/src/kernel/project/cli/buildProgram.ts +84 -18
  741. package/src/kernel/project/cli/constants.ts +34 -0
  742. package/src/kernel/project/cli/dispatch.test.ts +160 -2
  743. package/src/kernel/project/cli/dispatch.ts +226 -45
  744. package/src/kernel/project/cli/exitCodes.ts +1 -1
  745. package/src/kernel/project/cli/globalFlags.test.ts +117 -1
  746. package/src/kernel/project/cli/globalFlags.ts +134 -31
  747. package/src/kernel/project/cli/helpFormat.ts +14 -2
  748. package/src/kernel/project/cli/rootHelp.ts +74 -12
  749. package/src/kernel/project/cli/suggest.test.ts +33 -1
  750. package/src/kernel/project/cli/suggest.ts +25 -1
  751. package/src/kernel/project/cli/verbHelp.test.ts +30 -0
  752. package/src/kernel/project/cli/verbHelp.ts +23 -7
  753. package/src/kernel/project/mcp/buildServer.ts +7 -4
  754. package/src/kernel/project/mcp/envelope.ts +2 -2
  755. package/src/kernel/project/mcp/instructions.ts +2 -2
  756. package/src/kernel/project/mcp/mcpError.ts +1 -1
  757. package/src/kernel/project/mcp/parity.test.ts +5 -2
  758. package/src/kernel/project/mcp/prompts/index.ts +37 -0
  759. package/src/kernel/project/mcp/prompts/source.ts +2 -2
  760. package/src/kernel/project/mcp/registerVerb.ts +55 -10
  761. package/src/kernel/project/mcp/serve.ts +2 -2
  762. package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
  763. package/src/kernel/render/contracts.ts +21 -0
  764. package/src/kernel/render/envelope.ts +2 -3
  765. package/src/kernel/render/formatters.ts +1 -1
  766. package/src/kernel/render/renderers.test.ts +243 -6
  767. package/src/kernel/render/renderers.ts +222 -20
  768. package/src/kernel/render/style.test.ts +75 -24
  769. package/src/kernel/render/style.ts +59 -6
  770. package/src/kernel/render/turtle.ts +222 -0
  771. package/src/kernel/render/vocabulary.ts +276 -0
  772. package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
  773. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
  774. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
  775. package/src/kernel/runtime/graphpack/embedded.ts +3 -3
  776. package/src/kernel/runtime/graphpack/manifest.ts +1 -1
  777. package/src/kernel/runtime/graphpack/read.ts +1 -2
  778. package/src/kernel/runtime/loadSession.ts +1 -1
  779. package/src/kernel/runtime/probe.ts +6 -6
  780. package/src/kernel/runtime/readEntity.ts +472 -28
  781. package/src/kernel/runtime/refs/index.ts +39 -0
  782. package/src/kernel/runtime/refs/parseRef.ts +2 -2
  783. package/src/kernel/runtime/refs/resolve.ts +4 -4
  784. package/src/kernel/runtime/storeReadiness.ts +1 -2
  785. package/src/kernel/runtime/types.ts +15 -1
  786. package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
  787. package/src/kernel/spec/emitReference.ts +105 -30
  788. package/src/kernel/spec/emitSurface.ts +48 -6
  789. package/src/kernel/spec/surfaceConformance.test.ts +4 -2
  790. package/src/kernel/spec/types.ts +277 -4
  791. package/src/testing/PARITY_GAPS.ts +9 -3
  792. package/src/testing/behavioral/docExamples.test.ts +16 -0
  793. package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
  794. package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
  795. package/src/testing/behavioral/journeys.cli.test.ts +1 -1
  796. package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
  797. package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
  798. package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
  799. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
  800. package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
  801. package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
  802. package/src/testing/behavioral/mcpSurface.test.ts +1 -1
  803. package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
  804. package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
  805. package/src/testing/eval/cases/effectful.ts +3 -2
  806. package/src/testing/eval/cases/readNouns.ts +245 -9
  807. package/src/testing/fixtures/blockGraph.ts +104 -10
  808. package/src/testing/fixtures/graph/canonical.ts +182 -13
  809. package/src/testing/fixtures/graph/defaultPack.ts +1 -1
  810. package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
  811. package/src/testing/helpers/projectMcp.ts +32 -6
  812. package/src/testing/helpers/runCli.ts +35 -18
  813. package/src/testing/perf/budgets.test.ts +20 -9
  814. package/src/testing/perf/budgets.ts +58 -9
  815. package/src/testing/perf/codegen.test.ts +126 -0
  816. package/src/testing/perf/globalSetup.test.ts +286 -0
  817. package/src/testing/perf/globalSetup.ts +505 -23
  818. package/src/testing/perf/measure.test.ts +38 -0
  819. package/src/testing/perf/measure.ts +23 -4
  820. package/src/testing/setupXdgIsolation.ts +81 -21
  821. package/src/testing/tempRoot.globalSetup.ts +122 -0
  822. package/dist/pragma +0 -0
  823. package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
  824. package/src/capabilities/create/templates.embedded.generated.ts +0 -28
  825. package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
  826. package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
  827. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
  828. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
  829. package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
  830. package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
  831. package/src/capabilities/shared/bands.ts +0 -16
  832. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Generated, injection-safe SPARQL lookup queries for a pack story.
3
+ *
4
+ * Pack authors declare *what* names an entity (`by`, optional `type`/`types`)
5
+ * and which properties to read; the query text is generated here so
6
+ * user-supplied names are always escaped SPARQL string literals, and level-gated
7
+ * fields below the active level are excluded from the projection (fetch-gating).
8
+ * Matching on the name is exact and case-insensitive.
9
+ *
10
+ * WHAT an entity's name IS lives in one place — {@link nameBinding} — and every
11
+ * form here uses it: the asserted `by` value, plus, for a lookup that DECLARES
12
+ * `nameFallback: "iri"`, the IRI-derived name its class constraint can vouch
13
+ * for. That single binding is what makes the population a `list` publishes and
14
+ * the population a `lookup` answers to the same population.
15
+ *
16
+ * A name-addressed resolve RANKS, and returns every row it ranked. A name can
17
+ * reach several entities (25 of the live design system's block names do), and
18
+ * the `LIMIT 1` that used to sit under the ordering discarded all but the first
19
+ * inside the STORE, where nothing downstream could see that it had happened —
20
+ * `block lookup button` answered with Launchpad's Button and gave no sign the
21
+ * global one existed, because `apps_launchpad…` sorts before `global…`.
22
+ *
23
+ * The limit is gone from the NAME forms so the resolver can see what it is
24
+ * choosing between. It still answers with one entity — the arity is the tool's
25
+ * contract — but the rows it did not take become the IRIs of its notice, which
26
+ * is the only address that reaches them. (An IRI-addressed form keeps its
27
+ * `LIMIT 1`: an IRI is one entity by construction, so there is nothing to rank
28
+ * and nothing set aside.)
29
+ *
30
+ * The losers are NOT free, and an earlier draft of this comment claimed they
31
+ * were. `lookupProjection`'s optionals sit in the same SELECT as the ranking, so
32
+ * every matching URI has its declared fields projected, and a multi-valued field
33
+ * multiplies rows per entity before `firstRowPerEntity` throws them away. On the
34
+ * live graph that is small — 25 shared names, two entities each — but it is a
35
+ * product, not a constant, and the honest shape is a two-phase resolve: rank the
36
+ * URIs in a minimal SELECT, then project fields for the ones actually answered
37
+ * with. That restructure is deliberately not done here: it is the same query the
38
+ * pending no-limit change would rewrite again, and doing it twice would land two
39
+ * migrations on one seam.
40
+ *
41
+ * The order is {@link rankingClause}'s `?score`, then `STR(?uri)`. The score
42
+ * multiplies the two things a pack may declare about which entity a bare name
43
+ * MEANS — `weights` (which KIND of thing) and `scopeWeight` (WHOSE) — and a
44
+ * story that declares neither falls through to `STR(?uri)` alone, a total,
45
+ * engine-independent order over a variable that is always bound (`?uri` carries
46
+ * the class constraint, or the `by` triple when the name is not derived), so it
47
+ * needs no unbound-value sentinel. That final key is what makes the ranking a
48
+ * TOTAL order rather than a better arbitrary one.
49
+ */
50
+ import { activeExpands, activeFields } from "../disclosure.js";
51
+ import { escapeSparqlString, formatTerm } from "./escape.js";
52
+ /**
53
+ * The class-constraint clause for a lookup: a single `a` triple for `type`, a
54
+ * VALUES-constrained type triple for `types`, or nothing. All terms are
55
+ * validated pack terms, never user input.
56
+ */
57
+ function buildTypeConstraint(lookup) {
58
+ if (lookup.type) {
59
+ return ` ?uri a ${formatTerm(lookup.type)} .\n`;
60
+ }
61
+ if (lookup.types && lookup.types.length > 0) {
62
+ const values = lookup.types.map(formatTerm).join(" ");
63
+ return ` VALUES ?packType { ${values} }\n ?uri a ?packType .\n`;
64
+ }
65
+ return "";
66
+ }
67
+ /**
68
+ * The gated projection shared by both lookup forms: the `?uri ?name <vars>`
69
+ * SELECT header, the class constraint, and the OPTIONAL field triples, all
70
+ * restricted to the fields active at `level`. The name- and IRI-addressed forms
71
+ * differ ONLY in how `?uri` is bound (a `FILTER` on the escaped name vs a `BIND`
72
+ * of the resolved IRI), so both thread the active level through here and gate
73
+ * identically — an IRI-addressed lookup honours `--detail` just like a name one.
74
+ *
75
+ * `constraint` and `optionals` are handed back SEPARATELY because the `?name`
76
+ * binding has to sit between them: it reads `?uri`, which the class constraint
77
+ * binds, and a SPARQL `BIND` may only name variables already in scope.
78
+ */
79
+ function lookupProjection(lookup, level) {
80
+ const fields = activeFields(lookup, level);
81
+ const vars = fields.map((field) => `?${field.name}`).join(" ");
82
+ const optionals = fields
83
+ .map((field) => ` OPTIONAL { ?uri ${formatTerm(field.property)} ?${field.name} . }`)
84
+ .join("\n");
85
+ return {
86
+ header: `SELECT ?uri ?name${vars.length > 0 ? ` ${vars}` : ""} WHERE {`,
87
+ constraint: buildTypeConstraint(lookup).trimEnd(),
88
+ optionals,
89
+ };
90
+ }
91
+ /**
92
+ * The IRI-derived display name, in ONE spelling every relaxed form shares.
93
+ *
94
+ * The local name is everything after the last `#` or `/`, and its dot-separated
95
+ * hierarchy segments are published with slashes — `cs:react.component.props` →
96
+ * `react/component/props`. That is not an invention here: it is the derivation
97
+ * the `standard` list story already performs to PUBLISH a row's name, so this is
98
+ * the same rule read from the other side. Written once, so the name a list hands
99
+ * out and the name a lookup answers to cannot drift apart.
100
+ */
101
+ const DERIVED_NAME = 'REPLACE(REPLACE(STR(?uri), "^.*[#/]", ""), "\\\\.", "/")';
102
+ /**
103
+ * The `?name` binding shared by every lookup form.
104
+ *
105
+ * By DEFAULT the `by` triple is required, and that is the honest default: `by`
106
+ * is documented as "the property whose value names the entity", so an entity
107
+ * without one has no name, is not addressable, and is not drawn by `sample`.
108
+ * It is also the one thing standing between a typo'd IRI and an empty entity.
109
+ *
110
+ * A story whose `list` SYNTHESIZES a name instead of reading one declares
111
+ * `nameFallback: "iri"`, and then the triple becomes OPTIONAL with
112
+ * {@link DERIVED_NAME} behind it. `standard` is the case that exists: 22 of the
113
+ * 156 live code standards carry a `cs:name`, and the code-standards ontology
114
+ * says so deliberately — it is "an optional human-readable display title" that
115
+ * "never participates in identity". `standard list` published
116
+ * `react/component/tsdoc` while `standard lookup react/component/tsdoc`
117
+ * answered ENTITY_NOT_FOUND with empty suggestions, because the only
118
+ * addressable population was the ~13% carrying an asserted name.
119
+ *
120
+ * INFERRING the fallback from the mere PRESENCE of a class constraint is what
121
+ * this option replaced, and it was over-reach in both directions of the same
122
+ * defect: `token list` requires `ds:tokenId`, so an inferred fallback made a
123
+ * `ds:Token` without one addressable and sampleable under a name `token list`
124
+ * never publishes. The declaration is per story because the list/lookup
125
+ * agreement is per story.
126
+ *
127
+ * The class constraint is still required for the fallback (the schema rejects
128
+ * the pairing, and this guard keeps a statically-compiled story from generating
129
+ * a query with nothing bounding `?uri`): a derived name is only as trustworthy
130
+ * as the class vouching for the entity it came from.
131
+ *
132
+ * One binding then serves the name resolve, the miss-suggestion pool, glob
133
+ * expansion and `sample`'s draw pool alike — every form that decides WHICH
134
+ * entities a name can reach. (The IRI-addressed forms reach an entity without
135
+ * going through a name at all: see {@link iriNameBinding}.)
136
+ */
137
+ function nameBinding(lookup) {
138
+ if (!derivesNames(lookup))
139
+ return ` ?uri ${formatTerm(lookup.by)} ?name .`;
140
+ return [
141
+ ` OPTIONAL { ?uri ${formatTerm(lookup.by)} ?byName . }`,
142
+ ` BIND(COALESCE(?byName, ${DERIVED_NAME}) AS ?name)`,
143
+ ].join("\n");
144
+ }
145
+ /**
146
+ * Whether this lookup names an entity that carries no `by` value.
147
+ *
148
+ * The class constraint is part of the condition, not merely a schema rule the
149
+ * builders trust: without one there is no triple bounding `?uri`, so a derived
150
+ * name would be scanned over the whole graph. The schema rejects the pairing
151
+ * for declared packs; this keeps a statically-compiled story from generating
152
+ * that query.
153
+ */
154
+ function derivesNames(lookup) {
155
+ return (lookup.nameFallback === "iri" &&
156
+ Boolean(lookup.type ?? lookup.types?.length));
157
+ }
158
+ /**
159
+ * The `?name` binding for an IRI-ADDRESSED form.
160
+ *
161
+ * An IRI names the entity by itself, so here the `by` value is a LABEL to
162
+ * project, not the thing that identifies it — and the class constraint is
163
+ * already a sufficient existence check. So the triple is OPTIONAL wherever a
164
+ * class vouches for the entity, and `?name` is simply left unbound when there is
165
+ * no label; it is REQUIRED only for a lookup constraining no class, where it is
166
+ * the one thing standing between a typo'd IRI and an empty entity.
167
+ *
168
+ * A story that {@link derivesNames} gets the same COALESCE the name forms use,
169
+ * so an entity reached by IRI reports the name `list` published for it rather
170
+ * than a blank.
171
+ */
172
+ function iriNameBinding(lookup) {
173
+ if (derivesNames(lookup))
174
+ return nameBinding(lookup);
175
+ const named = `?uri ${formatTerm(lookup.by)} ?name .`;
176
+ const constrained = Boolean(lookup.type ?? lookup.types?.length);
177
+ return constrained ? ` OPTIONAL { ${named} }` : ` ${named}`;
178
+ }
179
+ /**
180
+ * Render a declared weight as a SPARQL numeric literal (never exponential).
181
+ *
182
+ * `toFixed` is the wrong instrument twice over, and both bite inside the 0–1
183
+ * range the schema allows. It ROUNDS — `0.1234567` became `0.123457`, silently
184
+ * altering a ranking a pack author declared — and stripping the trailing zeros
185
+ * off its output turns `0.0000001` into `0.`, which is not a numeric literal at
186
+ * all and makes the query a parse error rather than a wrong answer.
187
+ *
188
+ * `String` already prints the shortest exact round-trip, so it is the right
189
+ * source of digits; the only thing it does that SPARQL cannot read is
190
+ * exponent notation, which xsd:decimal's grammar has no form for. Expand that
191
+ * case and pass everything else through untouched.
192
+ */
193
+ function sparqlNumber(value) {
194
+ if (Number.isInteger(value))
195
+ return String(value);
196
+ const text = String(value);
197
+ const exponent = /e-(\d+)$/i.exec(text);
198
+ if (exponent === null)
199
+ return text;
200
+ // `1e-7` / `1.5e-7`: the decimal places needed are the exponent plus whatever
201
+ // the mantissa already carried, which is exact — no rounding can occur.
202
+ const mantissaPlaces = text.split("e")[0]?.split(".")[1]?.length ?? 0;
203
+ return value.toFixed(Number(exponent[1]) + mantissaPlaces);
204
+ }
205
+ /**
206
+ * `left * right`, guarded where an operand may be ZERO.
207
+ *
208
+ * Not defensiveness — a MEASURED engine defect, and the top scope hits it every
209
+ * time. oxigraph raises on an xsd:decimal times a zero (`0.2 * 0` errors, while
210
+ * `0.2 * 1` is `0.2`), and a raising expression inside a `BIND` leaves its
211
+ * variable unbound. Written the arithmetic way, the depth-0 scope — the one that
212
+ * is supposed to WIN — is the only one whose weight never binds, and what
213
+ * happens next is decided by whatever the surrounding `COALESCE` falls back to.
214
+ * The same expression on the `block list` side fell back to 0 and sorted every
215
+ * top-tier row LAST, which is how this was found. Both sides now say what they
216
+ * mean. Only VARIABLE operands are tested; a declared literal is resolved at
217
+ * build time by the callers.
218
+ */
219
+ function sparqlProduct(left, right) {
220
+ const guards = [left, right]
221
+ .filter((operand) => operand.startsWith("?"))
222
+ .map((operand) => `${operand} = 0`);
223
+ const product = `${left} * ${right}`;
224
+ return guards.length === 0
225
+ ? product
226
+ : `IF(${guards.join(" || ")}, 0, ${product})`;
227
+ }
228
+ /**
229
+ * The type factor: the LOWEST weight declared for any class the entity belongs
230
+ * to, 1 when none is.
231
+ *
232
+ * An IF-ladder over `EXISTS` rather than a weight column on the class VALUES,
233
+ * because a join would multiply rows for an entity in two weighted classes and
234
+ * the resolve now returns every row it finds. Lowest weight tested FIRST, so the
235
+ * ladder means MIN — the same rule the MCP listing's `effectiveWeight` states in
236
+ * prose: a demotion any membership asks for is not cancelled by a membership
237
+ * that asked for nothing.
238
+ */
239
+ function typeWeightBind(lookup) {
240
+ const declared = Object.entries(lookup.weights ?? {});
241
+ if (declared.length === 0)
242
+ return "";
243
+ const ladder = [...declared]
244
+ .sort(([aType, aWeight], [bType, bWeight]) => aWeight === bWeight ? aType.localeCompare(bType) : aWeight - bWeight)
245
+ .reduceRight((fallback, [type, weight]) => `IF(EXISTS { ?uri a ${formatTerm(type)} }, ${sparqlNumber(weight)}, ${fallback})`, "1");
246
+ return ` BIND(${ladder} AS ?rankType)`;
247
+ }
248
+ /**
249
+ * The scope factor: how much the entity's containing scope is worth, DERIVED
250
+ * from the depth of that scope's own path-shaped name.
251
+ *
252
+ * Nested OPTIONALs, not a flat sequence: `?rankScope` is unbound for an entity
253
+ * outside any scope, and a following top-level `OPTIONAL { ?rankScope <by> ?n }`
254
+ * would then match every such triple in the graph and multiply the row.
255
+ *
256
+ * The depth is the separator count, so nothing is enumerated and a scope the
257
+ * ontology adds tomorrow inherits its place. `COALESCE` states the retirement
258
+ * path in the query itself: an ASSERTED weight wins, the derived one answers
259
+ * until there is one, and an entity with no scope at all scores a neutral 1
260
+ * rather than dropping below entities that have one.
261
+ */
262
+ function scopeWeightBinds(lookup) {
263
+ const scope = lookup.scopeWeight;
264
+ if (!scope)
265
+ return "";
266
+ const name = "?rankScopeName";
267
+ const asserted = scope.asserted
268
+ ? [
269
+ ` OPTIONAL { ?rankScope ${formatTerm(scope.asserted)} ?rankAsserted . }`,
270
+ ]
271
+ : [];
272
+ // A falloff of 0 ranks every scope alike, so the derived weight is the
273
+ // constant — and the depth it would multiply is never computed.
274
+ const derived = scope.falloff === 0
275
+ ? "1"
276
+ : `1 - ${sparqlProduct(sparqlNumber(scope.falloff), "?rankDepth")}`;
277
+ return [
278
+ " OPTIONAL {",
279
+ ` ?uri ${formatTerm(scope.via)} ?rankScope .`,
280
+ ` OPTIONAL { ?rankScope ${formatTerm(scope.by)} ${name} . }`,
281
+ ...asserted,
282
+ " }",
283
+ ` BIND(STRLEN(${name}) - STRLEN(REPLACE(${name}, "/", "")) AS ?rankDepth)`,
284
+ ` BIND(${derived} AS ?rankDerived)`,
285
+ // Floored at 0: a scope deep enough to drive the factor negative would
286
+ // otherwise INVERT the type factor it multiplies, promoting a part of a
287
+ // block above a whole one.
288
+ ` BIND(COALESCE(${scope.asserted ? "?rankAsserted, " : ""}IF(?rankDerived < 0, 0, ?rankDerived), 1) AS ?rankScopeWeight)`,
289
+ ].join("\n");
290
+ }
291
+ /**
292
+ * The `?score` a name resolve orders by, and the ORDER BY that reads it.
293
+ *
294
+ * The two factors MULTIPLY rather than tiebreak, and that is the editorial
295
+ * ruling, not an implementation convenience: neither question subsumes the
296
+ * other. A whole component in a nested scope (1 × 0.8) outranks a mere PART of a
297
+ * block in the widest one (0.6 × 1), while two components of equal kind are
298
+ * separated by their scopes alone (1 × 1 beats 1 × 0.8). Both live cases fall
299
+ * out of one product.
300
+ *
301
+ * @returns The BIND lines to splice into the WHERE clause, and the ORDER BY
302
+ * line — a story declaring neither factor gets no BINDs and `STR(?uri)` alone.
303
+ */
304
+ function rankingClause(lookup) {
305
+ const factors = [typeWeightBind(lookup), scopeWeightBinds(lookup)].filter((line) => line !== "");
306
+ if (factors.length === 0)
307
+ return { binds: "", orderBy: "ORDER BY STR(?uri)" };
308
+ const terms = [
309
+ lookup.weights && Object.keys(lookup.weights).length > 0 ? "?rankType" : "",
310
+ lookup.scopeWeight ? "?rankScopeWeight" : "",
311
+ ].filter((term) => term !== "");
312
+ return {
313
+ binds: [
314
+ ...factors,
315
+ ` BIND(${terms.length === 2 ? sparqlProduct(terms[0], terms[1]) : terms.join("")} AS ?score)`,
316
+ ].join("\n"),
317
+ orderBy: "ORDER BY DESC(?score) STR(?uri)",
318
+ };
319
+ }
320
+ /**
321
+ * Build the SELECT retrieving the entities a name reaches, with their declared
322
+ * fields, best first. The caller answers with the first and names the rest.
323
+ *
324
+ * @param lookup - The pack's lookup declaration.
325
+ * @param name - User-supplied entity name (escaped here).
326
+ * @param level - Active canonical level; gated fields below it are excluded.
327
+ * @returns SPARQL SELECT text, ranked and unlimited.
328
+ */
329
+ export function buildLookupQuery(lookup, name, level) {
330
+ const { header, constraint, optionals } = lookupProjection(lookup, level);
331
+ const ranking = rankingClause(lookup);
332
+ return [
333
+ header,
334
+ constraint,
335
+ nameBinding(lookup),
336
+ ranking.binds,
337
+ optionals,
338
+ ` FILTER (LCASE(STR(?name)) = LCASE("${escapeSparqlString(name)}"))`,
339
+ "}",
340
+ ranking.orderBy,
341
+ ]
342
+ .filter((line) => line !== "")
343
+ .join("\n");
344
+ }
345
+ /**
346
+ * Build the SELECT retrieving one entity addressed directly by IRI.
347
+ *
348
+ * Binds the already-resolved IRI to `?uri` instead of filtering on the `by`
349
+ * value; otherwise identical to the name form, including level-gating. Injection-
350
+ * safe by construction: the caller validates `iri` against the embeddable-IRI
351
+ * shape BEFORE it is interpolated here — raw user input never reaches this
352
+ * function.
353
+ *
354
+ * @param lookup - The pack's lookup declaration.
355
+ * @param iri - The already-resolved, embeddable entity IRI.
356
+ * @param level - Active canonical level; gated fields below it are excluded.
357
+ */
358
+ export function buildLookupByIriQuery(lookup, iri, level) {
359
+ const { header, constraint, optionals } = lookupProjection(lookup, level);
360
+ return [
361
+ header,
362
+ ` BIND(<${iri}> AS ?uri)`,
363
+ constraint,
364
+ iriNameBinding(lookup),
365
+ optionals,
366
+ "}",
367
+ "LIMIT 1",
368
+ ]
369
+ .filter((line) => line !== "")
370
+ .join("\n");
371
+ }
372
+ /**
373
+ * Build the minimal name→URI resolve for a graphql-sourced lookup (and the
374
+ * shared entry point for the sparql path's name form): maps the user-supplied
375
+ * name to the entity IRIs, everything else comes from the field fetch. The name
376
+ * is an escaped literal; all terms are validated pack terms.
377
+ *
378
+ * Ranked and unlimited, exactly like {@link buildLookupQuery} — the two paths
379
+ * differ in where the VALUES come from, never in which entities a name reaches.
380
+ * `?score` is deliberately NOT projected: it orders the rows and is none of the
381
+ * caller's business, and projecting it would leak a ranking artefact into
382
+ * `--format json`.
383
+ */
384
+ export function buildNameResolveQuery(lookup, name) {
385
+ const ranking = rankingClause(lookup);
386
+ return [
387
+ "SELECT ?uri ?name WHERE {",
388
+ buildTypeConstraint(lookup).trimEnd(),
389
+ nameBinding(lookup),
390
+ ranking.binds,
391
+ ` FILTER (LCASE(STR(?name)) = LCASE("${escapeSparqlString(name)}"))`,
392
+ "}",
393
+ ranking.orderBy,
394
+ ]
395
+ .filter((line) => line !== "")
396
+ .join("\n");
397
+ }
398
+ /**
399
+ * Build the minimal IRI→entity resolve for a graphql-sourced lookup: the mirror
400
+ * of {@link buildNameResolveQuery} for the other argument shape.
401
+ *
402
+ * The GraphQL lane fetches by IRI, so this exists to ANSWER ONE QUESTION — does
403
+ * the pack's class constraint vouch for this entity? — and to pick up a display
404
+ * name if there is one. Injection-safe by construction: `iri` is already
405
+ * resolved and validated against the embeddable-IRI shape by the caller.
406
+ */
407
+ export function buildIriResolveQuery(lookup, iri) {
408
+ return [
409
+ "SELECT ?uri ?name WHERE {",
410
+ ` BIND(<${iri}> AS ?uri)`,
411
+ buildTypeConstraint(lookup).trimEnd(),
412
+ iriNameBinding(lookup),
413
+ "}",
414
+ "LIMIT 1",
415
+ ]
416
+ .filter((line) => line !== "")
417
+ .join("\n");
418
+ }
419
+ /** Build the SELECT listing every entity IRI a lookup can address (IRI globs). */
420
+ export function buildLookupIrisQuery(lookup) {
421
+ const constraint = buildTypeConstraint(lookup).trimEnd();
422
+ return [
423
+ "SELECT DISTINCT ?uri WHERE {",
424
+ // A pack that constrains by class is asking about its class; one that does
425
+ // not has only the `by` triple to bound the scan, so it keeps that bound
426
+ // (and, like the name population, addresses only entities that carry one).
427
+ constraint !== "" ? constraint : ` ?uri ${formatTerm(lookup.by)} ?name .`,
428
+ "}",
429
+ "ORDER BY STR(?uri)",
430
+ ]
431
+ .filter((line) => line !== "")
432
+ .join("\n");
433
+ }
434
+ /**
435
+ * Build the sub-SELECT retrieving one expand's child rows for a resolved entity.
436
+ *
437
+ * Injection-safe: the only interpolated value is `entityUri`, the IRI the base
438
+ * lookup already resolved from the store (never user input); the
439
+ * relation/properties are validated pack terms. SPARQL expands are single-hop,
440
+ * so every select entry here is a plain field.
441
+ */
442
+ export function buildExpandQuery(expand, entityUri) {
443
+ const vars = expand.select.map((field) => `?${field.name}`).join(" ");
444
+ const optionals = expand.select
445
+ .map((field) => "property" in field
446
+ ? ` OPTIONAL { ?child ${formatTerm(field.property)} ?${field.name} . }`
447
+ : "")
448
+ .filter((line) => line !== "")
449
+ .join("\n");
450
+ return [
451
+ `SELECT ${vars} WHERE {`,
452
+ ` <${entityUri}> ${formatTerm(expand.relation)} ?child .`,
453
+ optionals,
454
+ "}",
455
+ ].join("\n");
456
+ }
457
+ /** Build the SELECT listing all entity names — lookup-miss suggestions. */
458
+ export function buildLookupNamesQuery(lookup) {
459
+ return [
460
+ // DISTINCT: this population feeds miss-suggestions and glob expansion, and
461
+ // a name that several entities share is one CANDIDATE, not several. Without
462
+ // it a glob matching such a name expanded to it once per entity carrying
463
+ // it, and `lookup` then resolved each copy to the same winner — so
464
+ // `block lookup 'Butt*'` listed one Button twice while the other Button
465
+ // never appeared at all.
466
+ "SELECT DISTINCT ?name WHERE {",
467
+ buildTypeConstraint(lookup).trimEnd(),
468
+ // Same {@link nameBinding} the resolves use, so the addressable population
469
+ // and the resolvable population are the same population. When they were
470
+ // not, a name a miss-suggestion offered could itself miss, and a glob
471
+ // expanded over a pool the resolve could not answer from.
472
+ nameBinding(lookup),
473
+ "}",
474
+ ]
475
+ .filter((line) => line !== "")
476
+ .join("\n");
477
+ }
478
+ /** Re-export the active-value helpers the GraphQL document generator shares. */
479
+ export { activeExpands, activeFields };
480
+ //# sourceMappingURL=buildLookupQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildLookupQuery.js","sourceRoot":"","sources":["../../../../../src/kernel/packs/sparql/buildLookupQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * SPARQL literal/term escaping for generated pack queries.
3
+ *
4
+ * Pack authors declare RDF terms (prefixed names or IRIs); users supply entity
5
+ * names. The generators here escape user names as SPARQL string literals and
6
+ * render validated terms as query tokens, so a pack definition never
7
+ * interpolates raw user input into query text.
8
+ */
9
+ /** Escape a user-supplied value as a SPARQL string-literal body. */
10
+ export function escapeSparqlString(value) {
11
+ return value
12
+ .replaceAll("\\", "\\\\")
13
+ .replaceAll('"', '\\"')
14
+ .replaceAll("\n", "\\n")
15
+ .replaceAll("\r", "\\r");
16
+ }
17
+ /** Render a validated term (prefixed name or absolute IRI) as a query token. */
18
+ export function formatTerm(term) {
19
+ return term.includes("://") ? `<${term}>` : term;
20
+ }
21
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../../../../../src/kernel/packs/sparql/escape.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK;SACT,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;SACtB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;SACvB,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The SPARQL path — every generated read a pack story performs, and the two
3
+ * row operations that must NOT be generated.
4
+ *
5
+ * The domain is organised around one invariant: user input never reaches query
6
+ * text. The query builders compose only from validated pack terms and escaped
7
+ * literals, so a name a user typed becomes a SPARQL string literal or nothing;
8
+ * `runSelect` is the single choke point every one of those trusted queries
9
+ * goes through, which is what makes "a generated query failed" distinguishable
10
+ * from "the user's own `graph query` failed". Filtering and search then run as
11
+ * predicates over the resolved ROWS rather than as clauses in the query —
12
+ * which is why they live in this domain despite touching no SPARQL at all:
13
+ * they are the operations that would otherwise be tempting to express as query
14
+ * text, and keeping them here keeps the temptation answered.
15
+ *
16
+ * The escaping primitives stay internal. They are how the builders keep that
17
+ * invariant, not a service for composing query text elsewhere — a caller with
18
+ * the escaper is a caller who can build an unvalidated query, which is exactly
19
+ * the shape this domain exists to prevent.
20
+ *
21
+ * Two names re-exported by `buildLookupQuery.ts` for its own callers'
22
+ * convenience — the disclosure-level field and expand selectors — are also
23
+ * omitted. They belong to `kernel/packs/disclosure.ts`; laundering them
24
+ * through here would make this domain look like their owner and freeze a
25
+ * pass-through that has no reason to be permanent.
26
+ */
27
+ export { applyPackFilters } from "./applyFilters.js";
28
+ export { applyPackSearch } from "./applySearch.js";
29
+ export { buildExpandQuery, buildLookupByIriQuery, buildLookupNamesQuery, buildLookupQuery, buildNameResolveQuery, } from "./buildLookupQuery.js";
30
+ export { runSelect } from "./runSelect.js";
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/kernel/packs/sparql/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Run a pack story's SELECT through the query facade and return its rows.
3
+ *
4
+ * The store rejects non-read queries at the engine level; this guards the result
5
+ * shape so a pack whose query is not a SELECT fails with a recoverable config
6
+ * error instead of a shape mismatch downstream. The facade boots the store
7
+ * lazily and auto-applies the pack's prefixes, so generated queries use prefixed
8
+ * terms directly. This is the single choke point for every TRUSTED, generated
9
+ * SPARQL read (list stories, lookup name→URI resolves, expands) — user SPARQL
10
+ * (`graph query`) goes through the facade directly and stays INVALID_INPUT.
11
+ */
12
+ import { cliRecovery, PragmaError } from "../../error/index.js";
13
+ /**
14
+ * True when a trusted, generated query failed because the store does not know a
15
+ * prefix it used. Generated queries are composed from terms the distribution
16
+ * declares and from a pack's own story text, never from user input — so an
17
+ * unknown prefix is never a query bug. It means this store was not built from a
18
+ * pack that binds that term: most often nothing was built at all, and otherwise
19
+ * a store built from a pack whose vocabulary is simply different.
20
+ *
21
+ * For a DISTRIBUTION story both are answered by the same lever
22
+ * (`sources update`), so both are remapped to it; the message says which claim
23
+ * it is actually making, and does NOT assert the store is unbuilt. Widening the
24
+ * detection any further would start hiding query bugs, which is the failure this
25
+ * whole choke point exists to prevent.
26
+ *
27
+ * A story from a package or a user's config is a different diagnosis, which is
28
+ * why {@link runSelect} now takes the query's provenance: see
29
+ * {@link unboundPrefixError}.
30
+ */
31
+ function isUnseededStoreError(error) {
32
+ const message = error instanceof Error ? error.message : String(error);
33
+ return /prefix/i.test(message) && /not\s+found/i.test(message);
34
+ }
35
+ /**
36
+ * The error for a generated query naming a prefix the graph does not bind,
37
+ * diagnosed by WHO declared the story.
38
+ *
39
+ * A distribution story ships with the packs that bind its terms, so the honest
40
+ * reading is "nothing is built yet" (or "what is built came from a pack with a
41
+ * different vocabulary") — both fixed by `sources update`, so it keeps today's
42
+ * STORE_UNAVAILABLE and that recovery.
43
+ *
44
+ * A config or package story is the author's own: they named a prefix the graph
45
+ * does not bind, and `sources update` cannot help them — `buildIndex` already
46
+ * treats the same condition as the ordinary third-party case and degrades
47
+ * gracefully, while this path escalated it. It is a CONFIG_ERROR naming the
48
+ * story, which is the module's own precedent for a declaration that cannot be
49
+ * served (ruling R3).
50
+ */
51
+ function unboundPrefixError(source) {
52
+ if (source.origin !== "distribution") {
53
+ return PragmaError.configError(`Story query in ${source.label} uses a prefix the graph does not bind. ` +
54
+ `Declare it under \`prefixes\`, or use a term the configured packs define.`);
55
+ }
56
+ return PragmaError.storeUnavailable("The local store was not built from a pack that defines every term this read uses.", {
57
+ recovery: cliRecovery("sources update", "Build the local store from the configured packs.",
58
+ // An agent recovers by calling the tool, then retrying (PR9 C1 cold-
59
+ // store retry makes the post-update retry succeed).
60
+ { tool: "sources_update" }),
61
+ });
62
+ }
63
+ /**
64
+ * Run the facade query, remapping a store that cannot answer it. A generated
65
+ * query hitting an unknown prefix surfaces an actionable error — chosen by the
66
+ * story's provenance, see {@link unboundPrefixError} — instead of a raw SPARQL
67
+ * "Prefix not found" wrapped as INTERNAL_ERROR ("report this issue").
68
+ * Returns the inferred facade result type, so this module stays clear of a
69
+ * static `@canonical/ke` import (the lazy-dispatch guard).
70
+ */
71
+ async function queryOrRemap(rt, query, source) {
72
+ try {
73
+ return await rt.query.sparql(query);
74
+ }
75
+ catch (error) {
76
+ if (error instanceof PragmaError)
77
+ throw error;
78
+ if (isUnseededStoreError(error))
79
+ throw unboundPrefixError(source);
80
+ throw error;
81
+ }
82
+ }
83
+ /**
84
+ * @param rt - The runtime (its query facade over the lazy store).
85
+ * @param query - SPARQL SELECT text (prefixes auto-applied by the store).
86
+ * @param source - The story's provenance: its label for attribution, and the
87
+ * layer that declared it, which decides how an unbound prefix is diagnosed.
88
+ * @returns One record per row, keyed by SELECT variable name.
89
+ * @throws PragmaError CONFIG_ERROR when the query is not a SELECT, or when a
90
+ * config/package story names a prefix the graph does not bind;
91
+ * STORE_UNAVAILABLE (exit 3) when a distribution story finds one.
92
+ * @note Impure — queries the store through the facade.
93
+ */
94
+ export async function runSelect(rt, query, source) {
95
+ const result = await queryOrRemap(rt, query, source);
96
+ if (result.type !== "select") {
97
+ throw PragmaError.configError(`Story query in ${source.label} must be a SELECT (got ${result.type}).`);
98
+ }
99
+ return result.bindings;
100
+ }
101
+ //# sourceMappingURL=runSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runSelect.js","sourceRoot":"","sources":["../../../../../src/kernel/packs/sparql/runSelect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIhE;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,kBAAkB,CAAC,MAAmB;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,WAAW,CAC5B,kBAAkB,MAAM,CAAC,KAAK,0CAA0C;YACtE,2EAA2E,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,WAAW,CAAC,gBAAgB,CACjC,mFAAmF,EACnF;QACE,QAAQ,EAAE,WAAW,CACnB,gBAAgB,EAChB,kDAAkD;QAClD,qEAAqE;QACrE,oDAAoD;QACpD,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAC3B;KACF,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,YAAY,CACzB,EAAgC,EAChC,KAAa,EACb,MAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,KAAK,CAAC;QAC9C,IAAI,oBAAoB,CAAC,KAAK,CAAC;YAAE,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAgC,EAChC,KAAa,EACb,MAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,WAAW,CAAC,WAAW,CAC3B,kBAAkB,MAAM,CAAC,KAAK,0BAA0B,MAAM,CAAC,IAAI,IAAI,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,QAAqB,CAAC;AACtC,CAAC"}