@theoremjs/studio 0.0.0-stage → 0.3.2

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 (473) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -2
  3. package/agreement.d.ts +14 -0
  4. package/agreement.js +80 -0
  5. package/asks.d.ts +47 -0
  6. package/asks.js +54 -0
  7. package/browser-connection.d.ts +49 -0
  8. package/browser-connection.js +215 -0
  9. package/browser-engine.d.ts +11 -0
  10. package/browser-engine.js +11 -0
  11. package/browser-execution.d.ts +6 -0
  12. package/browser-execution.js +18 -0
  13. package/browser-live.d.ts +4 -0
  14. package/browser-live.js +132 -0
  15. package/browser-transport.d.ts +33 -0
  16. package/browser-transport.js +229 -0
  17. package/browser.d.ts +4 -0
  18. package/browser.js +4 -0
  19. package/canonical.d.ts +10 -0
  20. package/canonical.js +25 -0
  21. package/compile-workspace.d.ts +28 -0
  22. package/compile-workspace.js +295 -0
  23. package/compile.d.ts +65 -0
  24. package/compile.js +1605 -0
  25. package/concierge-demo.d.ts +17 -0
  26. package/concierge-demo.js +1230 -0
  27. package/conversation-key.d.ts +5 -0
  28. package/conversation-key.js +10 -0
  29. package/decision-example-images.d.ts +30 -0
  30. package/decision-example-images.js +30 -0
  31. package/deno.json +3 -0
  32. package/draft.d.ts +407 -0
  33. package/draft.js +505 -0
  34. package/editors.d.ts +29 -0
  35. package/editors.js +51 -0
  36. package/example-embedding-files.d.ts +11 -0
  37. package/example-embedding-files.js +20 -0
  38. package/example.d.ts +36 -0
  39. package/example.js +357 -0
  40. package/guardrail-probe.d.ts +100 -0
  41. package/guardrail-probe.js +722 -0
  42. package/held-credentials.d.ts +28 -0
  43. package/held-credentials.js +87 -0
  44. package/installed.mjs +40 -0
  45. package/lent-keys.d.ts +122 -0
  46. package/lent-keys.js +47 -0
  47. package/line-diff.d.ts +15 -0
  48. package/line-diff.js +41 -0
  49. package/live-connection.d.ts +22 -0
  50. package/live-connection.js +27 -0
  51. package/live-session-bridge.d.ts +15 -0
  52. package/live-session-bridge.js +202 -0
  53. package/map-line.d.ts +19 -0
  54. package/map-line.js +42 -0
  55. package/map.d.ts +154 -0
  56. package/map.js +525 -0
  57. package/media-accept.d.ts +19 -0
  58. package/media-accept.js +65 -0
  59. package/mod.d.ts +39 -0
  60. package/mod.js +33 -0
  61. package/origins.d.ts +52 -0
  62. package/origins.js +165 -0
  63. package/package.json +85 -4
  64. package/page/assets/Banner-BISz3nXA.js +2 -0
  65. package/page/assets/BottomSheet-BwfBDtje.js +1 -0
  66. package/page/assets/Card-Lp-0P5eL.js +1 -0
  67. package/page/assets/CardWall-CBRLdDZW.js +1 -0
  68. package/page/assets/Center-nHS1JSux.js +1 -0
  69. package/page/assets/CheckboxInput-Cj5pk-KI.js +2 -0
  70. package/page/assets/CodeBlock-C7XJ4ioE.js +51 -0
  71. package/page/assets/CollapsibleGroup-N7_SOjbm.js +2 -0
  72. package/page/assets/ContextMenu-CBu9H-9H.js +2 -0
  73. package/page/assets/DateInput-BGrQ5tPC.js +1 -0
  74. package/page/assets/Dialog-DELWQo-v.js +1 -0
  75. package/page/assets/EmptyState-C8W4JKBZ.js +1 -0
  76. package/page/assets/HoverCard-D1Y1ltWQ.js +1 -0
  77. package/page/assets/Icon-JrysT8aU.js +3 -0
  78. package/page/assets/IconAlertTriangle-BqAEqqdU.js +1 -0
  79. package/page/assets/IconButton-DlOGzJIX.js +1 -0
  80. package/page/assets/IconEye-BB5aY-wQ.js +1 -0
  81. package/page/assets/IconFileText-6zOFKKrF.js +1 -0
  82. package/page/assets/IconSearch-BTx66a40.js +1 -0
  83. package/page/assets/IconShield-DDOh7Gr5.js +1 -0
  84. package/page/assets/ItemSwipeLayer-Ckn4X6h9.js +1 -0
  85. package/page/assets/PaneState-BvA2tLQg.js +1 -0
  86. package/page/assets/PaneState-eUzUkNE8.css +1 -0
  87. package/page/assets/ScrollableArea-Ckugdj1N.js +1 -0
  88. package/page/assets/Section-DJ97F7QE.js +1 -0
  89. package/page/assets/SegmentedControlItem-h-aaXzyS.js +1 -0
  90. package/page/assets/SidePanel-BL32abk8.js +1 -0
  91. package/page/assets/StackItem-CQviqAfM.js +1 -0
  92. package/page/assets/Text-bum6zWWx.js +2 -0
  93. package/page/assets/TimestampHoverCard-DQIG0RZF.js +1 -0
  94. package/page/assets/ToolResultCharts-CgshSv9Q.js +1 -0
  95. package/page/assets/Tooltip-BH9xiRMl.js +1 -0
  96. package/page/assets/TraceInspector-_yZiz05W.js +1 -0
  97. package/page/assets/TraceOverview-BPO-HIYK.js +57 -0
  98. package/page/assets/VStack-CkVMcNiK.js +1 -0
  99. package/page/assets/_virtual_studio-type-sources-ByxqQaOG.js +12936 -0
  100. package/page/assets/arrive-DvbqpeRS.js +1 -0
  101. package/page/assets/browser-engine-CYq9DQAM.js +9 -0
  102. package/page/assets/browser-transport-D-2jDYe7.js +47 -0
  103. package/page/assets/codicon-DF1abBS2.ttf +0 -0
  104. package/page/assets/compile-egress-BSxOdX4K.js +23 -0
  105. package/page/assets/container.stylex-BmOi-8DQ.js +1 -0
  106. package/page/assets/createReactComponent-CZwsv6DD.js +1 -0
  107. package/page/assets/decision-example-images-CZGr7YIT.js +1 -0
  108. package/page/assets/devWarning-DxuplmRl.js +1 -0
  109. package/page/assets/editor-DjpsE8to.css +1 -0
  110. package/page/assets/editor.api-Cd3ViPQa.js +908 -0
  111. package/page/assets/editor.worker-6GY8RhDc.js +1 -0
  112. package/page/assets/editor.worker-BmdWdrHZ.js +33 -0
  113. package/page/assets/editors-BJX_S59A.js +1 -0
  114. package/page/assets/egress-automata-B5ZGE1mT.js +1 -0
  115. package/page/assets/embedding-space-view-CfQBPDxD.js +140 -0
  116. package/page/assets/encode-files-Bc3HJyAh.js +1 -0
  117. package/page/assets/export-agent-C3yyzXH8.js +43 -0
  118. package/page/assets/figtree-latin-400-normal-BD4aNku5.woff +0 -0
  119. package/page/assets/figtree-latin-400-normal-g7Dtegnw.woff2 +0 -0
  120. package/page/assets/figtree-latin-500-normal-BWnGEVsr.woff2 +0 -0
  121. package/page/assets/figtree-latin-500-normal-B_yy1phn.woff +0 -0
  122. package/page/assets/figtree-latin-600-normal-BM_oTo4n.woff +0 -0
  123. package/page/assets/figtree-latin-600-normal-Cv_xCTDl.woff2 +0 -0
  124. package/page/assets/figtree-latin-700-normal-BCCt2T1q.woff +0 -0
  125. package/page/assets/figtree-latin-700-normal-th6qEP7c.woff2 +0 -0
  126. package/page/assets/focusOutline.stylex-BT0kfa4t.js +1 -0
  127. package/page/assets/focusableSelector-DXZeMU85.js +1 -0
  128. package/page/assets/groupStyles-C7Ter7zC.js +1 -0
  129. package/page/assets/guardrail-tester-Gut5xK4a.js +9 -0
  130. package/page/assets/host-patterns-C9RMP16Q.js +1 -0
  131. package/page/assets/index-CvvmFKgS.js +105 -0
  132. package/page/assets/index-DOaHlqBo.css +1 -0
  133. package/page/assets/isRtlElement-BG33-k_H.js +1 -0
  134. package/page/assets/labels-provider-4TIWDvsE.js +3 -0
  135. package/page/assets/lent-keys-C32ems-I.js +1 -0
  136. package/page/assets/live-ingress-lDUGPwth.js +1 -0
  137. package/page/assets/live-messages-CnkL4GWi.js +1 -0
  138. package/page/assets/mergeProps-ptS-gIMz.js +1 -0
  139. package/page/assets/padding.stylex-B76907Zf.js +1 -0
  140. package/page/assets/preload-helper-DpV6A1kQ.js +1 -0
  141. package/page/assets/reader-BOCCYaRp.js +7 -0
  142. package/page/assets/register-CDgivxvX.js +2 -0
  143. package/page/assets/rolldown-runtime-hePW80VL.js +1 -0
  144. package/page/assets/schemas-BQ9Jydzb.js +56 -0
  145. package/page/assets/shaped-data-BcarWqd5.js +16 -0
  146. package/page/assets/sharedResizeObserver-4U9Xq5Oq.js +1 -0
  147. package/page/assets/stub-DhdcU_Ew.js +471 -0
  148. package/page/assets/studio-code-pane-C_SAbcOa.js +8 -0
  149. package/page/assets/studio-console-DZwlEsvr.js +3 -0
  150. package/page/assets/studio-decision-B0FnCAXA.js +1 -0
  151. package/page/assets/studio-embedding-CmA51HVo.js +2 -0
  152. package/page/assets/studio-host-console-By7hqu2l.js +2 -0
  153. package/page/assets/studio-live-BrcVQcyV.js +1 -0
  154. package/page/assets/studio-map-B_xSia-z.js +1 -0
  155. package/page/assets/studio-map-Bb06Tw1F.css +1 -0
  156. package/page/assets/studio-monaco-CbKf90i6.css +1 -0
  157. package/page/assets/studio-monaco-xfyfezQS.js +34 -0
  158. package/page/assets/studio-ts.worker-B-EXG4Sv.js +67741 -0
  159. package/page/assets/studio-ts.worker-BXtW3z-O.js +1 -0
  160. package/page/assets/studio-type-checker-BOvxudki.js +23 -0
  161. package/page/assets/themeProps-3IqahpCr.js +1 -0
  162. package/page/assets/tokens.stylex-DkHf0P9C.js +1 -0
  163. package/page/assets/tool-schema-idaOe2nI.js +18 -0
  164. package/page/assets/trace-patterns-DnYJa0nI.js +1 -0
  165. package/page/assets/trace-record-C3zNksA_.js +1 -0
  166. package/page/assets/trace-schema-9CdEyG6Q.js +1 -0
  167. package/page/assets/tree-DqyAMsbI.js +3 -0
  168. package/page/assets/turn-client-Du3Um3Mg.js +2 -0
  169. package/page/assets/types-BhfXQCLx.js +1 -0
  170. package/page/assets/typescript-20GgZ8PJ.js +1 -0
  171. package/page/assets/use-one-call-Hcs8YBp1.js +1 -0
  172. package/page/assets/useAdaptivePresentation-BzmPCddb.js +1 -0
  173. package/page/assets/useClipboard-BgGRxRMJ.js +1 -0
  174. package/page/assets/useContainerReveal-BFy8N_QU.js +1 -0
  175. package/page/assets/useDevWarning-Z9SoixOP.js +1 -0
  176. package/page/assets/useLayerDismissal-B_G7IWpC.js +1 -0
  177. package/page/assets/useMediaQuery-BCT0NUeZ.js +1 -0
  178. package/page/assets/useScrollLock-Dyf6PHJt.js +1 -0
  179. package/page/assets/useScrollableArea-0NzdiBCq.js +1 -0
  180. package/page/assets/useTooltip-CJM_xhLB.js +1 -0
  181. package/page/assets/workspace-DZALqEDX.js +1 -0
  182. package/page/assets/zip-DTcEfps6.js +1 -0
  183. package/page/index.html +90 -0
  184. package/page.mjs +49 -0
  185. package/people.d.ts +87 -0
  186. package/people.js +110 -0
  187. package/policy.d.ts +43 -0
  188. package/policy.js +102 -0
  189. package/ports.d.mts +32 -0
  190. package/ports.mjs +85 -0
  191. package/probe-battery.d.ts +13 -0
  192. package/probe-battery.js +404 -0
  193. package/providers.d.ts +149 -0
  194. package/providers.js +306 -0
  195. package/read-source.d.ts +48 -0
  196. package/read-source.js +1301 -0
  197. package/read-steps.d.ts +23 -0
  198. package/read-steps.js +2 -0
  199. package/reader.d.ts +11 -0
  200. package/reader.js +11 -0
  201. package/registrations.d.ts +83 -0
  202. package/registrations.js +1 -0
  203. package/requirements.d.ts +22 -0
  204. package/requirements.js +38 -0
  205. package/run-payload-core.d.ts +28 -0
  206. package/run-payload-core.js +123 -0
  207. package/run-payload.d.ts +32 -0
  208. package/run-payload.js +26 -0
  209. package/runtime-scope.d.ts +84 -0
  210. package/runtime-scope.js +308 -0
  211. package/runtime.d.ts +84 -0
  212. package/runtime.js +387 -0
  213. package/section-notes.d.ts +33 -0
  214. package/section-notes.js +38 -0
  215. package/serve-page.mjs +96 -0
  216. package/server/draft-decide.d.ts +72 -0
  217. package/server/draft-decide.js +111 -0
  218. package/server/draft-embedding.d.ts +3 -0
  219. package/server/draft-embedding.js +35 -0
  220. package/server/draft-handler.d.ts +82 -0
  221. package/server/draft-handler.js +213 -0
  222. package/server/draft-probe.d.ts +14 -0
  223. package/server/draft-probe.js +61 -0
  224. package/server/draft-replies.d.ts +22 -0
  225. package/server/draft-replies.js +46 -0
  226. package/server/edited-session.d.ts +28 -0
  227. package/server/edited-session.js +83 -0
  228. package/server/edits.d.ts +38 -0
  229. package/server/edits.js +195 -0
  230. package/server/handler.d.ts +133 -0
  231. package/server/handler.js +598 -0
  232. package/server/lent-draft.d.ts +19 -0
  233. package/server/lent-draft.js +23 -0
  234. package/server/live.d.ts +15 -0
  235. package/server/live.js +96 -0
  236. package/server/open-editor.d.ts +63 -0
  237. package/server/open-editor.js +115 -0
  238. package/server/origins.d.ts +18 -0
  239. package/server/origins.js +330 -0
  240. package/server/project-source.d.ts +208 -0
  241. package/server/project-source.js +1042 -0
  242. package/server/project.d.ts +22 -0
  243. package/server/project.js +56 -0
  244. package/server/run-traces.d.ts +20 -0
  245. package/server/run-traces.js +96 -0
  246. package/server/save-new.d.ts +29 -0
  247. package/server/save-new.js +514 -0
  248. package/server/save-plan.d.ts +46 -0
  249. package/server/save-plan.js +1134 -0
  250. package/server/save-remove.d.ts +21 -0
  251. package/server/save-remove.js +528 -0
  252. package/server/save-session.d.ts +96 -0
  253. package/server/save-session.js +418 -0
  254. package/server/save-wire.d.ts +235 -0
  255. package/server/save-wire.js +8 -0
  256. package/server/save.d.ts +52 -0
  257. package/server/save.js +209 -0
  258. package/server/serve.d.ts +23 -0
  259. package/server/serve.js +413 -0
  260. package/server/test-connection.d.ts +17 -0
  261. package/server/test-connection.js +362 -0
  262. package/server/test-key.d.ts +2 -0
  263. package/server/test-key.js +83 -0
  264. package/server/watch.d.ts +28 -0
  265. package/server/watch.js +93 -0
  266. package/server/zod-edit.d.ts +74 -0
  267. package/server/zod-edit.js +558 -0
  268. package/server.d.ts +8 -0
  269. package/server.js +8 -0
  270. package/setups.mjs +170 -0
  271. package/shared-carry.d.ts +114 -0
  272. package/shared-carry.js +523 -0
  273. package/shared-settings.d.ts +34 -0
  274. package/shared-settings.js +70 -0
  275. package/source.d.ts +75 -0
  276. package/source.js +414 -0
  277. package/start.mjs +169 -0
  278. package/stream-lines.d.ts +9 -0
  279. package/stream-lines.js +27 -0
  280. package/stub.d.ts +6 -0
  281. package/stub.js +33 -0
  282. package/surface.d.ts +53 -0
  283. package/surface.js +631 -0
  284. package/system-markup.d.ts +20 -0
  285. package/system-markup.js +51 -0
  286. package/tool-schema.d.ts +23 -0
  287. package/tool-schema.js +69 -0
  288. package/tools.d.ts +16 -0
  289. package/tools.js +91 -0
  290. package/traces.d.ts +24 -0
  291. package/traces.js +29 -0
  292. package/transport.d.ts +57 -0
  293. package/transport.js +187 -0
  294. package/tree.d.ts +32 -0
  295. package/tree.js +83 -0
  296. package/types.d.ts +62 -0
  297. package/types.js +6 -0
  298. package/ui/acting-as-button.d.ts +2 -0
  299. package/ui/acting-as-button.js +16 -0
  300. package/ui/add-provider.d.ts +13 -0
  301. package/ui/add-provider.js +20 -0
  302. package/ui/boot-mark.css +53 -0
  303. package/ui/boot-mark.d.ts +19 -0
  304. package/ui/boot-mark.js +128 -0
  305. package/ui/boot-paint.d.ts +8 -0
  306. package/ui/boot-paint.js +8 -0
  307. package/ui/brand-icons.d.ts +57 -0
  308. package/ui/brand-icons.js +148 -0
  309. package/ui/built/theme.css +830 -0
  310. package/ui/built/theme.css.d.ts +9 -0
  311. package/ui/built/theorem-studio.d.ts +13 -0
  312. package/ui/built/theorem-studio.js +705 -0
  313. package/ui/built/theorem-studio.variants.d.ts +28 -0
  314. package/ui/code/monaco-contributions.d.ts +45 -0
  315. package/ui/code/studio-code.d.ts +7 -0
  316. package/ui/code/studio-code.js +253 -0
  317. package/ui/code/studio-monaco.d.ts +44 -0
  318. package/ui/code/studio-monaco.js +48 -0
  319. package/ui/code/studio-ts.worker.d.ts +1 -0
  320. package/ui/code/studio-ts.worker.js +16 -0
  321. package/ui/code/studio-type-checker.d.ts +12 -0
  322. package/ui/code/studio-type-checker.js +308 -0
  323. package/ui/code/studio-type-sources.d.ts +26 -0
  324. package/ui/confirm-write.d.ts +12 -0
  325. package/ui/confirm-write.js +45 -0
  326. package/ui/diff-block.d.ts +21 -0
  327. package/ui/diff-block.js +17 -0
  328. package/ui/figtree.css +59 -0
  329. package/ui/file-place.d.ts +4 -0
  330. package/ui/file-place.js +26 -0
  331. package/ui/guardrail-tester.d.ts +18 -0
  332. package/ui/guardrail-tester.js +248 -0
  333. package/ui/inspector-context.d.ts +119 -0
  334. package/ui/inspector-context.js +84 -0
  335. package/ui/inspector.d.ts +247 -0
  336. package/ui/inspector.js +284 -0
  337. package/ui/lib/acting-as.d.ts +25 -0
  338. package/ui/lib/acting-as.js +90 -0
  339. package/ui/lib/boot-sequence.d.ts +32 -0
  340. package/ui/lib/boot-sequence.js +57 -0
  341. package/ui/lib/export-agent.d.ts +11 -0
  342. package/ui/lib/export-agent.js +335 -0
  343. package/ui/lib/facet-icons.d.ts +20 -0
  344. package/ui/lib/facet-icons.js +21 -0
  345. package/ui/lib/panel-motion.d.ts +8 -0
  346. package/ui/lib/panel-motion.js +74 -0
  347. package/ui/lib/project-address.d.ts +14 -0
  348. package/ui/lib/project-address.js +24 -0
  349. package/ui/lib/project-starting.d.ts +13 -0
  350. package/ui/lib/project-starting.js +30 -0
  351. package/ui/lib/project-traces.d.ts +17 -0
  352. package/ui/lib/project-traces.js +54 -0
  353. package/ui/lib/read-map.d.ts +30 -0
  354. package/ui/lib/read-map.js +173 -0
  355. package/ui/lib/read-progress.d.ts +14 -0
  356. package/ui/lib/read-progress.js +12 -0
  357. package/ui/lib/refusal-lines.d.ts +3 -0
  358. package/ui/lib/refusal-lines.js +8 -0
  359. package/ui/lib/studio-activity.d.ts +5 -0
  360. package/ui/lib/studio-activity.js +17 -0
  361. package/ui/lib/studio-console.d.ts +27 -0
  362. package/ui/lib/studio-console.js +9 -0
  363. package/ui/lib/studio-conversation.d.ts +20 -0
  364. package/ui/lib/studio-conversation.js +130 -0
  365. package/ui/lib/studio-examples.d.ts +31 -0
  366. package/ui/lib/studio-examples.js +25 -0
  367. package/ui/lib/studio-labels.d.ts +6 -0
  368. package/ui/lib/studio-labels.js +13 -0
  369. package/ui/lib/studio-map-kept.d.ts +17 -0
  370. package/ui/lib/studio-map-kept.js +48 -0
  371. package/ui/lib/studio-open.d.ts +22 -0
  372. package/ui/lib/studio-open.js +54 -0
  373. package/ui/lib/studio-page.d.ts +33 -0
  374. package/ui/lib/studio-page.js +121 -0
  375. package/ui/lib/studio-prefs.d.ts +26 -0
  376. package/ui/lib/studio-prefs.js +87 -0
  377. package/ui/lib/studio-project.d.ts +106 -0
  378. package/ui/lib/studio-project.js +177 -0
  379. package/ui/lib/studio-restore.d.ts +49 -0
  380. package/ui/lib/studio-restore.js +251 -0
  381. package/ui/lib/studio-run-open.d.ts +15 -0
  382. package/ui/lib/studio-run-open.js +16 -0
  383. package/ui/lib/studio-session.d.ts +34 -0
  384. package/ui/lib/studio-session.js +17 -0
  385. package/ui/lib/studio-settings.d.ts +15 -0
  386. package/ui/lib/studio-settings.js +48 -0
  387. package/ui/lib/studio-store.d.ts +64 -0
  388. package/ui/lib/studio-store.js +391 -0
  389. package/ui/lib/studio-watch.d.ts +12 -0
  390. package/ui/lib/studio-watch.js +27 -0
  391. package/ui/lib/tab-fills.d.ts +6 -0
  392. package/ui/lib/tab-fills.js +14 -0
  393. package/ui/lib/tool-credentials.d.ts +3 -0
  394. package/ui/lib/tool-credentials.js +23 -0
  395. package/ui/lib/tool-probe.d.ts +19 -0
  396. package/ui/lib/tool-probe.js +104 -0
  397. package/ui/lib/type-icons.d.ts +35 -0
  398. package/ui/lib/type-icons.js +38 -0
  399. package/ui/lib/when-idle.d.ts +5 -0
  400. package/ui/lib/when-idle.js +14 -0
  401. package/ui/lib/zip.d.ts +5 -0
  402. package/ui/lib/zip.js +8 -0
  403. package/ui/map-token.css +11 -0
  404. package/ui/map-token.d.ts +17 -0
  405. package/ui/map-token.js +29 -0
  406. package/ui/mcp-icon.d.ts +6 -0
  407. package/ui/mcp-icon.js +8 -0
  408. package/ui/motion.css +113 -0
  409. package/ui/pan.d.ts +32 -0
  410. package/ui/pan.js +90 -0
  411. package/ui/profile-editor.d.ts +33 -0
  412. package/ui/profile-editor.js +2638 -0
  413. package/ui/provider-editor.d.ts +15 -0
  414. package/ui/provider-editor.js +92 -0
  415. package/ui/read-map.css +48 -0
  416. package/ui/read-map.d.ts +7 -0
  417. package/ui/read-map.js +163 -0
  418. package/ui/refusal-detail.d.ts +4 -0
  419. package/ui/refusal-detail.js +21 -0
  420. package/ui/shared-change.d.ts +9 -0
  421. package/ui/shared-change.js +28 -0
  422. package/ui/shell-motion.css +121 -0
  423. package/ui/shell-motion.d.ts +73 -0
  424. package/ui/shell-motion.js +194 -0
  425. package/ui/studio-code-pane.d.ts +19 -0
  426. package/ui/studio-code-pane.js +44 -0
  427. package/ui/studio-compare.d.ts +80 -0
  428. package/ui/studio-compare.js +326 -0
  429. package/ui/studio-conflicts.d.ts +17 -0
  430. package/ui/studio-conflicts.js +87 -0
  431. package/ui/studio-connection.d.ts +64 -0
  432. package/ui/studio-connection.js +286 -0
  433. package/ui/studio-decision.d.ts +6 -0
  434. package/ui/studio-decision.js +49 -0
  435. package/ui/studio-embedding.d.ts +6 -0
  436. package/ui/studio-embedding.js +30 -0
  437. package/ui/studio-host-console.d.ts +6 -0
  438. package/ui/studio-host-console.js +17 -0
  439. package/ui/studio-host.d.ts +73 -0
  440. package/ui/studio-host.js +12 -0
  441. package/ui/studio-live.d.ts +17 -0
  442. package/ui/studio-live.js +26 -0
  443. package/ui/studio-map.css +273 -0
  444. package/ui/studio-map.d.ts +17 -0
  445. package/ui/studio-map.js +397 -0
  446. package/ui/studio-nav.d.ts +24 -0
  447. package/ui/studio-nav.js +17 -0
  448. package/ui/studio-no-project.d.ts +5 -0
  449. package/ui/studio-no-project.js +9 -0
  450. package/ui/studio-run.css +76 -0
  451. package/ui/studio-run.d.ts +14 -0
  452. package/ui/studio-run.js +119 -0
  453. package/ui/studio-runner.d.ts +45 -0
  454. package/ui/studio-runner.js +187 -0
  455. package/ui/studio-save.d.ts +49 -0
  456. package/ui/studio-save.js +307 -0
  457. package/ui/studio-screen.d.ts +61 -0
  458. package/ui/studio-screen.js +2078 -0
  459. package/ui/studio-settings.d.ts +31 -0
  460. package/ui/studio-settings.js +288 -0
  461. package/ui/studio-shell.css +27 -0
  462. package/ui/studio-shell.d.ts +43 -0
  463. package/ui/studio-shell.js +87 -0
  464. package/ui/studio-theme.d.ts +7 -0
  465. package/ui/studio-theme.js +94 -0
  466. package/ui/studio.css +427 -0
  467. package/ui/theorem-mark.css +84 -0
  468. package/ui/theorem-mark.d.ts +22 -0
  469. package/ui/theorem-mark.js +21 -0
  470. package/vite.d.mts +30 -0
  471. package/vite.mjs +277 -0
  472. package/workspace.d.ts +230 -0
  473. package/workspace.js +1054 -0
