@jxsuite/studio 8.0.1 → 9.0.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 (282) hide show
  1. package/dist/chunks/{2020-5wtzce5g.js → 2020-89fz3pfy.js} +3 -3
  2. package/dist/chunks/adapter-ay13gema.js +4 -0
  3. package/dist/chunks/add-new-flow-nmkqpjym.js +4 -0
  4. package/dist/chunks/cf-account-picker-2e06qxey.js +4 -0
  5. package/dist/chunks/cf-settings-5y04810c.js +4 -0
  6. package/dist/chunks/color-04361ttk.js +4 -0
  7. package/dist/chunks/{color-area-6rbra5dy.js → color-area-h8dbasp1.js} +2 -2
  8. package/dist/chunks/{color-field-gy56c94g.js → color-field-qv5r2b16.js} +3 -3
  9. package/dist/chunks/{color-slider-sqqdyf6c.js → color-slider-nz2mrzky.js} +2 -2
  10. package/dist/chunks/{combobox-72h32ejk.js → combobox-6hs00996.js} +2 -2
  11. package/dist/chunks/components-3vf75n83.js +4 -0
  12. package/dist/chunks/content-source-4f2raf4a.js +4 -0
  13. package/dist/chunks/{convert-to-repeater-he70fc2b.js → convert-to-repeater-j9hfcj4f.js} +3 -3
  14. package/dist/chunks/editor-645krvtz.js +4 -0
  15. package/dist/chunks/entry-commands-3qmv8wkr.js +4 -0
  16. package/dist/chunks/{extension-sections-0egb88dm.js → extension-sections-thfke054.js} +3 -3
  17. package/dist/chunks/file-ops-kkhp9ma7.js +4 -0
  18. package/dist/chunks/files-yswdhxrf.js +4 -0
  19. package/dist/chunks/format-host-4g8ex6bz.js +4 -0
  20. package/dist/chunks/fs-events-z9gpvc6t.js +4 -0
  21. package/dist/chunks/grid-open-fm4j183c.js +4 -0
  22. package/dist/chunks/{grid-view-qg1b5eqx.js → grid-view-7d2nx83y.js} +16 -15
  23. package/dist/chunks/{icons-63bjtbs7.js → icons-853n6qt3.js} +2 -2
  24. package/dist/chunks/{iframe-entry-pkgmcgp0.js → iframe-entry-2x9bn5ng.js} +4 -4
  25. package/dist/chunks/{iframe-entry-99nr5zfb.js → iframe-entry-42hpmwz5.js} +4 -4
  26. package/dist/chunks/{iframe-entry-76j8vwwx.js → iframe-entry-b5qgggyp.js} +2 -2
  27. package/dist/chunks/{iframe-entry-2zggzajv.js → iframe-entry-btck0e9s.js} +4 -4
  28. package/dist/chunks/iframe-host-q7fedsmr.js +4 -0
  29. package/dist/chunks/{index-32eqzv1k.js → index-jxmt7vh8.js} +3 -3
  30. package/dist/chunks/index-pt4wh98x.js +4 -0
  31. package/dist/chunks/{javascript-pjp734q4.js → javascript-vmqp56ke.js} +2 -2
  32. package/dist/chunks/{jsonMode-njkvsa02.js → jsonMode-n3wmpant.js} +5 -5
  33. package/dist/chunks/jx-validate-19y62knt.js +4 -0
  34. package/dist/chunks/layers-panel-1qvc83y9.js +4 -0
  35. package/dist/chunks/layers-qf0bc7ze.js +4 -0
  36. package/dist/chunks/{listbox-c421cf8c.js → listbox-7gka1h86.js} +2 -2
  37. package/dist/chunks/lit-html-wyqw04y2.js +4 -0
  38. package/dist/chunks/media-library-f9d5qcjb.js +4 -0
  39. package/dist/chunks/media-picker-rsb1fmk2.js +4 -0
  40. package/dist/chunks/{menu-bdpzbfvs.js → menu-d2jxpgma.js} +2 -2
  41. package/dist/chunks/{monaco-binding-vq1hgnn0.js → monaco-binding-wfhmz89d.js} +3 -3
  42. package/dist/chunks/monaco-buffer-ak0raadw.js +4 -0
  43. package/dist/chunks/{monaco-setup-xrd2cbkp.js → monaco-setup-fty7a8vg.js} +3 -3
  44. package/dist/chunks/notify-4qj70q0x.js +4 -0
  45. package/dist/chunks/parse-n8dfxnqf.js +4 -0
  46. package/dist/chunks/platform-ehg6t9vd.js +4 -0
  47. package/dist/chunks/{popover-b89sfej7.js → popover-9tf4cjrk.js} +2 -2
  48. package/dist/chunks/publish-panel-yhmda3cd.js +4 -0
  49. package/dist/chunks/{publish-quick-qx2455cj.js → publish-quick-12hh8926.js} +3 -3
  50. package/dist/chunks/publish-workspace-hx8qdv9p.js +4 -0
  51. package/dist/chunks/quick-search-r955m3q1.js +4 -0
  52. package/dist/chunks/references-8gxv0x7t.js +4 -0
  53. package/dist/chunks/right-panel-jarwqjpy.js +4 -0
  54. package/dist/chunks/source-control-84qt25m9.js +4 -0
  55. package/dist/chunks/{split-c9zfdgxf.js → split-m5rwn31z.js} +2 -2
  56. package/dist/chunks/studio-0nefxhar.js +7 -0
  57. package/dist/chunks/studio-0rg30pvs.js +5 -0
  58. package/dist/chunks/{studio-s32578pn.js → studio-14hh60j8.js} +4 -4
  59. package/dist/chunks/studio-1cfyd1ys.js +5 -0
  60. package/dist/chunks/studio-2bq7hheq.js +5 -0
  61. package/dist/chunks/{studio-zz9qe3rw.js → studio-32d8wyxq.js} +37 -37
  62. package/dist/chunks/studio-3hpcawh8.js +4 -0
  63. package/dist/chunks/{studio-svb7yyve.js → studio-4j35hgsw.js} +4 -4
  64. package/dist/chunks/{studio-x1x167jh.js → studio-4qg61g9j.js} +4 -4
  65. package/dist/chunks/studio-4rgem12q.js +5 -0
  66. package/dist/chunks/studio-6k9djnxw.js +5 -0
  67. package/dist/chunks/studio-6rbaedw2.js +9 -0
  68. package/dist/chunks/studio-732mw0g8.js +5 -0
  69. package/dist/chunks/studio-79r8msnr.js +7 -0
  70. package/dist/chunks/studio-7q6jdd4h.js +5 -0
  71. package/dist/chunks/{studio-r5qy30vx.js → studio-8hf8qcm1.js} +4 -4
  72. package/dist/chunks/{studio-8tr6cfrc.js → studio-8pne0rx4.js} +4 -4
  73. package/dist/chunks/{studio-y0n7yxea.js → studio-9179bsm7.js} +7 -7
  74. package/dist/chunks/{studio-pbxa5fpc.js → studio-9ff0vqff.js} +3 -3
  75. package/dist/chunks/studio-9gzvypw4.js +5 -0
  76. package/dist/chunks/studio-9ndgd55w.js +5 -0
  77. package/dist/chunks/studio-9ra9e7m4.js +5 -0
  78. package/dist/chunks/studio-a6e5fzve.js +5 -0
  79. package/dist/chunks/studio-a9k86nq6.js +5 -0
  80. package/dist/chunks/studio-ae7a69jc.js +6 -0
  81. package/dist/chunks/studio-aghsg0ds.js +7 -0
  82. package/dist/chunks/{studio-k3xxbagr.js → studio-ajw4k8hp.js} +3 -3
  83. package/dist/chunks/{studio-qmn1xc24.js → studio-apapy17g.js} +4 -4
  84. package/dist/chunks/{studio-8m0y2qe7.js → studio-by8x0jvc.js} +4 -4
  85. package/dist/chunks/{studio-wbcjbhy1.js → studio-c88gq88j.js} +5 -5
  86. package/dist/chunks/{studio-n0c5h6mf.js → studio-cg54vtet.js} +4 -4
  87. package/dist/chunks/studio-dvhxxxbd.js +5 -0
  88. package/dist/chunks/{studio-3q40e3rj.js → studio-e4rq6x0q.js} +4 -4
  89. package/dist/chunks/{studio-fbhxxc5f.js → studio-ekzbgnjp.js} +4 -4
  90. package/dist/chunks/studio-fg4fj9ec.js +10 -0
  91. package/dist/chunks/studio-fj6jzgxw.js +5 -0
  92. package/dist/chunks/{studio-nh6d342n.js → studio-g45r5vm8.js} +7 -7
  93. package/dist/chunks/{studio-a2bvaptz.js → studio-gczve8zf.js} +4 -4
  94. package/dist/chunks/studio-ge08zwpv.js +5 -0
  95. package/dist/chunks/studio-gk9yk8dj.js +12 -0
  96. package/dist/chunks/{studio-bbe4c90a.js → studio-gskkgfe3.js} +4 -4
  97. package/dist/chunks/{studio-83mk4bgg.js → studio-h4jbgne2.js} +8 -8
  98. package/dist/chunks/{studio-b7y5mr30.js → studio-hcy9zeac.js} +4 -4
  99. package/dist/chunks/studio-ht81xjkr.js +5 -0
  100. package/dist/chunks/{studio-jaaz8ce9.js → studio-jr30g4ae.js} +4 -4
  101. package/dist/chunks/{studio-qgh13jtz.js → studio-k5n4es74.js} +4 -4
  102. package/dist/chunks/{studio-ccv2svc6.js → studio-k6hbx2fc.js} +4 -4
  103. package/dist/chunks/{studio-9tmebf0s.js → studio-kqh7fxn6.js} +4 -4
  104. package/dist/chunks/{studio-q0mvbaq6.js → studio-kyw47pet.js} +4 -4
  105. package/dist/chunks/studio-mkw17ngg.js +5 -0
  106. package/dist/chunks/{studio-x9hsze61.js → studio-myb4mf0h.js} +4 -4
  107. package/dist/chunks/studio-n4qq1n57.js +5 -0
  108. package/dist/chunks/studio-nfmpmkqb.js +5 -0
  109. package/dist/chunks/studio-nfwacw31.js +5 -0
  110. package/dist/chunks/{studio-rthyg42z.js → studio-nm86874b.js} +172 -172
  111. package/dist/chunks/studio-nqexty8x.js +16 -0
  112. package/dist/chunks/studio-nr0kcqc6.js +5 -0
  113. package/dist/chunks/{studio-jsgf2q5k.js → studio-nvfa137z.js} +5 -5
  114. package/dist/chunks/studio-psh8mwnw.js +4 -0
  115. package/dist/chunks/studio-qd0cycm4.js +9 -0
  116. package/dist/chunks/{studio-tfkznv39.js → studio-qevf5z9d.js} +4 -4
  117. package/dist/chunks/studio-qs5fmhtj.js +14 -0
  118. package/dist/chunks/studio-ry4789ng.js +7 -0
  119. package/dist/chunks/studio-s4fq9jht.js +5 -0
  120. package/dist/chunks/studio-sc35ttdk.js +5 -0
  121. package/dist/chunks/studio-sm2f0sc6.js +6 -0
  122. package/dist/chunks/{studio-3qeh9t0h.js → studio-spza69tb.js} +5 -5
  123. package/dist/chunks/studio-t6dqnnft.js +5 -0
  124. package/dist/chunks/{studio-43sd2mam.js → studio-tfmhnwyr.js} +3 -3
  125. package/dist/chunks/studio-tn7v8gey.js +6 -0
  126. package/dist/chunks/{studio-tft6r105.js → studio-trcfer2b.js} +4 -4
  127. package/dist/chunks/studio-tyw7tk0x.js +5 -0
  128. package/dist/chunks/{studio-jcnsdaep.js → studio-tyzgte21.js} +4 -4
  129. package/dist/chunks/studio-vtey9w98.js +5 -0
  130. package/dist/chunks/studio-ws2r1d7e.js +5 -0
  131. package/dist/chunks/studio-x2trkhk5.js +5 -0
  132. package/dist/chunks/{studio-mn0476ag.js → studio-xzgp0cp7.js} +4 -4
  133. package/dist/chunks/studio-y47090vq.js +5 -0
  134. package/dist/chunks/{studio-5g0rprdt.js → studio-yjh9gddd.js} +5 -5
  135. package/dist/chunks/studio-ywf9y1e2.js +5 -0
  136. package/dist/chunks/{studio-k7evxqh4.js → studio-z1p91z5a.js} +4 -4
  137. package/dist/chunks/studio-ztppbam0.js +5 -0
  138. package/dist/chunks/{toast-host-1yg5ar8d.js → toast-host-g3r2s0kn.js} +2 -2
  139. package/dist/chunks/toast-w11qpkyz.js +4 -0
  140. package/dist/chunks/{tooltip-yypz28gq.js → tooltip-dj1pvgz7.js} +2 -2
  141. package/dist/chunks/{tree-9xa4hm7n.js → tree-j0ebwr5s.js} +2 -2
  142. package/dist/chunks/{tsMode-epyfz1hv.js → tsMode-byje4a01.js} +5 -5
  143. package/dist/chunks/workspace-7q4arnt3.js +4 -0
  144. package/dist/chunks/workspace-home-ge027kr6.js +4 -0
  145. package/dist/chunks/{ws-client-bv552sfx.js → ws-client-h09h6sqg.js} +3 -3
  146. package/dist/iframe-entry.js +14 -14
  147. package/dist/manifest.json +76 -76
  148. package/dist/studio.js +88 -88
  149. package/package.json +15 -16
  150. package/src/browse/component-examples.ts +15 -224
  151. package/src/browse/library-preview.ts +6 -13
  152. package/src/browse/preview-root.ts +7 -4
  153. package/src/canvas/canvas-utils.ts +18 -4
  154. package/src/canvas/iframe-editable-root.ts +13 -4
  155. package/src/canvas/iframe-entry.ts +3 -1
  156. package/src/canvas/iframe-interaction.ts +11 -2
  157. package/src/canvas/iframe-render.ts +25 -3
  158. package/src/canvas/preview-placeholder.ts +120 -0
  159. package/src/collab/collab-session.ts +6 -2
  160. package/src/commands/context.ts +4 -0
  161. package/src/commands/defaults.ts +2 -0
  162. package/src/commands/live-context.ts +2 -0
  163. package/src/editor/shortcuts.ts +3 -0
  164. package/src/files/files.ts +6 -3
  165. package/src/new-project/new-project-modal.ts +1 -4
  166. package/src/panels/ai-panel.ts +27 -34
  167. package/src/panels/component-preview.ts +5 -0
  168. package/src/panels/pane-context.ts +43 -18
  169. package/src/panels/site-model.ts +7 -19
  170. package/src/panels/site-panel.ts +2 -25
  171. package/src/panels/stylebook-doc.ts +2 -53
  172. package/src/platform.ts +20 -0
  173. package/src/platforms/devserver.ts +2 -120
  174. package/src/services/ai-ask.ts +29 -171
  175. package/src/services/ai-command-tools.ts +40 -50
  176. package/src/services/ai-import-tools.ts +4 -5
  177. package/src/services/ai-project-tools.ts +13 -3
  178. package/src/services/ai-tools.ts +26 -564
  179. package/src/services/ai-writes.ts +84 -2
  180. package/src/services/document-assistant.ts +29 -58
  181. package/src/services/harness/assistant-tools.ts +68 -0
  182. package/src/services/harness/interaction-store.ts +118 -0
  183. package/src/services/harness/studio-documents.ts +105 -0
  184. package/src/services/harness/turn-hooks.ts +1 -6
  185. package/src/services/project-adoption.ts +8 -16
  186. package/src/services/references.ts +0 -0
  187. package/src/services/tool-executor.ts +25 -22
  188. package/src/state.ts +3 -13
  189. package/src/style/stylebook-specimens.ts +11 -15
  190. package/src/surfaces/files-panel.json +12 -0
  191. package/src/surfaces/files-panel.ts +5 -2
  192. package/src/surfaces/pane-context.json +286 -265
  193. package/src/surfaces/pane-context.ts +17 -8
  194. package/src/surfaces/welcome.ts +4 -1
  195. package/src/tabs/selection.ts +14 -109
  196. package/src/tabs/tab.ts +15 -7
  197. package/src/tabs/transact.ts +316 -124
  198. package/src/types.ts +13 -8
  199. package/src/utils/geometry.ts +49 -2
  200. package/dist/chunks/adapter-5tphg7xe.js +0 -4
  201. package/dist/chunks/add-new-flow-psym14sn.js +0 -4
  202. package/dist/chunks/cf-account-picker-haqazq5r.js +0 -4
  203. package/dist/chunks/cf-settings-h2wrh6hq.js +0 -4
  204. package/dist/chunks/color-m7r1vk54.js +0 -4
  205. package/dist/chunks/components-r22xca09.js +0 -4
  206. package/dist/chunks/content-source-mmppmcyg.js +0 -4
  207. package/dist/chunks/editor-ccd9jwsa.js +0 -4
  208. package/dist/chunks/entry-commands-6qxz9e8p.js +0 -4
  209. package/dist/chunks/file-ops-qnab36ek.js +0 -4
  210. package/dist/chunks/files-rcn56qvm.js +0 -4
  211. package/dist/chunks/format-host-yxz0kjjs.js +0 -4
  212. package/dist/chunks/fs-events-d1qxq4z4.js +0 -4
  213. package/dist/chunks/grid-open-4z1g062t.js +0 -4
  214. package/dist/chunks/iframe-host-ssv7kyj0.js +0 -4
  215. package/dist/chunks/index-f0jn7nnp.js +0 -4
  216. package/dist/chunks/jx-validate-ttasrbh7.js +0 -4
  217. package/dist/chunks/layers-bgyr11tr.js +0 -4
  218. package/dist/chunks/layers-panel-7ez66zeq.js +0 -4
  219. package/dist/chunks/lit-html-v9gh687x.js +0 -4
  220. package/dist/chunks/media-library-sq468wts.js +0 -4
  221. package/dist/chunks/media-picker-shfe59pt.js +0 -4
  222. package/dist/chunks/monaco-buffer-3afgwvbp.js +0 -4
  223. package/dist/chunks/notify-kzrjr3fv.js +0 -4
  224. package/dist/chunks/parse-v77xtwv7.js +0 -4
  225. package/dist/chunks/platform-7v4rtd7m.js +0 -4
  226. package/dist/chunks/publish-panel-2z9gw8ee.js +0 -4
  227. package/dist/chunks/publish-workspace-wrc1dgwx.js +0 -4
  228. package/dist/chunks/quick-search-n0t0eqxb.js +0 -4
  229. package/dist/chunks/references-9547rg5s.js +0 -4
  230. package/dist/chunks/right-panel-wsgnr9pn.js +0 -4
  231. package/dist/chunks/source-control-kwktr9y6.js +0 -4
  232. package/dist/chunks/studio-03ct6yfv.js +0 -9
  233. package/dist/chunks/studio-07rcfje3.js +0 -5
  234. package/dist/chunks/studio-3e54qh39.js +0 -7
  235. package/dist/chunks/studio-3exxhz5g.js +0 -5
  236. package/dist/chunks/studio-3qqjeep5.js +0 -6
  237. package/dist/chunks/studio-4hp8pkyt.js +0 -5
  238. package/dist/chunks/studio-58xg6j2q.js +0 -9
  239. package/dist/chunks/studio-6m380wp7.js +0 -5
  240. package/dist/chunks/studio-80jyh1xh.js +0 -4
  241. package/dist/chunks/studio-8vcvfs7r.js +0 -6
  242. package/dist/chunks/studio-bavb31r0.js +0 -5
  243. package/dist/chunks/studio-c05wdnt3.js +0 -5
  244. package/dist/chunks/studio-d5grtb9e.js +0 -16
  245. package/dist/chunks/studio-df0baea9.js +0 -5
  246. package/dist/chunks/studio-dgk4dqtx.js +0 -7
  247. package/dist/chunks/studio-e1g64q43.js +0 -5
  248. package/dist/chunks/studio-ed1hp6zf.js +0 -6
  249. package/dist/chunks/studio-ed3xx40h.js +0 -7
  250. package/dist/chunks/studio-f14e1zdj.js +0 -5
  251. package/dist/chunks/studio-fyh0jc96.js +0 -5
  252. package/dist/chunks/studio-gcxk20n7.js +0 -5
  253. package/dist/chunks/studio-kt3pjkwd.js +0 -5
  254. package/dist/chunks/studio-m8g16bgz.js +0 -5
  255. package/dist/chunks/studio-mx1smyq0.js +0 -5
  256. package/dist/chunks/studio-nqxqf8p2.js +0 -4
  257. package/dist/chunks/studio-p4nrkvqr.js +0 -5
  258. package/dist/chunks/studio-pgmvdv7z.js +0 -7
  259. package/dist/chunks/studio-ph84avkf.js +0 -5
  260. package/dist/chunks/studio-q0tccd43.js +0 -5
  261. package/dist/chunks/studio-q7rtx6zq.js +0 -14
  262. package/dist/chunks/studio-qwdqwkj0.js +0 -5
  263. package/dist/chunks/studio-rj9eamf8.js +0 -5
  264. package/dist/chunks/studio-rptgsk96.js +0 -5
  265. package/dist/chunks/studio-s19tp1xr.js +0 -5
  266. package/dist/chunks/studio-syreb644.js +0 -5
  267. package/dist/chunks/studio-tf9jryb1.js +0 -10
  268. package/dist/chunks/studio-txf2kysx.js +0 -5
  269. package/dist/chunks/studio-v8867ddv.js +0 -12
  270. package/dist/chunks/studio-vxq7fcvv.js +0 -5
  271. package/dist/chunks/studio-w4rz9hdk.js +0 -5
  272. package/dist/chunks/studio-wc649wss.js +0 -5
  273. package/dist/chunks/studio-wys23mxz.js +0 -5
  274. package/dist/chunks/studio-y3ahhdpx.js +0 -5
  275. package/dist/chunks/studio-z97c48fk.js +0 -5
  276. package/dist/chunks/studio-zat62m0c.js +0 -5
  277. package/dist/chunks/studio-zcd2e7yz.js +0 -5
  278. package/dist/chunks/toast-1gv0h53h.js +0 -4
  279. package/dist/chunks/workspace-dz7nxfhv.js +0 -4
  280. package/dist/chunks/workspace-home-xsd7hkjw.js +0 -4
  281. package/src/services/directory-picker.ts +0 -187
  282. package/src/services/gated-registry.ts +0 -77