package/people.js ADDED
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Who a studio run acts as. The application names the places its data lives in and the people a
3
+ * run may act as there; the studio shows who and where, and carries the builder's pick to the
4
+ * application with every run. The studio knows nothing of sign-in, accounts or clean-up: making a
5
+ * fresh person, finding existing ones, and whether a place is safe to use are the application's.
6
+ *
7
+ * A run with no pick acts as no one.
8
+ *
9
+ * @module
10
+ */
11
+ import { z } from 'zod';
12
+ /** The header each run carries the builder's pick in. No header is no one. */
13
+ export const ACTING_AS_HEADER = 'x-theorem-studio-acting-as';
14
+ /** The session a run acting as no one is in. */
15
+ export const NO_ONE_SESSION = 'theorem-studio-local';
16
+ const nameSchema = z.object({ id: z.string().min(1), label: z.string().min(1) });
17
+ const actingAsSchema = z.object({ place: z.string().min(1), person: nameSchema });
18
+ const peopleSchema = z.object({
19
+ places: z.array(nameSchema).min(1),
20
+ existing: z.unknown().optional(),
21
+ fresh: z.unknown().optional(),
22
+ start: actingAsSchema.optional(),
23
+ });
24
+ /** The pick as a header value: the label may be any text, and a header holds only some. */
25
+ export function actingAsHeader(actingAs) {
26
+ return encodeURIComponent(JSON.stringify(actingAs));
27
+ }
28
+ /** The headers a run sends for a pick: none for no one. */
29
+ export function actingAsHeaders(actingAs) {
30
+ return actingAs ? { [ACTING_AS_HEADER]: actingAsHeader(actingAs) } : {};
31
+ }
32
+ /**
33
+ * The session a pick's runs share. Each person has their own, so one person's chat, held calls
34
+ * and answers are never another's; the label is left out, so renaming a person keeps their chat.
35
+ */
36
+ export function actingAsSession(actingAs) {
37
+ if (!actingAs)
38
+ return NO_ONE_SESSION;
39
+ return `${NO_ONE_SESSION}:${encodeURIComponent(actingAs.place)}:${encodeURIComponent(actingAs.person.id)}`;
40
+ }
41
+ /** Reads a run's pick and checks its place is one the setup offers. */
42
+ export function readActingAs(request, people) {
43
+ const sent = request.headers.get(ACTING_AS_HEADER);
44
+ if (sent === null)
45
+ return { ok: true, actingAs: undefined };
46
+ let value;
47
+ try {
48
+ value = JSON.parse(decodeURIComponent(sent));
49
+ }
50
+ catch {
51
+ return { ok: false, message: 'The person this run acts as could not be read.' };
52
+ }
53
+ return readPick(value, people?.places ?? []);
54
+ }
55
+ /** Reads a pick from wherever it was kept, and checks its place is one of `places`. */
56
+ export function readPick(value, places) {
57
+ const parsed = actingAsSchema.safeParse(value);
58
+ if (!parsed.success)
59
+ return { ok: false, message: 'The person this run acts as could not be read.' };
60
+ const read = readPlace(parsed.data.place, places);
61
+ return read.ok ? { ok: true, actingAs: parsed.data } : read;
62
+ }
63
+ /** `place` when it is one of `places`, or why it is not. */
64
+ export function readPlace(place, places) {
65
+ if (typeof place !== 'string' || place === '')
66
+ return { ok: false, message: 'The setup file needs a place to look in.' };
67
+ return places.some((offered) => offered.id === place)
68
+ ? { ok: true, place }
69
+ : { ok: false, message: `The setup file offers no place '${place}'.` };
70
+ }
71
+ /**
72
+ * Why the people a setup file exports cannot be offered, or nothing. A setup file is not always
73
+ * type-checked, so the studio reads what it exports before it trusts it.
74
+ */
75
+ export function peopleFault(people) {
76
+ const parsed = peopleSchema.safeParse(people);
77
+ if (!parsed.success) {
78
+ return 'The people the setup file exports need places: a list of { id, label }, at least one.';
79
+ }
80
+ const { places, existing, fresh, start } = parsed.data;
81
+ const ids = places.map((place) => place.id);
82
+ if (new Set(ids).size !== ids.length)
83
+ return 'The places the setup file exports share an id.';
84
+ if (existing !== undefined && typeof existing !== 'function') {
85
+ return "The people the setup file exports have an 'existing' that is not a function.";
86
+ }
87
+ if (fresh !== undefined && typeof fresh !== 'function') {
88
+ return "The people the setup file exports have a 'fresh' that is not a function.";
89
+ }
90
+ if (start && !ids.includes(start.place)) {
91
+ return `The setup file starts in a place it does not offer: '${start.place}'.`;
92
+ }
93
+ return undefined;
94
+ }
95
+ /** What the page is told of the people a setup file offers. */
96
+ export function peopleOffer(people) {
97
+ return {
98
+ places: people.places.map(({ id, label }) => ({ id, label })),
99
+ existing: people.existing !== undefined,
100
+ fresh: people.fresh !== undefined,
101
+ ...(people.start ? { start: people.start } : {}),
102
+ };
103
+ }
104
+ /** Reads what the application answered for a person, so the page never shows a malformed one. */
105
+ export function readPerson(value, from) {
106
+ const parsed = nameSchema.safeParse(value);
107
+ if (!parsed.success)
108
+ throw new Error(`The setup file's ${from} answered a person without an id and a label.`);
109
+ return parsed.data;
110
+ }
package/policy.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ /**
2
+ * What the studio sets for itself, and how it reads a binding on what it runs on. What a page's
3
+ * lent keys allow is the page's own (`LentKeys`); nothing here knows a hosted model list.
4
+ */
5
+ import type { ModelBindingDraft } from './draft.ts';
6
+ import type { LentBinding, ModelBindingViolation, ModelProfileType, ModelStart, StudioRunsOn } from './lent-keys.ts';
7
+ import { type ModelRoute, type StudioProvider } from './providers.ts';
8
+ export type StudioConnectionMode = StudioRunsOn['mode'];
9
+ /** Each record goes back to the run tab's inspector; the server keeps nothing. */
10
+ export declare const STUDIO_TRACE_DESTINATION = "studio";
11
+ /**
12
+ * What the studio fills in where a profile leaves a setting out, by path: a profile that names no
13
+ * place for its records is recorded to the studio, so a test run's trace shows. Written, the
14
+ * setting is the profile's, and any other value is a difference.
15
+ */
16
+ export declare const STUDIO_POLICY_UNSET: Readonly<Record<string, unknown>>;
17
+ /**
18
+ * `profile` as a file holds it: each value the studio fills in (`STUDIO_POLICY_UNSET`) is taken
19
+ * out, and a section left empty by that goes too. Writing a profile never writes the studio's own.
20
+ */
21
+ export declare function withoutStudioFills<P extends object>(profile: P): P;
22
+ /** A model spoken to in one of Gemini's protocols. */
23
+ export declare function isGoogleRoute(route: Pick<ModelRoute, 'protocol'>): boolean;
24
+ /** A model spoken to in one of OpenRouter's protocols. */
25
+ export declare function isOpenRouterRoute(route: Pick<ModelRoute, 'protocol'>): boolean;
26
+ export declare function isProviderBuiltinId(name: string): boolean;
27
+ /**
28
+ * Whether the studio runs agents of `type` on a provider: on lent keys, what the keys run; on
29
+ * the builder's own keys or machine, whether the provider serves the type.
30
+ */
31
+ export declare function studioRunsProvider(type: ModelProfileType, provider: StudioProvider | undefined, on: StudioRunsOn): boolean;
32
+ /**
33
+ * The binding a new model of `type` starts on: where `start` puts it, or with none a kernel
34
+ * provider and no model yet, for the builder to pick.
35
+ */
36
+ export declare function startingBinding(type: ModelProfileType, start?: ModelStart): Pick<ModelBindingDraft, 'modelId' | 'protocol' | 'provider' | 'apiId'>;
37
+ /** The studio provider `id`, on the first protocol it serves agents of `type` on. */
38
+ export declare function firstServed(id: string, type: ModelProfileType): {
39
+ protocol: string;
40
+ provider: string;
41
+ };
42
+ /** `null` when `binding` can run on `on`: a local run on local models, a lent run on what the keys allow. */
43
+ export declare function modelBindingViolation(binding: LentBinding, on: StudioRunsOn): ModelBindingViolation | null;
package/policy.js ADDED
@@ -0,0 +1,102 @@
1
+ /**
2
+ * What the studio sets for itself, and how it reads a binding on what it runs on. What a page's
3
+ * lent keys allow is the page's own (`LentKeys`); nothing here knows a hosted model list.
4
+ */
5
+ import { GOOGLE_BUILTIN_TOOLS } from '@theoremjs/agents/presets/google';
6
+ import { geminiInteractions, geminiLive, openRouter, openRouterImages, } from '@theoremjs/agents/providers';
7
+ import { LOCAL_PROVIDER_ID, STUDIO_PROVIDERS, servedProtocols, servesProfileType, } from "./providers.js";
8
+ /** Each record goes back to the run tab's inspector; the server keeps nothing. */
9
+ export const STUDIO_TRACE_DESTINATION = 'studio';
10
+ /**
11
+ * What the studio fills in where a profile leaves a setting out, by path: a profile that names no
12
+ * place for its records is recorded to the studio, so a test run's trace shows. Written, the
13
+ * setting is the profile's, and any other value is a difference.
14
+ */
15
+ export const STUDIO_POLICY_UNSET = {
16
+ 'observability.writeTo': STUDIO_TRACE_DESTINATION,
17
+ };
18
+ /**
19
+ * `profile` as a file holds it: each value the studio fills in (`STUDIO_POLICY_UNSET`) is taken
20
+ * out, and a section left empty by that goes too. Writing a profile never writes the studio's own.
21
+ */
22
+ export function withoutStudioFills(profile) {
23
+ return Object.entries(STUDIO_POLICY_UNSET).reduce((held, [path, fill]) => withoutFill(held, path.split('.'), fill), profile);
24
+ }
25
+ function withoutFill(value, [key, ...rest], fill) {
26
+ if (key === undefined || !Object.hasOwn(value, key))
27
+ return value;
28
+ const inner = value[key];
29
+ if (!rest.length) {
30
+ return inner === fill
31
+ ? Object.fromEntries(Object.entries(value).filter(([at]) => at !== key))
32
+ : value;
33
+ }
34
+ if (typeof inner !== 'object' || inner === null || Array.isArray(inner))
35
+ return value;
36
+ const kept = withoutFill(inner, rest, fill);
37
+ if (kept === inner)
38
+ return value;
39
+ return Object.fromEntries(Object.entries(value).flatMap(([at, held]) => at !== key ? [[at, held]] : Object.keys(kept).length ? [[at, kept]] : []));
40
+ }
41
+ /** Provider builtin ids — they belong on `models.*.builtInTools`, never on a custom tool. */
42
+ const GOOGLE_BUILTIN_IDS = new Set(GOOGLE_BUILTIN_TOOLS.map((tool) => tool.name));
43
+ /** A model spoken to in one of Gemini's protocols. */
44
+ export function isGoogleRoute(route) {
45
+ return route.protocol === geminiInteractions.id || route.protocol === geminiLive.id;
46
+ }
47
+ /** A model spoken to in one of OpenRouter's protocols. */
48
+ export function isOpenRouterRoute(route) {
49
+ return route.protocol === openRouter.id || route.protocol === openRouterImages.id;
50
+ }
51
+ export function isProviderBuiltinId(name) {
52
+ return GOOGLE_BUILTIN_IDS.has(name);
53
+ }
54
+ /**
55
+ * Whether the studio runs agents of `type` on a provider: on lent keys, what the keys run; on
56
+ * the builder's own keys or machine, whether the provider serves the type.
57
+ */
58
+ export function studioRunsProvider(type, provider, on) {
59
+ return on.mode === 'demo'
60
+ ? on.keys.runs(type, provider?.definition)
61
+ : servesProfileType(provider, type);
62
+ }
63
+ /** The model id a new binding of `type` takes. */
64
+ const MODEL_IDS = {
65
+ text: 'fast',
66
+ image: 'image',
67
+ speech: 'voice',
68
+ live: 'live',
69
+ decision: 'decision',
70
+ embedding: 'embedding',
71
+ };
72
+ /**
73
+ * The binding a new model of `type` starts on: where `start` puts it, or with none a kernel
74
+ * provider and no model yet, for the builder to pick.
75
+ */
76
+ export function startingBinding(type, start) {
77
+ const begun = start?.(type) ?? {
78
+ ...firstServed(type === 'decision' ? 'typesafe' : 'gemini', type),
79
+ apiId: '',
80
+ };
81
+ return { modelId: MODEL_IDS[type], ...begun };
82
+ }
83
+ /** The studio provider `id`, on the first protocol it serves agents of `type` on. */
84
+ export function firstServed(id, type) {
85
+ const provider = STUDIO_PROVIDERS.find((each) => each.id === id);
86
+ const protocol = provider && servedProtocols(provider, type)?.[0];
87
+ if (!protocol)
88
+ throw new Error(`The studio provider '${id}' serves no ${type} agents.`); // labels-exempt: developer contract error
89
+ return { protocol: protocol.id, provider: id };
90
+ }
91
+ /** `null` when `binding` can run on `on`: a local run on local models, a lent run on what the keys allow. */
92
+ export function modelBindingViolation(binding, on) {
93
+ if (on.mode === 'demo')
94
+ return on.keys.violation(binding);
95
+ if (on.mode === 'local' && binding.provider !== LOCAL_PROVIDER_ID) {
96
+ return {
97
+ field: 'provider',
98
+ message: 'Local runs require local models. Switch the model provider to Local.',
99
+ };
100
+ }
101
+ return null;
102
+ }
package/ports.d.mts ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Where a setup opens: on the pair a studio already has it open on, else the first free pair.
3
+ * Nothing when every pair is taken.
4
+ * @param {string} setup the setup's file, in full
5
+ * @param {readonly Held[]} held every pair, in order
6
+ * @returns {{ pair: Pair, running: boolean } | undefined}
7
+ */
8
+ export function placeFor(setup: string, held: readonly Held[]): {
9
+ pair: Pair;
10
+ running: boolean;
11
+ } | undefined;
12
+ /** @returns {Promise<Held[]>} */
13
+ export function heldPairs(): Promise<Held[]>;
14
+ /** Where a studio's server says which setup it is open on. */
15
+ export const RUNNING_PATH: "/api/studio/running";
16
+ export function pairAt(at: number): Pair;
17
+ export function pairs(): Pair[];
18
+ export function pageAddress(pair: Pair): string;
19
+ export function serverAddress(pair: Pair): string;
20
+ export type Pair = {
21
+ server: number;
22
+ page: number;
23
+ };
24
+ /**
25
+ * what a pair holds: the setup a
26
+ * studio there is open on, and whether both ports are free
27
+ */
28
+ export type Held = {
29
+ pair: Pair;
30
+ setup?: string;
31
+ free: boolean;
32
+ };
package/ports.mjs ADDED
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Where a studio listens. A studio takes a pair of ports on this machine: the project's server,
3
+ * and the page one above it. The first pair is the one a project opens on; a second project opened
4
+ * beside it takes the next pair that is free.
5
+ */
6
+ import { createServer } from 'node:net';
7
+
8
+ const FIRST_SERVER_PORT = 4983;
9
+ /** How many studios can be open at once. */
10
+ const PAIRS = 10;
11
+ /** Where a studio's server says which setup it is open on. */
12
+ export const RUNNING_PATH = '/api/studio/running';
13
+ /** How long a server has to say so. One on this machine answers at once. */
14
+ const ANSWER_MS = 1000;
15
+
16
+ /**
17
+ * @typedef {{ server: number, page: number }} Pair
18
+ * @typedef {{ pair: Pair, setup?: string, free: boolean }} Held what a pair holds: the setup a
19
+ * studio there is open on, and whether both ports are free
20
+ */
21
+
22
+ /** @param {number} at @returns {Pair} */
23
+ export const pairAt = (at) => ({
24
+ server: FIRST_SERVER_PORT + 2 * at,
25
+ page: FIRST_SERVER_PORT + 2 * at + 1,
26
+ });
27
+
28
+ /** @returns {Pair[]} */
29
+ export const pairs = () => Array.from({ length: PAIRS }, (_, at) => pairAt(at));
30
+
31
+ /** @param {Pair} pair */
32
+ export const pageAddress = (pair) => `http://127.0.0.1:${String(pair.page)}`;
33
+ /** @param {Pair} pair */
34
+ export const serverAddress = (pair) => `http://127.0.0.1:${String(pair.server)}`;
35
+
36
+ /**
37
+ * Where a setup opens: on the pair a studio already has it open on, else the first free pair.
38
+ * Nothing when every pair is taken.
39
+ * @param {string} setup the setup's file, in full
40
+ * @param {readonly Held[]} held every pair, in order
41
+ * @returns {{ pair: Pair, running: boolean } | undefined}
42
+ */
43
+ export function placeFor(setup, held) {
44
+ const running = held.find((one) => one.setup === setup);
45
+ if (running) return { pair: running.pair, running: true };
46
+ const free = held.find((one) => one.free);
47
+ return free && { pair: free.pair, running: false };
48
+ }
49
+
50
+ /** @param {number} port @returns {Promise<boolean>} */
51
+ function isFree(port) {
52
+ return new Promise((resolve) => {
53
+ const probe = createServer();
54
+ probe.once('error', () => resolve(false));
55
+ probe.listen(port, '127.0.0.1', () => probe.close(() => resolve(true)));
56
+ });
57
+ }
58
+
59
+ /** The setup the studio on a pair is open on, or nothing when no studio answers there. */
60
+ async function runningOn(pair) {
61
+ try {
62
+ const response = await fetch(serverAddress(pair) + RUNNING_PATH, {
63
+ signal: AbortSignal.timeout(ANSWER_MS),
64
+ });
65
+ const said = response.ok ? await response.json() : undefined;
66
+ return typeof said?.setup === 'string' ? said.setup : undefined;
67
+ } catch {
68
+ // Nothing listens there, or what does is not a studio.
69
+ return undefined;
70
+ }
71
+ }
72
+
73
+ /** @returns {Promise<Held[]>} */
74
+ export function heldPairs() {
75
+ return Promise.all(
76
+ pairs().map(async (pair) => {
77
+ const [setup, server, page] = await Promise.all([
78
+ runningOn(pair),
79
+ isFree(pair.server),
80
+ isFree(pair.page),
81
+ ]);
82
+ return { pair, ...(setup === undefined ? {} : { setup }), free: server && page };
83
+ }),
84
+ );
85
+ }
@@ -0,0 +1,13 @@
1
+ import type { ProbeBoundary } from './guardrail-probe.ts';
2
+ export interface ProbeBatteryCase {
3
+ id: string;
4
+ boundary: ProbeBoundary;
5
+ title: string;
6
+ text: string;
7
+ /** What a guardrail should do: act on the text (`hit`) or leave it alone (`pass`). */
8
+ want: 'hit' | 'pass';
9
+ /** What makes the text hard. */
10
+ why: string;
11
+ }
12
+ /** Every case, grouped by boundary in the order of `PROBE_BOUNDARIES`. */
13
+ export declare const PROBE_BATTERY: readonly ProbeBatteryCase[];