@@ -60,6 +60,7 @@
60
60
  * @license MIT
61
61
  */
62
62
 
63
+ import { toolFacts } from "@jxsuite/ai/jx-tools";
63
64
  import { createToolContext, toolError } from "@jxsuite/ai/tools";
64
65
  import type {
65
66
  ToolArguments,
@@ -82,6 +83,7 @@ import type { WriteReportDeps, WriteSnapshot } from "./ai-write-report";
82
83
  import type { CommandContext } from "../commands/context";
83
84
  import type { AiToolReport, AnyCommand, CommandRegistry } from "../commands/registry";
84
85
  import type { Tab } from "../tabs/tab";
86
+ import { runAsActor } from "../tabs/transact";
85
87
 
86
88
  /**
87
89
  * The record a selection-level projection composes through.
@@ -214,8 +216,9 @@ function definitionOf(
214
216
  } else {
215
217
  parameters = command.args ?? EMPTY_ARGS;
216
218
  }
217
- return {
219
+ const definition: ToolDefinition = {
218
220
  name: tool.name,
221
+ title: command.title,
219
222
  description: `${tool.description}${undoSuffix(command)}`,
220
223
  /* SAFETY: `parameters` is an `argsSchema()` object (or the selector's composed from one), a
221
224
  JSON Schema object whose only departures from `JSONSchema` are readonly arrays and a
@@ -227,6 +230,13 @@ function definitionOf(
227
230
  llmStrict: false,
228
231
  execute: (args, ctx) => execute(tool.name, args, ctx),
229
232
  };
233
+ /* The facts are the table's, by tool name (`@jxsuite/ai/jx-tools`). A record with none projects a
234
+ tool without them, which the catalog refuses: that is the test that keeps the table whole. */
235
+ const facts = toolFacts(tool.name);
236
+ if (facts) {
237
+ definition.annotations = facts.annotations;
238
+ }
239
+ return definition;
230
240
  }
231
241
 
232
242
  /**
@@ -347,13 +357,21 @@ function fileLedger(
347
357
  }
348
358
  }
349
359
 
360
+ /** The command view, which also answers what the catalog asks of it. */
361
+ export interface CommandToolRegistry extends ToolRegistry {
362
+ /** Every record's projection, offered or not: the catalog's members from this side. */
363
+ readonly members: () => ToolDefinition[];
364
+ /** Whether the record projecting `name` is offered this round (its gate, and a non-empty enum). */
365
+ readonly advertises: (name: string) => boolean;
366
+ }
367
+
350
368
  /**
351
369
  * A ToolRegistry whose tools are the active registry's `aiTool` records. Nothing is registered.
352
370
  *
353
371
  * @param {CommandToolDeps} deps
354
- * @returns {ToolRegistry}
372
+ * @returns {CommandToolRegistry}
355
373
  */
356
- export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
374
+ export function createCommandToolRegistry(deps: CommandToolDeps): CommandToolRegistry {
357
375
  /** The record projecting `name`, enabled or not — so `execute` can reach a refusal. */
358
376
  function commandFor(name: string): AnyCommand | undefined {
359
377
  return activeRegistry()
@@ -408,10 +426,10 @@ export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
408
426
  const { paths, ...rest } = args;
409
427
  await registry.run(SELECTOR, { paths });
410
428
  before = registry.context();
411
- await registry.run(command.id, rest);
429
+ await runAsActor(ctx.actor, () => registry.run(command.id, rest));
412
430
  } else {
413
431
  before = registry.context();
414
- await registry.run(command.id, args);
432
+ await runAsActor(ctx.actor, () => registry.run(command.id, args));
415
433
  }
416
434
  } catch (error) {
417
435
  return { error: error instanceof Error ? error.message : String(error), success: false };
@@ -507,52 +525,24 @@ export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
507
525
  return { valid: true };
508
526
  },
509
527
  execute,
510
- };
511
- }
512
-
513
- /**
514
- * Union of two registries for the loop: hand tools gated by tier, command tools gated by the
515
- * record.
516
- *
517
- * `list`/`listForLLM` concatenate (hand first); `getDefinition`/`validate`/`execute` go to
518
- * whichever side has the definition, hand first; an unknown name answers `Unknown tool: "<name>"`
519
- * as `@jxsuite/ai` does; `register` goes to `hand`. A name on both sides is a defect the parity
520
- * test in `tests/ai-system-prompt.test.ts` catches; the composite's hand-first order is not a
521
- * feature anyone may rely on.
522
- *
523
- * @param {ToolRegistry} hand
524
- * @param {ToolRegistry} commands
525
- * @returns {ToolRegistry}
526
- */
527
- export function composeToolRegistries(hand: ToolRegistry, commands: ToolRegistry): ToolRegistry {
528
- function sideOf(name: string): ToolRegistry | undefined {
529
- if (hand.getDefinition(name)) {
530
- return hand;
531
- }
532
- return commands.getDefinition(name) ? commands : undefined;
533
- }
534
- return {
535
- register(tool) {
536
- hand.register(tool);
537
- },
538
- list() {
539
- return [...hand.list(), ...commands.list()];
540
- },
541
- listForLLM() {
542
- return [...hand.listForLLM(), ...commands.listForLLM()];
543
- },
544
- getDefinition(name) {
545
- return sideOf(name)?.getDefinition(name);
546
- },
547
- validate(name, args) {
548
- const side = sideOf(name);
549
- return side
550
- ? side.validate(name, args)
551
- : { valid: false, errors: [`Unknown tool: "${name}"`] };
528
+ members() {
529
+ const registry = activeRegistry();
530
+ if (!registry) {
531
+ return [];
532
+ }
533
+ const definitions: ToolDefinition[] = [];
534
+ for (const command of projected(registry)) {
535
+ const definition = definitionOf(registry, command, execute);
536
+ if (definition) {
537
+ definitions.push(definition);
538
+ }
539
+ }
540
+ return definitions;
552
541
  },
553
- async execute(name, args, ctx) {
554
- const side = sideOf(name);
555
- return side ? side.execute(name, args, ctx) : toolError(`Unknown tool: "${name}"`);
542
+ advertises(name) {
543
+ const registry = activeRegistry();
544
+ const command = commandFor(name);
545
+ return registry !== null && command !== undefined && advertised(registry, command);
556
546
  },
557
547
  };
558
548
  }
@@ -21,6 +21,7 @@
21
21
  * @license MIT
22
22
  */
23
23
 
24
+ import { JX_TOOL_FACTS } from "@jxsuite/ai/jx-tools";
24
25
  import { createToolDefinition, toolError, toolSuccess } from "@jxsuite/ai/tools";
25
26
  import { IMPORT_MAX_PAGES } from "@jxsuite/protocol";
26
27
  import { isBoolean, isNumber, isString } from "@jxsuite/schema/guards";
@@ -35,7 +36,6 @@ import { adoptCreatedProject } from "./project-adoption";
35
36
  import type { AdoptCreatedOptions, AdoptOutcome } from "./project-adoption";
36
37
 
37
38
  import type { JsonValue, ToolRegistry } from "@jxsuite/ai/tools";
38
- import type { Tab } from "../tabs/tab";
39
39
  import type {
40
40
  ImportBreakpointPolicy,
41
41
  ImportReadyEvent,
@@ -62,8 +62,6 @@ const DEFAULT_MIN_FIDELITY = 25;
62
62
  const MAX_FIDELITY = 100;
63
63
 
64
64
  export interface ImportToolsCtx {
65
- /** The active tab, read AFTER adoption to re-anchor the agent loop's undo batch. */
66
- getTab: () => Tab | null;
67
65
  /** Open the imported project in this window. Defaults to the late-bound adopter. */
68
66
  adoptProject?: (root: string) => Promise<void>;
69
67
  /** Fired once adoption is VERIFIED — the session store re-keys the live chat here. */
@@ -269,7 +267,6 @@ function describeRun(id: string, root: string, summary?: ImportSiteSummary): str
269
267
  export function registerImportTools(
270
268
  registry: Pick<ToolRegistry, "register">,
271
269
  {
272
- getTab,
273
270
  adoptProject,
274
271
  onProjectAdopted,
275
272
  brief: briefStore = { clear: clearPendingImportBrief, read: pendingImportBrief },
@@ -278,6 +275,8 @@ export function registerImportTools(
278
275
  registry.register(
279
276
  createToolDefinition({
280
277
  name: "import_site",
278
+ title: "Import a site",
279
+ annotations: JX_TOOL_FACTS.import_site.annotations,
281
280
  description:
282
281
  "Clone a live website into a new Jx project and open it in the studio: pages, styles, " +
283
282
  "assets, a shared layout and recurring components. Only available while no project is " +
@@ -454,7 +453,7 @@ export function registerImportTools(
454
453
  * failure here is not the run's failure: the import continues either way, and the terminal
455
454
  * path below reports honestly on whichever state the window ended up in.
456
455
  */
457
- const adoptOptions: AdoptCreatedOptions = { getTab };
456
+ const adoptOptions: AdoptCreatedOptions = {};
458
457
  if (adoptProject) {
459
458
  adoptOptions.adopt = adoptProject;
460
459
  }
@@ -14,6 +14,7 @@
14
14
  * @license MIT
15
15
  */
16
16
 
17
+ import { JX_TOOL_FACTS } from "@jxsuite/ai/jx-tools";
17
18
  import { createToolDefinition } from "@jxsuite/ai/tools";
18
19
  import { isJsonObject, isNumber } from "@jxsuite/schema/guards";
19
20
  import type { CreateProjectDestination, StudioPlatform } from "../types";
@@ -64,7 +65,6 @@ interface ListedEntry {
64
65
  }
65
66
 
66
67
  export interface ProjectToolsCtx {
67
- getTab: () => Tab | null;
68
68
  validate?: (doc: CandidateDocument) => Promise<string[]>;
69
69
  /**
70
70
  * Gate for `project.json` writes — the per-project entry document, not the document schema. It
@@ -113,7 +113,6 @@ export interface ProjectToolsCtx {
113
113
  export function registerProjectTools(
114
114
  registry: Pick<ToolRegistry, "register">,
115
115
  {
116
- getTab,
117
116
  validate = validateDoc,
118
117
  validateProject = validateProjectConfig,
119
118
  renderCheck,
@@ -130,6 +129,8 @@ export function registerProjectTools(
130
129
  registry.register(
131
130
  createToolDefinition({
132
131
  name: "list_files",
132
+ title: "List files",
133
+ annotations: JX_TOOL_FACTS.list_files.annotations,
133
134
  description:
134
135
  "List the project's files recursively (paths relative to the project root, with type and " +
135
136
  "size). Use this to discover pages, layouts, components, content, data, and styles before " +
@@ -199,6 +200,8 @@ export function registerProjectTools(
199
200
  registry.register(
200
201
  createToolDefinition({
201
202
  name: "read_file",
203
+ title: "Read a file",
204
+ annotations: JX_TOOL_FACTS.read_file.annotations,
202
205
  description:
203
206
  "Read a project file's content by its project-relative path. Works for any text file " +
204
207
  "(Jx documents, markdown, CSS, data). Large files are truncated.",
@@ -247,6 +250,8 @@ export function registerProjectTools(
247
250
  registry.register(
248
251
  createToolDefinition({
249
252
  name: "write_file",
253
+ title: "Write a file",
254
+ annotations: JX_TOOL_FACTS.write_file.annotations,
250
255
  description:
251
256
  "Write a project file (create or overwrite) at a project-relative path. Jx documents " +
252
257
  "(.json under pages/, layouts/, components/) are schema-validated and render-checked " +
@@ -422,6 +427,8 @@ export function registerProjectTools(
422
427
  registry.register(
423
428
  createToolDefinition({
424
429
  name: "search_files",
430
+ title: "Search files",
431
+ annotations: JX_TOOL_FACTS.search_files.annotations,
425
432
  description:
426
433
  "Search project files by file NAME (not content). Returns matching paths. Use list_files " +
427
434
  "for a directory overview and read_file to inspect contents.",
@@ -465,6 +472,8 @@ export function registerProjectTools(
465
472
  registry.register(
466
473
  createToolDefinition({
467
474
  name: "create_project",
475
+ title: "Create a project",
476
+ annotations: JX_TOOL_FACTS.create_project.annotations,
468
477
  description:
469
478
  "Create a new Jx project (project.json, conventional directories, starter pages) and open " +
470
479
  "it in the studio. Only available while no project is open. After it succeeds, the file " +
@@ -625,7 +634,6 @@ export function registerProjectTools(
625
634
  */
626
635
  const { adopted, error: adoptionError } = await adoptCreatedProject(result.root, {
627
636
  adopt: adoptProject,
628
- getTab,
629
637
  });
630
638
  if (adopted) {
631
639
  onProjectAdopted?.(result.root);
@@ -653,6 +661,8 @@ export function registerProjectTools(
653
661
  registry.register(
654
662
  createToolDefinition({
655
663
  name: "list_starters",
664
+ title: "List starters",
665
+ annotations: JX_TOOL_FACTS.list_starters.annotations,
656
666
  description:
657
667
  "List the starter templates available for new projects (id, name, description). " +
658
668
  "Currently informational — create_project scaffolds from built-in template variants.",