@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.
- package/LICENSE +21 -0
- package/README.md +295 -2
- package/agreement.d.ts +14 -0
- package/agreement.js +80 -0
- package/asks.d.ts +47 -0
- package/asks.js +54 -0
- package/browser-connection.d.ts +49 -0
- package/browser-connection.js +215 -0
- package/browser-engine.d.ts +11 -0
- package/browser-engine.js +11 -0
- package/browser-execution.d.ts +6 -0
- package/browser-execution.js +18 -0
- package/browser-live.d.ts +4 -0
- package/browser-live.js +132 -0
- package/browser-transport.d.ts +33 -0
- package/browser-transport.js +229 -0
- package/browser.d.ts +4 -0
- package/browser.js +4 -0
- package/canonical.d.ts +10 -0
- package/canonical.js +25 -0
- package/compile-workspace.d.ts +28 -0
- package/compile-workspace.js +295 -0
- package/compile.d.ts +65 -0
- package/compile.js +1605 -0
- package/concierge-demo.d.ts +17 -0
- package/concierge-demo.js +1230 -0
- package/conversation-key.d.ts +5 -0
- package/conversation-key.js +10 -0
- package/decision-example-images.d.ts +30 -0
- package/decision-example-images.js +30 -0
- package/deno.json +3 -0
- package/draft.d.ts +407 -0
- package/draft.js +505 -0
- package/editors.d.ts +29 -0
- package/editors.js +51 -0
- package/example-embedding-files.d.ts +11 -0
- package/example-embedding-files.js +20 -0
- package/example.d.ts +36 -0
- package/example.js +357 -0
- package/guardrail-probe.d.ts +100 -0
- package/guardrail-probe.js +722 -0
- package/held-credentials.d.ts +28 -0
- package/held-credentials.js +87 -0
- package/installed.mjs +40 -0
- package/lent-keys.d.ts +122 -0
- package/lent-keys.js +47 -0
- package/line-diff.d.ts +15 -0
- package/line-diff.js +41 -0
- package/live-connection.d.ts +22 -0
- package/live-connection.js +27 -0
- package/live-session-bridge.d.ts +15 -0
- package/live-session-bridge.js +202 -0
- package/map-line.d.ts +19 -0
- package/map-line.js +42 -0
- package/map.d.ts +154 -0
- package/map.js +525 -0
- package/media-accept.d.ts +19 -0
- package/media-accept.js +65 -0
- package/mod.d.ts +39 -0
- package/mod.js +33 -0
- package/origins.d.ts +52 -0
- package/origins.js +165 -0
- package/package.json +85 -4
- package/page/assets/Banner-BISz3nXA.js +2 -0
- package/page/assets/BottomSheet-BwfBDtje.js +1 -0
- package/page/assets/Card-Lp-0P5eL.js +1 -0
- package/page/assets/CardWall-CBRLdDZW.js +1 -0
- package/page/assets/Center-nHS1JSux.js +1 -0
- package/page/assets/CheckboxInput-Cj5pk-KI.js +2 -0
- package/page/assets/CodeBlock-C7XJ4ioE.js +51 -0
- package/page/assets/CollapsibleGroup-N7_SOjbm.js +2 -0
- package/page/assets/ContextMenu-CBu9H-9H.js +2 -0
- package/page/assets/DateInput-BGrQ5tPC.js +1 -0
- package/page/assets/Dialog-DELWQo-v.js +1 -0
- package/page/assets/EmptyState-C8W4JKBZ.js +1 -0
- package/page/assets/HoverCard-D1Y1ltWQ.js +1 -0
- package/page/assets/Icon-JrysT8aU.js +3 -0
- package/page/assets/IconAlertTriangle-BqAEqqdU.js +1 -0
- package/page/assets/IconButton-DlOGzJIX.js +1 -0
- package/page/assets/IconEye-BB5aY-wQ.js +1 -0
- package/page/assets/IconFileText-6zOFKKrF.js +1 -0
- package/page/assets/IconSearch-BTx66a40.js +1 -0
- package/page/assets/IconShield-DDOh7Gr5.js +1 -0
- package/page/assets/ItemSwipeLayer-Ckn4X6h9.js +1 -0
- package/page/assets/PaneState-BvA2tLQg.js +1 -0
- package/page/assets/PaneState-eUzUkNE8.css +1 -0
- package/page/assets/ScrollableArea-Ckugdj1N.js +1 -0
- package/page/assets/Section-DJ97F7QE.js +1 -0
- package/page/assets/SegmentedControlItem-h-aaXzyS.js +1 -0
- package/page/assets/SidePanel-BL32abk8.js +1 -0
- package/page/assets/StackItem-CQviqAfM.js +1 -0
- package/page/assets/Text-bum6zWWx.js +2 -0
- package/page/assets/TimestampHoverCard-DQIG0RZF.js +1 -0
- package/page/assets/ToolResultCharts-CgshSv9Q.js +1 -0
- package/page/assets/Tooltip-BH9xiRMl.js +1 -0
- package/page/assets/TraceInspector-_yZiz05W.js +1 -0
- package/page/assets/TraceOverview-BPO-HIYK.js +57 -0
- package/page/assets/VStack-CkVMcNiK.js +1 -0
- package/page/assets/_virtual_studio-type-sources-ByxqQaOG.js +12936 -0
- package/page/assets/arrive-DvbqpeRS.js +1 -0
- package/page/assets/browser-engine-CYq9DQAM.js +9 -0
- package/page/assets/browser-transport-D-2jDYe7.js +47 -0
- package/page/assets/codicon-DF1abBS2.ttf +0 -0
- package/page/assets/compile-egress-BSxOdX4K.js +23 -0
- package/page/assets/container.stylex-BmOi-8DQ.js +1 -0
- package/page/assets/createReactComponent-CZwsv6DD.js +1 -0
- package/page/assets/decision-example-images-CZGr7YIT.js +1 -0
- package/page/assets/devWarning-DxuplmRl.js +1 -0
- package/page/assets/editor-DjpsE8to.css +1 -0
- package/page/assets/editor.api-Cd3ViPQa.js +908 -0
- package/page/assets/editor.worker-6GY8RhDc.js +1 -0
- package/page/assets/editor.worker-BmdWdrHZ.js +33 -0
- package/page/assets/editors-BJX_S59A.js +1 -0
- package/page/assets/egress-automata-B5ZGE1mT.js +1 -0
- package/page/assets/embedding-space-view-CfQBPDxD.js +140 -0
- package/page/assets/encode-files-Bc3HJyAh.js +1 -0
- package/page/assets/export-agent-C3yyzXH8.js +43 -0
- package/page/assets/figtree-latin-400-normal-BD4aNku5.woff +0 -0
- package/page/assets/figtree-latin-400-normal-g7Dtegnw.woff2 +0 -0
- package/page/assets/figtree-latin-500-normal-BWnGEVsr.woff2 +0 -0
- package/page/assets/figtree-latin-500-normal-B_yy1phn.woff +0 -0
- package/page/assets/figtree-latin-600-normal-BM_oTo4n.woff +0 -0
- package/page/assets/figtree-latin-600-normal-Cv_xCTDl.woff2 +0 -0
- package/page/assets/figtree-latin-700-normal-BCCt2T1q.woff +0 -0
- package/page/assets/figtree-latin-700-normal-th6qEP7c.woff2 +0 -0
- package/page/assets/focusOutline.stylex-BT0kfa4t.js +1 -0
- package/page/assets/focusableSelector-DXZeMU85.js +1 -0
- package/page/assets/groupStyles-C7Ter7zC.js +1 -0
- package/page/assets/guardrail-tester-Gut5xK4a.js +9 -0
- package/page/assets/host-patterns-C9RMP16Q.js +1 -0
- package/page/assets/index-CvvmFKgS.js +105 -0
- package/page/assets/index-DOaHlqBo.css +1 -0
- package/page/assets/isRtlElement-BG33-k_H.js +1 -0
- package/page/assets/labels-provider-4TIWDvsE.js +3 -0
- package/page/assets/lent-keys-C32ems-I.js +1 -0
- package/page/assets/live-ingress-lDUGPwth.js +1 -0
- package/page/assets/live-messages-CnkL4GWi.js +1 -0
- package/page/assets/mergeProps-ptS-gIMz.js +1 -0
- package/page/assets/padding.stylex-B76907Zf.js +1 -0
- package/page/assets/preload-helper-DpV6A1kQ.js +1 -0
- package/page/assets/reader-BOCCYaRp.js +7 -0
- package/page/assets/register-CDgivxvX.js +2 -0
- package/page/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/page/assets/schemas-BQ9Jydzb.js +56 -0
- package/page/assets/shaped-data-BcarWqd5.js +16 -0
- package/page/assets/sharedResizeObserver-4U9Xq5Oq.js +1 -0
- package/page/assets/stub-DhdcU_Ew.js +471 -0
- package/page/assets/studio-code-pane-C_SAbcOa.js +8 -0
- package/page/assets/studio-console-DZwlEsvr.js +3 -0
- package/page/assets/studio-decision-B0FnCAXA.js +1 -0
- package/page/assets/studio-embedding-CmA51HVo.js +2 -0
- package/page/assets/studio-host-console-By7hqu2l.js +2 -0
- package/page/assets/studio-live-BrcVQcyV.js +1 -0
- package/page/assets/studio-map-B_xSia-z.js +1 -0
- package/page/assets/studio-map-Bb06Tw1F.css +1 -0
- package/page/assets/studio-monaco-CbKf90i6.css +1 -0
- package/page/assets/studio-monaco-xfyfezQS.js +34 -0
- package/page/assets/studio-ts.worker-B-EXG4Sv.js +67741 -0
- package/page/assets/studio-ts.worker-BXtW3z-O.js +1 -0
- package/page/assets/studio-type-checker-BOvxudki.js +23 -0
- package/page/assets/themeProps-3IqahpCr.js +1 -0
- package/page/assets/tokens.stylex-DkHf0P9C.js +1 -0
- package/page/assets/tool-schema-idaOe2nI.js +18 -0
- package/page/assets/trace-patterns-DnYJa0nI.js +1 -0
- package/page/assets/trace-record-C3zNksA_.js +1 -0
- package/page/assets/trace-schema-9CdEyG6Q.js +1 -0
- package/page/assets/tree-DqyAMsbI.js +3 -0
- package/page/assets/turn-client-Du3Um3Mg.js +2 -0
- package/page/assets/types-BhfXQCLx.js +1 -0
- package/page/assets/typescript-20GgZ8PJ.js +1 -0
- package/page/assets/use-one-call-Hcs8YBp1.js +1 -0
- package/page/assets/useAdaptivePresentation-BzmPCddb.js +1 -0
- package/page/assets/useClipboard-BgGRxRMJ.js +1 -0
- package/page/assets/useContainerReveal-BFy8N_QU.js +1 -0
- package/page/assets/useDevWarning-Z9SoixOP.js +1 -0
- package/page/assets/useLayerDismissal-B_G7IWpC.js +1 -0
- package/page/assets/useMediaQuery-BCT0NUeZ.js +1 -0
- package/page/assets/useScrollLock-Dyf6PHJt.js +1 -0
- package/page/assets/useScrollableArea-0NzdiBCq.js +1 -0
- package/page/assets/useTooltip-CJM_xhLB.js +1 -0
- package/page/assets/workspace-DZALqEDX.js +1 -0
- package/page/assets/zip-DTcEfps6.js +1 -0
- package/page/index.html +90 -0
- package/page.mjs +49 -0
- package/people.d.ts +87 -0
- package/people.js +110 -0
- package/policy.d.ts +43 -0
- package/policy.js +102 -0
- package/ports.d.mts +32 -0
- package/ports.mjs +85 -0
- package/probe-battery.d.ts +13 -0
- package/probe-battery.js +404 -0
- package/providers.d.ts +149 -0
- package/providers.js +306 -0
- package/read-source.d.ts +48 -0
- package/read-source.js +1301 -0
- package/read-steps.d.ts +23 -0
- package/read-steps.js +2 -0
- package/reader.d.ts +11 -0
- package/reader.js +11 -0
- package/registrations.d.ts +83 -0
- package/registrations.js +1 -0
- package/requirements.d.ts +22 -0
- package/requirements.js +38 -0
- package/run-payload-core.d.ts +28 -0
- package/run-payload-core.js +123 -0
- package/run-payload.d.ts +32 -0
- package/run-payload.js +26 -0
- package/runtime-scope.d.ts +84 -0
- package/runtime-scope.js +308 -0
- package/runtime.d.ts +84 -0
- package/runtime.js +387 -0
- package/section-notes.d.ts +33 -0
- package/section-notes.js +38 -0
- package/serve-page.mjs +96 -0
- package/server/draft-decide.d.ts +72 -0
- package/server/draft-decide.js +111 -0
- package/server/draft-embedding.d.ts +3 -0
- package/server/draft-embedding.js +35 -0
- package/server/draft-handler.d.ts +82 -0
- package/server/draft-handler.js +213 -0
- package/server/draft-probe.d.ts +14 -0
- package/server/draft-probe.js +61 -0
- package/server/draft-replies.d.ts +22 -0
- package/server/draft-replies.js +46 -0
- package/server/edited-session.d.ts +28 -0
- package/server/edited-session.js +83 -0
- package/server/edits.d.ts +38 -0
- package/server/edits.js +195 -0
- package/server/handler.d.ts +133 -0
- package/server/handler.js +598 -0
- package/server/lent-draft.d.ts +19 -0
- package/server/lent-draft.js +23 -0
- package/server/live.d.ts +15 -0
- package/server/live.js +96 -0
- package/server/open-editor.d.ts +63 -0
- package/server/open-editor.js +115 -0
- package/server/origins.d.ts +18 -0
- package/server/origins.js +330 -0
- package/server/project-source.d.ts +208 -0
- package/server/project-source.js +1042 -0
- package/server/project.d.ts +22 -0
- package/server/project.js +56 -0
- package/server/run-traces.d.ts +20 -0
- package/server/run-traces.js +96 -0
- package/server/save-new.d.ts +29 -0
- package/server/save-new.js +514 -0
- package/server/save-plan.d.ts +46 -0
- package/server/save-plan.js +1134 -0
- package/server/save-remove.d.ts +21 -0
- package/server/save-remove.js +528 -0
- package/server/save-session.d.ts +96 -0
- package/server/save-session.js +418 -0
- package/server/save-wire.d.ts +235 -0
- package/server/save-wire.js +8 -0
- package/server/save.d.ts +52 -0
- package/server/save.js +209 -0
- package/server/serve.d.ts +23 -0
- package/server/serve.js +413 -0
- package/server/test-connection.d.ts +17 -0
- package/server/test-connection.js +362 -0
- package/server/test-key.d.ts +2 -0
- package/server/test-key.js +83 -0
- package/server/watch.d.ts +28 -0
- package/server/watch.js +93 -0
- package/server/zod-edit.d.ts +74 -0
- package/server/zod-edit.js +558 -0
- package/server.d.ts +8 -0
- package/server.js +8 -0
- package/setups.mjs +170 -0
- package/shared-carry.d.ts +114 -0
- package/shared-carry.js +523 -0
- package/shared-settings.d.ts +34 -0
- package/shared-settings.js +70 -0
- package/source.d.ts +75 -0
- package/source.js +414 -0
- package/start.mjs +169 -0
- package/stream-lines.d.ts +9 -0
- package/stream-lines.js +27 -0
- package/stub.d.ts +6 -0
- package/stub.js +33 -0
- package/surface.d.ts +53 -0
- package/surface.js +631 -0
- package/system-markup.d.ts +20 -0
- package/system-markup.js +51 -0
- package/tool-schema.d.ts +23 -0
- package/tool-schema.js +69 -0
- package/tools.d.ts +16 -0
- package/tools.js +91 -0
- package/traces.d.ts +24 -0
- package/traces.js +29 -0
- package/transport.d.ts +57 -0
- package/transport.js +187 -0
- package/tree.d.ts +32 -0
- package/tree.js +83 -0
- package/types.d.ts +62 -0
- package/types.js +6 -0
- package/ui/acting-as-button.d.ts +2 -0
- package/ui/acting-as-button.js +16 -0
- package/ui/add-provider.d.ts +13 -0
- package/ui/add-provider.js +20 -0
- package/ui/boot-mark.css +53 -0
- package/ui/boot-mark.d.ts +19 -0
- package/ui/boot-mark.js +128 -0
- package/ui/boot-paint.d.ts +8 -0
- package/ui/boot-paint.js +8 -0
- package/ui/brand-icons.d.ts +57 -0
- package/ui/brand-icons.js +148 -0
- package/ui/built/theme.css +830 -0
- package/ui/built/theme.css.d.ts +9 -0
- package/ui/built/theorem-studio.d.ts +13 -0
- package/ui/built/theorem-studio.js +705 -0
- package/ui/built/theorem-studio.variants.d.ts +28 -0
- package/ui/code/monaco-contributions.d.ts +45 -0
- package/ui/code/studio-code.d.ts +7 -0
- package/ui/code/studio-code.js +253 -0
- package/ui/code/studio-monaco.d.ts +44 -0
- package/ui/code/studio-monaco.js +48 -0
- package/ui/code/studio-ts.worker.d.ts +1 -0
- package/ui/code/studio-ts.worker.js +16 -0
- package/ui/code/studio-type-checker.d.ts +12 -0
- package/ui/code/studio-type-checker.js +308 -0
- package/ui/code/studio-type-sources.d.ts +26 -0
- package/ui/confirm-write.d.ts +12 -0
- package/ui/confirm-write.js +45 -0
- package/ui/diff-block.d.ts +21 -0
- package/ui/diff-block.js +17 -0
- package/ui/figtree.css +59 -0
- package/ui/file-place.d.ts +4 -0
- package/ui/file-place.js +26 -0
- package/ui/guardrail-tester.d.ts +18 -0
- package/ui/guardrail-tester.js +248 -0
- package/ui/inspector-context.d.ts +119 -0
- package/ui/inspector-context.js +84 -0
- package/ui/inspector.d.ts +247 -0
- package/ui/inspector.js +284 -0
- package/ui/lib/acting-as.d.ts +25 -0
- package/ui/lib/acting-as.js +90 -0
- package/ui/lib/boot-sequence.d.ts +32 -0
- package/ui/lib/boot-sequence.js +57 -0
- package/ui/lib/export-agent.d.ts +11 -0
- package/ui/lib/export-agent.js +335 -0
- package/ui/lib/facet-icons.d.ts +20 -0
- package/ui/lib/facet-icons.js +21 -0
- package/ui/lib/panel-motion.d.ts +8 -0
- package/ui/lib/panel-motion.js +74 -0
- package/ui/lib/project-address.d.ts +14 -0
- package/ui/lib/project-address.js +24 -0
- package/ui/lib/project-starting.d.ts +13 -0
- package/ui/lib/project-starting.js +30 -0
- package/ui/lib/project-traces.d.ts +17 -0
- package/ui/lib/project-traces.js +54 -0
- package/ui/lib/read-map.d.ts +30 -0
- package/ui/lib/read-map.js +173 -0
- package/ui/lib/read-progress.d.ts +14 -0
- package/ui/lib/read-progress.js +12 -0
- package/ui/lib/refusal-lines.d.ts +3 -0
- package/ui/lib/refusal-lines.js +8 -0
- package/ui/lib/studio-activity.d.ts +5 -0
- package/ui/lib/studio-activity.js +17 -0
- package/ui/lib/studio-console.d.ts +27 -0
- package/ui/lib/studio-console.js +9 -0
- package/ui/lib/studio-conversation.d.ts +20 -0
- package/ui/lib/studio-conversation.js +130 -0
- package/ui/lib/studio-examples.d.ts +31 -0
- package/ui/lib/studio-examples.js +25 -0
- package/ui/lib/studio-labels.d.ts +6 -0
- package/ui/lib/studio-labels.js +13 -0
- package/ui/lib/studio-map-kept.d.ts +17 -0
- package/ui/lib/studio-map-kept.js +48 -0
- package/ui/lib/studio-open.d.ts +22 -0
- package/ui/lib/studio-open.js +54 -0
- package/ui/lib/studio-page.d.ts +33 -0
- package/ui/lib/studio-page.js +121 -0
- package/ui/lib/studio-prefs.d.ts +26 -0
- package/ui/lib/studio-prefs.js +87 -0
- package/ui/lib/studio-project.d.ts +106 -0
- package/ui/lib/studio-project.js +177 -0
- package/ui/lib/studio-restore.d.ts +49 -0
- package/ui/lib/studio-restore.js +251 -0
- package/ui/lib/studio-run-open.d.ts +15 -0
- package/ui/lib/studio-run-open.js +16 -0
- package/ui/lib/studio-session.d.ts +34 -0
- package/ui/lib/studio-session.js +17 -0
- package/ui/lib/studio-settings.d.ts +15 -0
- package/ui/lib/studio-settings.js +48 -0
- package/ui/lib/studio-store.d.ts +64 -0
- package/ui/lib/studio-store.js +391 -0
- package/ui/lib/studio-watch.d.ts +12 -0
- package/ui/lib/studio-watch.js +27 -0
- package/ui/lib/tab-fills.d.ts +6 -0
- package/ui/lib/tab-fills.js +14 -0
- package/ui/lib/tool-credentials.d.ts +3 -0
- package/ui/lib/tool-credentials.js +23 -0
- package/ui/lib/tool-probe.d.ts +19 -0
- package/ui/lib/tool-probe.js +104 -0
- package/ui/lib/type-icons.d.ts +35 -0
- package/ui/lib/type-icons.js +38 -0
- package/ui/lib/when-idle.d.ts +5 -0
- package/ui/lib/when-idle.js +14 -0
- package/ui/lib/zip.d.ts +5 -0
- package/ui/lib/zip.js +8 -0
- package/ui/map-token.css +11 -0
- package/ui/map-token.d.ts +17 -0
- package/ui/map-token.js +29 -0
- package/ui/mcp-icon.d.ts +6 -0
- package/ui/mcp-icon.js +8 -0
- package/ui/motion.css +113 -0
- package/ui/pan.d.ts +32 -0
- package/ui/pan.js +90 -0
- package/ui/profile-editor.d.ts +33 -0
- package/ui/profile-editor.js +2638 -0
- package/ui/provider-editor.d.ts +15 -0
- package/ui/provider-editor.js +92 -0
- package/ui/read-map.css +48 -0
- package/ui/read-map.d.ts +7 -0
- package/ui/read-map.js +163 -0
- package/ui/refusal-detail.d.ts +4 -0
- package/ui/refusal-detail.js +21 -0
- package/ui/shared-change.d.ts +9 -0
- package/ui/shared-change.js +28 -0
- package/ui/shell-motion.css +121 -0
- package/ui/shell-motion.d.ts +73 -0
- package/ui/shell-motion.js +194 -0
- package/ui/studio-code-pane.d.ts +19 -0
- package/ui/studio-code-pane.js +44 -0
- package/ui/studio-compare.d.ts +80 -0
- package/ui/studio-compare.js +326 -0
- package/ui/studio-conflicts.d.ts +17 -0
- package/ui/studio-conflicts.js +87 -0
- package/ui/studio-connection.d.ts +64 -0
- package/ui/studio-connection.js +286 -0
- package/ui/studio-decision.d.ts +6 -0
- package/ui/studio-decision.js +49 -0
- package/ui/studio-embedding.d.ts +6 -0
- package/ui/studio-embedding.js +30 -0
- package/ui/studio-host-console.d.ts +6 -0
- package/ui/studio-host-console.js +17 -0
- package/ui/studio-host.d.ts +73 -0
- package/ui/studio-host.js +12 -0
- package/ui/studio-live.d.ts +17 -0
- package/ui/studio-live.js +26 -0
- package/ui/studio-map.css +273 -0
- package/ui/studio-map.d.ts +17 -0
- package/ui/studio-map.js +397 -0
- package/ui/studio-nav.d.ts +24 -0
- package/ui/studio-nav.js +17 -0
- package/ui/studio-no-project.d.ts +5 -0
- package/ui/studio-no-project.js +9 -0
- package/ui/studio-run.css +76 -0
- package/ui/studio-run.d.ts +14 -0
- package/ui/studio-run.js +119 -0
- package/ui/studio-runner.d.ts +45 -0
- package/ui/studio-runner.js +187 -0
- package/ui/studio-save.d.ts +49 -0
- package/ui/studio-save.js +307 -0
- package/ui/studio-screen.d.ts +61 -0
- package/ui/studio-screen.js +2078 -0
- package/ui/studio-settings.d.ts +31 -0
- package/ui/studio-settings.js +288 -0
- package/ui/studio-shell.css +27 -0
- package/ui/studio-shell.d.ts +43 -0
- package/ui/studio-shell.js +87 -0
- package/ui/studio-theme.d.ts +7 -0
- package/ui/studio-theme.js +94 -0
- package/ui/studio.css +427 -0
- package/ui/theorem-mark.css +84 -0
- package/ui/theorem-mark.d.ts +22 -0
- package/ui/theorem-mark.js +21 -0
- package/vite.d.mts +30 -0
- package/vite.mjs +277 -0
- package/workspace.d.ts +230 -0
- package/workspace.js +1054 -0
package/map.js
ADDED
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workspace as a map. Each profile is a card of its sections; what feeds it stands beside it:
|
|
3
|
+
* the providers and models it runs on, the settings the project shares, the tools it may call. A
|
|
4
|
+
* line joins each to the section it feeds. It is read from the workspace and changes nothing; each
|
|
5
|
+
* node and section names the workspace node that opens it.
|
|
6
|
+
*/
|
|
7
|
+
import { mapCurve, mapRail } from "./map-line.js";
|
|
8
|
+
import { sharedOpens } from "./shared-settings.js";
|
|
9
|
+
import { modelBindingNodeId, providerNodeId, toolSpecNodeId } from "./tree.js";
|
|
10
|
+
import { agentNodeId, workspaceTree } from "./workspace.js";
|
|
11
|
+
/**
|
|
12
|
+
* `nodes` in the order of what each is joined to in the column beside it (`rows`), so the lines
|
|
13
|
+
* cross less; unjoined ones go last.
|
|
14
|
+
*/
|
|
15
|
+
function byRows(nodes, links, rows) {
|
|
16
|
+
const rank = (node) => {
|
|
17
|
+
const joined = links
|
|
18
|
+
.flatMap(({ from, to }) => (from === node.id ? [to] : to === node.id ? [from] : []))
|
|
19
|
+
.flatMap((id) => rows.get(id) ?? []);
|
|
20
|
+
return joined.length === 0
|
|
21
|
+
? Infinity
|
|
22
|
+
: joined.reduce((sum, row) => sum + row, 0) / joined.length;
|
|
23
|
+
};
|
|
24
|
+
const ranks = new Map(nodes.map((node) => [node.id, rank(node)]));
|
|
25
|
+
const at = (node) => ranks.get(node.id) ?? Infinity;
|
|
26
|
+
// Two unjoined nodes compare equal (Infinity less Infinity is not a number); the sort is stable.
|
|
27
|
+
return [...nodes].sort((a, b) => (at(a) === at(b) ? 0 : at(a) - at(b)));
|
|
28
|
+
}
|
|
29
|
+
/** What a section's row says beside its name, where one line can say it. */
|
|
30
|
+
function rowNote(agent, facet, tools) {
|
|
31
|
+
if (facet === 'models')
|
|
32
|
+
return agent.modelBindings.map((binding) => binding.modelId || 'New model').join(', ');
|
|
33
|
+
if (facet === 'tools')
|
|
34
|
+
return String(agent.tools.allow.filter((key) => tools.has(key)).length);
|
|
35
|
+
if (facet === 'outputs')
|
|
36
|
+
return agent.outputs.mode;
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
/** The map of `workspace`, with the settings its project shares. */
|
|
40
|
+
export function workspaceMap(workspace, shared = []) {
|
|
41
|
+
const links = [];
|
|
42
|
+
const agentIds = new Map(workspace.agents.map((agent) => [agent.key, agentNodeId(agent.key)]));
|
|
43
|
+
const toolIds = new Map(workspace.toolSpecs.map((tool) => [tool.key, toolSpecNodeId(tool.key)]));
|
|
44
|
+
const tree = workspaceTree(workspace);
|
|
45
|
+
const agents = workspace.agents.map((agent, index) => {
|
|
46
|
+
const { agentId, profileType, handle } = agent.identity;
|
|
47
|
+
const type = profileType || 'text';
|
|
48
|
+
return {
|
|
49
|
+
id: agentNodeId(agent.key),
|
|
50
|
+
kind: 'agent',
|
|
51
|
+
label: agentId || 'New agent',
|
|
52
|
+
note: handle ? `${type} · ${handle}` : type,
|
|
53
|
+
opens: agentNodeId(agent.key),
|
|
54
|
+
type,
|
|
55
|
+
rows: (tree.agents[index]?.children ?? []).map((section) => ({
|
|
56
|
+
id: section.id,
|
|
57
|
+
label: section.label,
|
|
58
|
+
note: rowNote(agent, section.ref.facet, toolIds),
|
|
59
|
+
opens: section.id,
|
|
60
|
+
type: section.ref.facet,
|
|
61
|
+
})),
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const sections = new Set(agents.flatMap((agent) => agent.rows ?? []).map((row) => row.id));
|
|
65
|
+
/** An agent's section when its profile has it, else the agent itself. */
|
|
66
|
+
const at = (key, facet) => {
|
|
67
|
+
const row = agentNodeId(key, facet);
|
|
68
|
+
return sections.has(row) ? row : agentNodeId(key);
|
|
69
|
+
};
|
|
70
|
+
const providers = new Map();
|
|
71
|
+
const definitions = new Map(workspace.providers.map((provider) => [provider.id, provider.definition]));
|
|
72
|
+
const models = new Map();
|
|
73
|
+
for (const agent of workspace.agents) {
|
|
74
|
+
const to = at(agent.key, 'models');
|
|
75
|
+
for (const binding of agent.modelBindings) {
|
|
76
|
+
// Two agents share a model's node when they name it alike and reach the same model.
|
|
77
|
+
const id = `model:${binding.provider}:${binding.apiId}:${binding.modelId}`;
|
|
78
|
+
const provider = providerNodeId(binding.provider);
|
|
79
|
+
if (!providers.has(provider)) {
|
|
80
|
+
// A provider the workspace does not define opens the first model it serves.
|
|
81
|
+
providers.set(provider, {
|
|
82
|
+
id: provider,
|
|
83
|
+
kind: 'provider',
|
|
84
|
+
label: binding.provider,
|
|
85
|
+
note: '',
|
|
86
|
+
opens: definitions.has(binding.provider)
|
|
87
|
+
? provider
|
|
88
|
+
: agentNodeId(agent.key, modelBindingNodeId(binding.key)),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const opens = agentNodeId(agent.key, modelBindingNodeId(binding.key));
|
|
92
|
+
const model = models.get(id);
|
|
93
|
+
if (model)
|
|
94
|
+
model.holds?.push(opens);
|
|
95
|
+
else {
|
|
96
|
+
models.set(id, {
|
|
97
|
+
id,
|
|
98
|
+
kind: 'model',
|
|
99
|
+
label: binding.modelId || 'New model',
|
|
100
|
+
note: binding.apiId,
|
|
101
|
+
type: definitions.get(binding.provider),
|
|
102
|
+
opens,
|
|
103
|
+
holds: [opens],
|
|
104
|
+
});
|
|
105
|
+
links.push({ from: provider, to: id, kind: 'serves' });
|
|
106
|
+
}
|
|
107
|
+
if (!links.some((link) => link.from === id && link.to === to))
|
|
108
|
+
links.push({ from: id, to, kind: 'runs' });
|
|
109
|
+
const writer = binding.compactWith ? agentIds.get(binding.compactWith) : undefined;
|
|
110
|
+
const summarised = links.some((link) => link.kind === 'summarised' && link.from === to);
|
|
111
|
+
if (writer && writer !== agentNodeId(agent.key) && !summarised) {
|
|
112
|
+
links.push({ from: to, to: writer, kind: 'summarised' });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const key of agent.tools.allow) {
|
|
116
|
+
const tool = toolIds.get(key);
|
|
117
|
+
if (tool)
|
|
118
|
+
links.push({ from: at(agent.key, 'tools'), to: tool, kind: 'allows' });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const tools = workspace.toolSpecs.map((tool) => {
|
|
122
|
+
const id = toolSpecNodeId(tool.key);
|
|
123
|
+
const asked = tool.toolType === 'agent' ? agentIds.get(tool.agentKey ?? '') : undefined;
|
|
124
|
+
if (asked)
|
|
125
|
+
links.push({ from: id, to: asked, kind: 'asks' });
|
|
126
|
+
return {
|
|
127
|
+
id,
|
|
128
|
+
kind: 'tool',
|
|
129
|
+
label: tool.toolName || 'New tool',
|
|
130
|
+
note: tool.description,
|
|
131
|
+
opens: id,
|
|
132
|
+
type: tool.toolType,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
const settings = shared.map((entry) => {
|
|
136
|
+
const { setting, facet } = entry;
|
|
137
|
+
const id = `shared:${setting.file}:${setting.name}`;
|
|
138
|
+
const users = entry.agents.filter((key) => agentIds.has(key));
|
|
139
|
+
const used = setting.tools.flatMap((name) => {
|
|
140
|
+
const tool = workspace.toolSpecs.find((spec) => spec.toolName === name);
|
|
141
|
+
return tool ? [toolSpecNodeId(tool.key)] : [];
|
|
142
|
+
});
|
|
143
|
+
for (const key of users)
|
|
144
|
+
links.push({ from: id, to: facet ? at(key, facet) : agentNodeId(key), kind: 'sets' });
|
|
145
|
+
for (const to of used)
|
|
146
|
+
links.push({ from: id, to, kind: 'sets' });
|
|
147
|
+
return {
|
|
148
|
+
id,
|
|
149
|
+
kind: 'shared',
|
|
150
|
+
label: setting.label,
|
|
151
|
+
note: `${setting.name} · ${setting.file}:${String(setting.line)}`,
|
|
152
|
+
// It opens where it is changed: the field the files set from it.
|
|
153
|
+
opens: sharedOpens(entry) ?? used[0],
|
|
154
|
+
type: facet,
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
// Each agent and its sections by the agent's place; then each model by its own, for the providers.
|
|
158
|
+
const rows = new Map(agents.flatMap((agent, row) => [agent.id, ...(agent.rows ?? []).map((each) => each.id)].map((id) => [id, row])));
|
|
159
|
+
for (const model of models.values()) {
|
|
160
|
+
const twin = [...models.values()].some((other) => other !== model && other.label === model.label);
|
|
161
|
+
if (twin && model.note)
|
|
162
|
+
model.long = `${model.label} · ${model.note}`;
|
|
163
|
+
}
|
|
164
|
+
const ordered = byRows([...models.values()], links, rows);
|
|
165
|
+
const modelRows = new Map(ordered.map((model, row) => [model.id, row]));
|
|
166
|
+
const groups = (...all) => all.filter((group) => group.nodes.length > 0);
|
|
167
|
+
const columns = [
|
|
168
|
+
groups({ label: 'Providers', nodes: byRows([...providers.values()], links, modelRows) }),
|
|
169
|
+
groups({ label: 'Shared settings', nodes: byRows(settings, links, rows) }, { label: 'Models', nodes: ordered }),
|
|
170
|
+
groups({ label: 'Profiles', nodes: agents }),
|
|
171
|
+
groups({ label: 'Tools', nodes: byRows(tools, links, rows) }),
|
|
172
|
+
].filter((column) => column.length > 0);
|
|
173
|
+
return { columns, links };
|
|
174
|
+
}
|
|
175
|
+
/** Every node and every section, by id, under the node that holds it. */
|
|
176
|
+
function owners(map) {
|
|
177
|
+
const nodes = map.columns.flat().flatMap((group) => group.nodes);
|
|
178
|
+
return new Map(nodes.flatMap((node) => [node.id, ...(node.rows ?? []).map((row) => row.id)].map((id) => [id, node])));
|
|
179
|
+
}
|
|
180
|
+
/** The nodes a link joins: a link to a profile's section joins the profile. */
|
|
181
|
+
export function mapLinkEnds(map) {
|
|
182
|
+
const held = owners(map);
|
|
183
|
+
return map.links.flatMap((link) => {
|
|
184
|
+
const from = held.get(link.from)?.id;
|
|
185
|
+
const to = held.get(link.to)?.id;
|
|
186
|
+
return from !== undefined && to !== undefined ? [{ link, from, to }] : [];
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/** `id` and every node a link joins it to. */
|
|
190
|
+
export function mapNeighbours(map, id) {
|
|
191
|
+
return new Set([
|
|
192
|
+
id,
|
|
193
|
+
...mapLinkEnds(map).flatMap(({ from, to }) => (from === id ? [to] : to === id ? [from] : [])),
|
|
194
|
+
]);
|
|
195
|
+
}
|
|
196
|
+
/** The nodes whose name or note holds `query`, whatever its case: their ids. None for an empty query. */
|
|
197
|
+
export function mapFound(map, query) {
|
|
198
|
+
const asked = query.trim().toLowerCase();
|
|
199
|
+
if (asked === '')
|
|
200
|
+
return [];
|
|
201
|
+
return map.columns
|
|
202
|
+
.flat()
|
|
203
|
+
.flatMap((group) => group.nodes)
|
|
204
|
+
.filter((node) => [node.label, node.long ?? '', node.note].some((text) => text.toLowerCase().includes(asked)))
|
|
205
|
+
.map((node) => node.id);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* `id`'s family: the node, everything that feeds it, and everything it feeds, however many links
|
|
209
|
+
* away, with the links between them. Empty when the map has no such node. Several ids give their
|
|
210
|
+
* families together.
|
|
211
|
+
*/
|
|
212
|
+
export function mapFamily(map, id) {
|
|
213
|
+
const ids = typeof id === 'string' ? [id] : id;
|
|
214
|
+
const ends = mapLinkEnds(map);
|
|
215
|
+
const reached = (near, far) => {
|
|
216
|
+
const seen = new Set(ids);
|
|
217
|
+
const queue = [...ids];
|
|
218
|
+
for (let next = queue.pop(); next !== undefined; next = queue.pop()) {
|
|
219
|
+
for (const end of ends) {
|
|
220
|
+
if (end[near] !== next || seen.has(end[far]))
|
|
221
|
+
continue;
|
|
222
|
+
seen.add(end[far]);
|
|
223
|
+
queue.push(end[far]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return seen;
|
|
227
|
+
};
|
|
228
|
+
const family = new Set([...reached('to', 'from'), ...reached('from', 'to')]);
|
|
229
|
+
const columns = map.columns
|
|
230
|
+
.map((column) => column
|
|
231
|
+
.map((group) => ({ ...group, nodes: group.nodes.filter((node) => family.has(node.id)) }))
|
|
232
|
+
.filter((group) => group.nodes.length > 0))
|
|
233
|
+
.filter((column) => column.length > 0);
|
|
234
|
+
const kept = new Set(ends.filter(({ from, to }) => family.has(from) && family.has(to)).map(({ link }) => link));
|
|
235
|
+
return { columns, links: map.links.filter((link) => kept.has(link)) };
|
|
236
|
+
}
|
|
237
|
+
/** A link in words from each end: `[from's side, to's side]`, each before the other node's label. */
|
|
238
|
+
const LINK_WORDS = {
|
|
239
|
+
serves: ['Serves', 'Served by'],
|
|
240
|
+
sets: ['Sets', 'Set by'],
|
|
241
|
+
runs: ['Runs', 'Runs on'],
|
|
242
|
+
allows: ['Allows', 'Allowed by'],
|
|
243
|
+
asks: ['Asks', 'Asked by'],
|
|
244
|
+
summarised: ['Summarised by', 'Summarises for'],
|
|
245
|
+
};
|
|
246
|
+
/** What joins a node to the rest, in words: "Runs on gemini-2.5-flash. Allows get_weather, find_plant." */
|
|
247
|
+
export function mapLinkWords(map, id) {
|
|
248
|
+
const held = owners(map);
|
|
249
|
+
const said = new Map();
|
|
250
|
+
for (const { link, from, to } of mapLinkEnds(map)) {
|
|
251
|
+
if (from !== id && to !== id)
|
|
252
|
+
continue;
|
|
253
|
+
const words = LINK_WORDS[link.kind][from === id ? 0 : 1];
|
|
254
|
+
const other = held.get(from === id ? to : from)?.label;
|
|
255
|
+
if (other !== undefined)
|
|
256
|
+
said.set(words, [...(said.get(words) ?? []), other]);
|
|
257
|
+
}
|
|
258
|
+
return [...said].map(([words, others]) => `${words} ${others.join(', ')}.`).join(' ');
|
|
259
|
+
}
|
|
260
|
+
/** How many lines of its note a node shows: a tool's description and a shared setting's source run to two. */
|
|
261
|
+
export function mapNoteLines(node) {
|
|
262
|
+
return node.kind === 'tool' || node.kind === 'shared' ? 2 : 1;
|
|
263
|
+
}
|
|
264
|
+
/** How finely a line is walked to see what it crosses, and how far apart lines going round keep. */
|
|
265
|
+
const CURVE_STEPS = 24;
|
|
266
|
+
const LANE_GAP = 8;
|
|
267
|
+
/** How far a rail keeps from the column it is beside, and from the next rail. */
|
|
268
|
+
const TURN_GAP = 2 * LANE_GAP;
|
|
269
|
+
/** Each link whose ends stand `apart` or more from each other by `at`, as its span. */
|
|
270
|
+
function mapSpans(map, at, apart) {
|
|
271
|
+
const fans = new Map();
|
|
272
|
+
const fan = (id, way) => `${id}:${String(way)}`;
|
|
273
|
+
const across = mapLinkEnds(map).flatMap(({ link }) => {
|
|
274
|
+
const [a, b] = [at(link.from), at(link.to)];
|
|
275
|
+
if (a === undefined || b === undefined || Math.abs(a - b) < apart)
|
|
276
|
+
return [];
|
|
277
|
+
const way = a < b ? 1 : -1;
|
|
278
|
+
for (const key of [fan(link.from, way), fan(link.to, -way)])
|
|
279
|
+
fans.set(key, (fans.get(key) ?? 0) + 1);
|
|
280
|
+
return [{ link, way }];
|
|
281
|
+
});
|
|
282
|
+
return across.map(({ link, way }) => {
|
|
283
|
+
const [out, into] = [fan(link.from, way), fan(link.to, -way)];
|
|
284
|
+
const leaves = (fans.get(out) ?? 0) >= (fans.get(into) ?? 0);
|
|
285
|
+
return { link, way, leaves, hub: leaves ? out : into };
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Where everything on the map goes: the columns side by side from the top, each group under its
|
|
290
|
+
* heading, except a node in `moved`, which goes where it was put. A line leaves the side of a node
|
|
291
|
+
* that faces the other; between two nodes one above the other it bows out to the right, past what
|
|
292
|
+
* stands between them. Between two columns the lines that share an end run as one, and part beside
|
|
293
|
+
* the end fewer lines share, each end's lines along a rail of their own: two columns stand far enough
|
|
294
|
+
* apart for the rails between them. A line that would pass behind a node or a heading goes over or under only
|
|
295
|
+
* what is in its way, whichever is nearer. The map is large enough for every line.
|
|
296
|
+
*/
|
|
297
|
+
export function mapLayout(map, sizes, view = {}) {
|
|
298
|
+
const { node, card, columnGap, rowGap, heading, groupGap, padding, lineGap } = sizes;
|
|
299
|
+
const { moved = {}, widths = {}, detail = false } = view;
|
|
300
|
+
/** The column each node and section stands in, unless it was moved out of it. */
|
|
301
|
+
const columnOf = new Map();
|
|
302
|
+
map.columns.forEach((column, index) => {
|
|
303
|
+
for (const group of column)
|
|
304
|
+
for (const each of group.nodes)
|
|
305
|
+
if (!Object.hasOwn(moved, each.id))
|
|
306
|
+
for (const id of [each.id, ...(each.rows ?? []).map((row) => row.id)])
|
|
307
|
+
columnOf.set(id, index);
|
|
308
|
+
});
|
|
309
|
+
const put = (lefts) => {
|
|
310
|
+
const nodes = {};
|
|
311
|
+
const headings = [];
|
|
312
|
+
const boxes = [];
|
|
313
|
+
/** Where a line meets each node or section: the node's two sides and the height it joins at. */
|
|
314
|
+
const ports = new Map();
|
|
315
|
+
let right = 0;
|
|
316
|
+
let bottom = 0;
|
|
317
|
+
map.columns.forEach((column, index) => {
|
|
318
|
+
const x = lefts[index] ?? padding;
|
|
319
|
+
let y = padding;
|
|
320
|
+
column.forEach((group, at) => {
|
|
321
|
+
if (at > 0)
|
|
322
|
+
y += groupGap;
|
|
323
|
+
headings.push({ label: group.label, x, y });
|
|
324
|
+
boxes.push({ id: `heading:${index}:${at}`, x, y, width: node.width, height: heading });
|
|
325
|
+
y += heading;
|
|
326
|
+
for (const each of group.nodes) {
|
|
327
|
+
const rows = detail ? (each.rows ?? []) : [];
|
|
328
|
+
// With detail a node's name is one row, as a token is; one with no note is that row alone.
|
|
329
|
+
const noted = rows.length > 0 || each.note !== '';
|
|
330
|
+
const full = detail && (rows.length > 0 || mapNoteLines(each) === 1) ? card.head : node.height;
|
|
331
|
+
const head = detail && !noted ? card.row : full;
|
|
332
|
+
const height = rows.length > 0 ? card.head + rows.length * card.row + card.foot : head;
|
|
333
|
+
const width = Math.min(widths[each.id] ?? node.width, node.width);
|
|
334
|
+
const put = Object.hasOwn(moved, each.id) ? moved[each.id] : undefined;
|
|
335
|
+
const place = put ? { x: Math.max(put.x, 0), y: Math.max(put.y, 0) } : { x, y };
|
|
336
|
+
nodes[each.id] = { ...place, height };
|
|
337
|
+
boxes.push({ id: each.id, ...place, width, height });
|
|
338
|
+
const port = {
|
|
339
|
+
left: place.x,
|
|
340
|
+
right: place.x + width,
|
|
341
|
+
y: place.y + (detail ? card.row : head) / 2,
|
|
342
|
+
};
|
|
343
|
+
ports.set(each.id, port);
|
|
344
|
+
for (const [line, row] of (each.rows ?? []).entries())
|
|
345
|
+
ports.set(row.id, detail ? { ...port, y: place.y + card.head + line * card.row + card.row / 2 } : port);
|
|
346
|
+
right = Math.max(right, place.x + node.width);
|
|
347
|
+
bottom = Math.max(bottom, place.y + height);
|
|
348
|
+
// A moved node leaves its place in the column open, so the rest hold still.
|
|
349
|
+
y += height + rowGap;
|
|
350
|
+
}
|
|
351
|
+
y -= rowGap;
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
return { nodes, headings, boxes, ports, right, bottom };
|
|
355
|
+
};
|
|
356
|
+
/** Where a line between two columns starts and ends, and the side its rails are counted from, and which way. */
|
|
357
|
+
const reach = (span, a, b) => {
|
|
358
|
+
const { way, leaves } = span;
|
|
359
|
+
const start = { x: way > 0 ? a.right + lineGap : a.left - lineGap, y: a.y };
|
|
360
|
+
const end = { x: way > 0 ? b.left - lineGap : b.right + lineGap, y: b.y };
|
|
361
|
+
const fromSide = way > 0 ? Math.max(a.left + node.width, a.right) + lineGap : start.x;
|
|
362
|
+
const toSide = way > 0 ? end.x : Math.max(b.left + node.width, b.right) + lineGap;
|
|
363
|
+
const side = leaves ? toSide : fromSide;
|
|
364
|
+
const into = leaves ? -way : way;
|
|
365
|
+
return {
|
|
366
|
+
start,
|
|
367
|
+
end,
|
|
368
|
+
side,
|
|
369
|
+
into,
|
|
370
|
+
room: Math.abs(toSide - fromSide),
|
|
371
|
+
strip: `${String(side)}:${String(into)}`,
|
|
372
|
+
};
|
|
373
|
+
};
|
|
374
|
+
/**
|
|
375
|
+
* The rail each end's lines part on, counted from the side of the column they part beside, and how
|
|
376
|
+
* many rails each side holds. Two ends share a rail where neither's lines reach the other's.
|
|
377
|
+
*/
|
|
378
|
+
const railed = (ports) => {
|
|
379
|
+
const spans = new Map(mapSpans(map, (id) => ports.get(id)?.left, node.width).map((span) => [span.link, span]));
|
|
380
|
+
const strips = new Map();
|
|
381
|
+
for (const span of spans.values()) {
|
|
382
|
+
const a = ports.get(span.link.from);
|
|
383
|
+
const b = ports.get(span.link.to);
|
|
384
|
+
if (!a || !b || a.y === b.y)
|
|
385
|
+
continue;
|
|
386
|
+
const { strip } = reach(span, a, b);
|
|
387
|
+
const ends = strips.get(strip) ?? new Map();
|
|
388
|
+
const beside = span.leaves ? span.link.to : span.link.from;
|
|
389
|
+
const end = ends.get(span.hub) ?? { y: span.leaves ? a.y : b.y, joins: [], beside };
|
|
390
|
+
end.joins.push(span.leaves ? b.y : a.y);
|
|
391
|
+
strips.set(strip, ends.set(span.hub, end));
|
|
392
|
+
}
|
|
393
|
+
const rails = new Map();
|
|
394
|
+
const held = new Map();
|
|
395
|
+
for (const [strip, ends] of strips) {
|
|
396
|
+
const mean = (all) => all.reduce((sum, y) => sum + y, 0) / all.length;
|
|
397
|
+
const all = [...ends.values()];
|
|
398
|
+
const down = mean(all.flatMap((end) => end.joins)) >= mean(all.map((end) => end.y));
|
|
399
|
+
const taken = [];
|
|
400
|
+
// The end nearest what the strip joins takes the first rail, so its trunk crosses the fewest.
|
|
401
|
+
for (const [hub, end] of [...ends].sort(([, one], [, other]) => down ? one.y - other.y : other.y - one.y)) {
|
|
402
|
+
const low = Math.min(end.y, ...end.joins) - LANE_GAP;
|
|
403
|
+
const high = Math.max(end.y, ...end.joins) + LANE_GAP;
|
|
404
|
+
const free = taken.findIndex((spansOf) => spansOf.every((each) => high < each.low || low > each.high));
|
|
405
|
+
const rail = free < 0 ? taken.length : free;
|
|
406
|
+
taken[rail] = [...(taken[rail] ?? []), { low, high }];
|
|
407
|
+
rails.set(`${strip}:${hub}`, rail);
|
|
408
|
+
}
|
|
409
|
+
const [first] = all;
|
|
410
|
+
if (first)
|
|
411
|
+
held.set(strip, {
|
|
412
|
+
count: taken.length,
|
|
413
|
+
beside: first.beside,
|
|
414
|
+
into: Number(strip.split(':')[1]),
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
return { spans, rails, held };
|
|
418
|
+
};
|
|
419
|
+
// Heights do not turn on where the columns stand: lay them out once to count each side's rails, then
|
|
420
|
+
// give each pair of columns the room for both sides' rails.
|
|
421
|
+
const even = map.columns.map((_, index) => padding + index * (node.width + columnGap));
|
|
422
|
+
const rooms = map.columns.map(() => 0);
|
|
423
|
+
for (const { count, beside, into } of railed(put(even).ports).held.values()) {
|
|
424
|
+
const column = columnOf.get(beside);
|
|
425
|
+
if (column === undefined)
|
|
426
|
+
continue;
|
|
427
|
+
const after = into > 0 ? column : column - 1;
|
|
428
|
+
if (after >= 0 && after < rooms.length)
|
|
429
|
+
rooms[after] = (rooms[after] ?? 0) + count + 1;
|
|
430
|
+
}
|
|
431
|
+
const lefts = [padding];
|
|
432
|
+
for (const [index, held] of rooms.entries())
|
|
433
|
+
lefts.push((lefts[index] ?? padding) + node.width + Math.max(columnGap, held * TURN_GAP));
|
|
434
|
+
const laidOut = put(lefts);
|
|
435
|
+
const { nodes, headings, boxes, ports } = laidOut;
|
|
436
|
+
let { right, bottom } = laidOut;
|
|
437
|
+
const { spans, rails } = railed(ports);
|
|
438
|
+
const gap = columnGap / 2;
|
|
439
|
+
/** How far a line going round keeps from what it goes round. */
|
|
440
|
+
const clear = Math.max(rowGap / 2, lineGap);
|
|
441
|
+
/** The lanes lines already go round in: the next one keeps `LANE_GAP` clear of each. */
|
|
442
|
+
const laid = [];
|
|
443
|
+
/** The lane the lines of one end take round a column: they go round as one. */
|
|
444
|
+
const lanes = new Map();
|
|
445
|
+
const widest = Math.max(columnGap, ...rooms.map((held) => held * TURN_GAP));
|
|
446
|
+
const lines = mapLinkEnds(map).flatMap(({ link, from, to }) => {
|
|
447
|
+
const a = ports.get(link.from);
|
|
448
|
+
const b = ports.get(link.to);
|
|
449
|
+
if (!a || !b)
|
|
450
|
+
return [];
|
|
451
|
+
const others = boxes.filter((box) => box.id !== from && box.id !== to);
|
|
452
|
+
if (Math.abs(a.left - b.left) < node.width) {
|
|
453
|
+
const ax = a.right + lineGap;
|
|
454
|
+
const bx = b.right + lineGap;
|
|
455
|
+
const beside = others.filter((box) => box.y < Math.max(a.y, b.y) &&
|
|
456
|
+
box.y + box.height > Math.min(a.y, b.y) &&
|
|
457
|
+
box.x < Math.max(ax, bx) + gap &&
|
|
458
|
+
box.x + box.width > Math.min(a.left, b.left));
|
|
459
|
+
const bow = Math.max(ax, bx, ...beside.map((box) => box.x + box.width)) + gap;
|
|
460
|
+
right = Math.max(right, bow);
|
|
461
|
+
return [{ link, from, to, d: mapCurve({ x: ax, y: a.y }, { x: bx, y: b.y }, bow).d }];
|
|
462
|
+
}
|
|
463
|
+
const span = spans.get(link);
|
|
464
|
+
if (!span)
|
|
465
|
+
return [];
|
|
466
|
+
const { way, leaves, hub } = span;
|
|
467
|
+
const { start, end, side, into, room, strip } = reach(span, a, b);
|
|
468
|
+
// The lines of one end part on a rail beside the end fewer lines share.
|
|
469
|
+
const step = Math.min((1 + (rails.get(`${strip}:${hub}`) ?? 0)) * TURN_GAP, Math.max(room - TURN_GAP, 0));
|
|
470
|
+
const rail = side + into * step;
|
|
471
|
+
const curve = room < 2 * TURN_GAP ? mapCurve(start, end) : mapRail(start, end, rail, LANE_GAP);
|
|
472
|
+
const near = (box, y) => y > box.y - clear && y < box.y + box.height + clear;
|
|
473
|
+
const crossed = Math.abs(end.x - start.x) < widest + columnGap
|
|
474
|
+
? []
|
|
475
|
+
: others.filter((box) => Array.from({ length: CURVE_STEPS - 1 }, (_, step) => curve.at((step + 1) / CURVE_STEPS)).some((point) => point.x > box.x && point.x < box.x + box.width && near(box, point.y)));
|
|
476
|
+
if (crossed.length === 0)
|
|
477
|
+
return [{ link, from, to, d: curve.d }];
|
|
478
|
+
const [low, high] = [Math.min(start.x, end.x), Math.max(start.x, end.x)];
|
|
479
|
+
/** The lane on one side of what the line crossed, and of whatever stands in that lane's way. */
|
|
480
|
+
const lane = (side) => {
|
|
481
|
+
const around = [...crossed];
|
|
482
|
+
for (;;) {
|
|
483
|
+
const y = side < 0
|
|
484
|
+
? Math.min(...around.map((box) => box.y)) - clear
|
|
485
|
+
: Math.max(...around.map((box) => box.y + box.height)) + clear;
|
|
486
|
+
const more = [...others, ...laid].filter((box) => !around.includes(box) && box.x < high && box.x + box.width > low && near(box, y));
|
|
487
|
+
if (more.length === 0)
|
|
488
|
+
return y;
|
|
489
|
+
around.push(...more);
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
const far = (y) => Math.abs(a.y - y) + Math.abs(b.y - y);
|
|
493
|
+
const shared = `${hub}:${strip}`;
|
|
494
|
+
const pick = () => {
|
|
495
|
+
const [over, under] = [lane(-1), lane(1)];
|
|
496
|
+
const y = over >= 0 && far(over) <= far(under) ? over : under;
|
|
497
|
+
laid.push({
|
|
498
|
+
id: '',
|
|
499
|
+
x: low,
|
|
500
|
+
y: y - LANE_GAP + clear,
|
|
501
|
+
width: high - low,
|
|
502
|
+
height: 2 * (LANE_GAP - clear),
|
|
503
|
+
});
|
|
504
|
+
lanes.set(shared, y);
|
|
505
|
+
return y;
|
|
506
|
+
};
|
|
507
|
+
const y = lanes.get(shared) ?? pick();
|
|
508
|
+
bottom = Math.max(bottom, y);
|
|
509
|
+
// Round a column on rails too: out beside its own end, back in beside the other.
|
|
510
|
+
const out = leaves ? start.x + way * TURN_GAP : rail;
|
|
511
|
+
const back = leaves ? rail : end.x - way * TURN_GAP;
|
|
512
|
+
const mid = { x: (out + back) / 2, y };
|
|
513
|
+
const d = mapRail(start, mid, out, LANE_GAP).d +
|
|
514
|
+
mapRail(mid, end, back, LANE_GAP).d.replace(/^M \S+ \S+/, '');
|
|
515
|
+
return [{ link, from, to, d }];
|
|
516
|
+
});
|
|
517
|
+
return {
|
|
518
|
+
width: Math.max((lefts[Math.max(map.columns.length - 1, 0)] ?? padding) + node.width, right) +
|
|
519
|
+
padding,
|
|
520
|
+
height: Math.max(bottom, padding) + padding,
|
|
521
|
+
nodes,
|
|
522
|
+
headings,
|
|
523
|
+
lines,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A kind's wildcard (`image/*`, …) means every type of that kind, since the kernel rejects
|
|
3
|
+
* unknown types at ingress anyway. A draft stores the canonical list (a wildcard stands alone for
|
|
4
|
+
* its kind); a picker shows the expanded list, so every covered type reads as selected.
|
|
5
|
+
*/
|
|
6
|
+
import { type MediaInputKind } from '@theoremjs/agents/schema';
|
|
7
|
+
export interface AcceptSection {
|
|
8
|
+
kind: MediaInputKind;
|
|
9
|
+
wildcard?: string;
|
|
10
|
+
mimes: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function acceptSections(options: readonly string[]): AcceptSection[];
|
|
13
|
+
/** Each wildcard brings every type it covers. */
|
|
14
|
+
export declare function expandAccept(accept: readonly string[], sections: readonly AcceptSection[]): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Picking a wildcard takes every type of its kind; unpicking it clears the kind; unpicking one
|
|
17
|
+
* type under a wildcard keeps the rest; picking every type of a kind collapses to its wildcard.
|
|
18
|
+
*/
|
|
19
|
+
export declare function nextAccept(previous: readonly string[], selected: readonly string[], sections: readonly AcceptSection[]): string[];
|
package/media-accept.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A kind's wildcard (`image/*`, …) means every type of that kind, since the kernel rejects
|
|
3
|
+
* unknown types at ingress anyway. A draft stores the canonical list (a wildcard stands alone for
|
|
4
|
+
* its kind); a picker shows the expanded list, so every covered type reads as selected.
|
|
5
|
+
*/
|
|
6
|
+
import { MEDIA_INPUT_KINDS } from '@theoremjs/agents/schema';
|
|
7
|
+
export function acceptSections(options) {
|
|
8
|
+
const sections = new Map();
|
|
9
|
+
const section = (kind) => {
|
|
10
|
+
const existing = sections.get(kind);
|
|
11
|
+
if (existing)
|
|
12
|
+
return existing;
|
|
13
|
+
const created = { kind, mimes: [] };
|
|
14
|
+
sections.set(kind, created);
|
|
15
|
+
return created;
|
|
16
|
+
};
|
|
17
|
+
for (const mime of options) {
|
|
18
|
+
const kind = MEDIA_INPUT_KINDS[mime] ?? wildcardKind(mime);
|
|
19
|
+
if (!kind)
|
|
20
|
+
continue;
|
|
21
|
+
if (mime.endsWith('/*'))
|
|
22
|
+
section(kind).wildcard = mime;
|
|
23
|
+
else
|
|
24
|
+
section(kind).mimes.push(mime);
|
|
25
|
+
}
|
|
26
|
+
return [...sections.values()];
|
|
27
|
+
}
|
|
28
|
+
/** Each wildcard brings every type it covers. */
|
|
29
|
+
export function expandAccept(accept, sections) {
|
|
30
|
+
const covered = sections.flatMap(({ wildcard, mimes }) => wildcard && accept.includes(wildcard) ? mimes : []);
|
|
31
|
+
return [...new Set([...accept, ...covered])];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Picking a wildcard takes every type of its kind; unpicking it clears the kind; unpicking one
|
|
35
|
+
* type under a wildcard keeps the rest; picking every type of a kind collapses to its wildcard.
|
|
36
|
+
*/
|
|
37
|
+
export function nextAccept(previous, selected, sections) {
|
|
38
|
+
const next = [];
|
|
39
|
+
for (const { wildcard, mimes } of sections) {
|
|
40
|
+
const picked = mimes.filter((mime) => selected.includes(mime));
|
|
41
|
+
if (!wildcard) {
|
|
42
|
+
next.push(...picked);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const had = previous.includes(wildcard);
|
|
46
|
+
const has = selected.includes(wildcard);
|
|
47
|
+
if (has && !had)
|
|
48
|
+
next.push(wildcard);
|
|
49
|
+
else if (had && !has)
|
|
50
|
+
continue;
|
|
51
|
+
else if (picked.length === mimes.length)
|
|
52
|
+
next.push(wildcard);
|
|
53
|
+
else
|
|
54
|
+
next.push(...picked);
|
|
55
|
+
}
|
|
56
|
+
const known = new Set(sections.flatMap(({ wildcard, mimes }) => (wildcard ? [wildcard, ...mimes] : mimes)));
|
|
57
|
+
return [...next, ...selected.filter((mime) => !known.has(mime))];
|
|
58
|
+
}
|
|
59
|
+
function wildcardKind(mime) {
|
|
60
|
+
if (!mime.endsWith('/*'))
|
|
61
|
+
return undefined;
|
|
62
|
+
const prefix = mime.slice(0, -1);
|
|
63
|
+
const concrete = Object.keys(MEDIA_INPUT_KINDS).find((mime) => mime.startsWith(prefix));
|
|
64
|
+
return concrete ? MEDIA_INPUT_KINDS[concrete] : undefined;
|
|
65
|
+
}
|
package/mod.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export { type StudioAsks, type WriteAsk, writeAsk, writeAskLine } from './asks.ts';
|
|
2
|
+
export { KNOWN_GEMINI_EMBEDDING_MODELS, KNOWN_OPENROUTER_EMBEDDING_MODELS, } from './browser-connection.ts';
|
|
3
|
+
export { type CompiledStudio, compileStudio, credentialHeaderProblem, credentialUrlProblem, type StudioCompileResult, type StudioIssue, type StudioProfileDefinition, type StudioTurnProfileDefinition, } from './compile.ts';
|
|
4
|
+
export { type CompiledWorkspace, compileWorkspace, type WorkspaceCompileResult, workspaceRunAgent, } from './compile-workspace.ts';
|
|
5
|
+
export { DEMO_ALLOWED_HOSTS, DEMO_CONCIERGE_SYSTEM, DEMO_HTTP_SAMPLE_INPUT, demoHttpSampleInput, demoInputsSpec, demoToolSpecs, } from './concierge-demo.ts';
|
|
6
|
+
export { agentToolTarget, COMPACTION_DRAFT_DEFAULTS, createBlankDraft, type DecisionCriterionDraft, type DecisionDraft, type DecisionImageDraft, type DecisionQuestionDraft, type DecisionQuestionType, defaultModelBinding, defaultToolSpec, draftAllows, draftFacets, draftKey, type EffortDraft, EXAMPLE_DECISION_STATE, EXAMPLE_EMBEDDING_QUERY, EXAMPLE_EMBEDDING_TEXT, EXAMPLE_SPAN_DECISION_STATE, exampleDecisionDraft, excludeFacet, type GuardrailsDraft, type IdentityDraft, type ImageDraft, type ImageReferenceDraft, INLINE_LABELS, type InputsDraft, type ItemRuleOnFail, includableFacets, includeFacet, type LabelsDraft, type LiveDraft, type ModelBindingDraft, type ModelsDraft, newCriteria, newDecisionImage, newDecisionQuestion, newModelBinding, newOwnDetector, newPattern, newToolSpec, type ObservabilityDraft, type OutputsDraft, type OwnDetectorDraft, type PatternDraft, type PatternSourceDraft, plantsCanary, removeModelBinding, type SpeechDraft, STUDIO_PROFILE_TYPES, type StudioDraft, type StudioProfileType, type StudioTurnProfileType, setProfileType, type ToolSpecDraft, type ToolsDraft, type TurnBehaviourDraft, takesContinueInstruction, updateModelBinding, } from './draft.ts';
|
|
7
|
+
export { addArchitectExample, createArchitectWorkspace, createConsoleExampleDraft, createDecisionExampleDraft, createExampleDraft, createGeminiEmbeddingExampleDraft, createLiveExampleDraft, createNarratorExampleDraft, createSpanExampleDraft, DECISION_EXAMPLE_AGENT_ID, DECISION_EXAMPLE_STATE, decisionExampleAssets, } from './example.ts';
|
|
8
|
+
export { EXAMPLE_EMBEDDING_FILES } from './example-embedding-files.ts';
|
|
9
|
+
export type { GuardrailProbe, GuardrailProbeAnswer, GuardrailProbeDraft, GuardrailProbeResult, ProbeBoundary, ProbeBoundaryNote, ProbeStatus, } from './guardrail-probe.ts';
|
|
10
|
+
export { PROBE_BOUNDARIES, PROBE_BOUNDARY_NOTES, PROBE_STATUSES, PROBE_TEXT_LIMIT, probeDraft, probeRefusal, runGuardrailProbe, runGuardrailProbes, } from './guardrail-probe.ts';
|
|
11
|
+
export { unheldProblem } from './held-credentials.ts';
|
|
12
|
+
export { type LentBinding, type LentDecisionLimits, type LentHolds, type LentKeys, type LentModel, lentCompression, type ModelBindingViolation, type ModelPicks, type ModelProfileType, type ModelStart, ON_OWN_KEYS, type StudioRunsOn, studioNetworkNote, studioTaintNote, } from './lent-keys.ts';
|
|
13
|
+
export { type DiffLine, lineDiff } from './line-diff.ts';
|
|
14
|
+
export type { StudioLiveDraftMessage } from './live-connection.ts';
|
|
15
|
+
export { studioLiveConnection, studioPageTools } from './live-connection.ts';
|
|
16
|
+
export { type MapGroup, type MapLayout, type MapLine, type MapLink, type MapLinkKind, type MapNode, type MapNodeKind, type MapPlace, type MapRow, type MapSizes, type MapView, mapFamily, mapFound, mapLayout, mapLinkEnds, mapLinkWords, mapNeighbours, mapNoteLines, type WorkspaceMap, workspaceMap, } from './map.ts';
|
|
17
|
+
export { type AcceptSection, acceptSections, expandAccept, nextAccept } from './media-accept.ts';
|
|
18
|
+
export { type NodeOrigins, nodeOrigins, openOutcome, originLabel, originPlace, originShortLabel, originWay, rowOrigin, } from './origins.ts';
|
|
19
|
+
export { firstServed, isGoogleRoute, isOpenRouterRoute, isProviderBuiltinId, modelBindingViolation, STUDIO_TRACE_DESTINATION, type StudioConnectionMode, startingBinding, studioRunsProvider, } from './policy.ts';
|
|
20
|
+
export { PROBE_BATTERY, type ProbeBatteryCase } from './probe-battery.ts';
|
|
21
|
+
export { type ConnectionField, connectionFields, definitionFactory, definitionOf, definitionOfFactory, kernelDefinition, kernelDefinitions, LOCAL_PROVIDER_ID, localProviderAddress, type ModelRoute, modelRoute, modelSlots, onStudioLocal, optionAt, type ProtocolOptionField, type ProviderProblem, protocolOptionFields, providerProblems, registerStudioProvider, STUDIO_PROVIDERS, type StudioProvider, servedProtocols, servesProfileType, takesKey, withOption, } from './providers.ts';
|
|
22
|
+
export { type AgentKeyOf, type ProviderSourceRead, readProviderSource, readStudioSource, type StudioSourceError, type StudioSourceRead, type StudioSourceSpan, } from './read-source.ts';
|
|
23
|
+
export type { AgentToolRegistration, FunctionToolRegistration, HttpToolRegistration, McpToolRegistration, StructuredRegistration, ToolRegistration, } from './registrations.ts';
|
|
24
|
+
export { bindingSlots, defaultEffortRequired, defaultModelRequired, inputLimitsRequired, keySlotUnset, } from './requirements.ts';
|
|
25
|
+
export { clearStudioRunPayload, createStudioRunId, keptStudioRunIds, loadStudioRunPayload, readStudioRunIdFromUrl, STUDIO_RUN_INDEX_KEY, STUDIO_RUN_PAYLOAD_CAP, STUDIO_RUN_PAYLOAD_KEY, STUDIO_RUN_PAYLOAD_KEY_PREFIX, type StudioRunIndex, type StudioRunIndexEntry, type StudioRunPayload, saveStudioRunPayload, studioRunPayloadKey, upsertStudioRunIndex, } from './run-payload.ts';
|
|
26
|
+
export type { StudioDependency } from './runtime-scope.ts';
|
|
27
|
+
export { sectionNote } from './section-notes.ts';
|
|
28
|
+
export { type Ask, type AskPlace, askParts, reachesOthers, type SharedCarry, type SharedReach, type SharedSites, type SharedSnapshot, sharedAsk, sharedSnapshot, shortPlace, type ToolReach, type ToolSnapshot, toolReach, toolSnapshot, withSharedCarry, withToolCarry, } from './shared-carry.ts';
|
|
29
|
+
export { type SharedEntry, sharedAt, sharedEntries, sharedNodeId, sharedOpens, } from './shared-settings.ts';
|
|
30
|
+
export { agentModulePath, importSpecifier, type ProjectCode, providerSource, type SourceFile, studioSource, workspaceSource, } from './source.ts';
|
|
31
|
+
export { sampleToolInput, stubOutputFromSchema } from './stub.ts';
|
|
32
|
+
export { DEFAULT_TOOL_INPUT_SCHEMA, DEFAULT_TOOL_OUTPUT_SCHEMA, parseJsonSchema, sampleFromJsonSchema, zodFromJsonSchema, } from './tool-schema.ts';
|
|
33
|
+
export { registerStudioTools, type StudioToolHandler, type StudioToolHandlers } from './tools.ts';
|
|
34
|
+
export { createStudioTraceRouter, STUDIO_RUN_METADATA_KEY, type StudioTraceLine, type StudioTraceRoute, type StudioTraceRouter, } from './traces.ts';
|
|
35
|
+
export type { StudioSteerLine, StudioTransportOptions } from './transport.ts';
|
|
36
|
+
export { clearStaleStudioRuns, createStudioDecisionTransport, createStudioEmbeddingTransport, createStudioHostTransport, createStudioTransport, studioInterface, studioRunDefines, } from './transport.ts';
|
|
37
|
+
export { modelBindingNodeId, providerIdOf, providerNodeId, type StudioNodeRef, type StudioTreeNode, studioNodeRef, studioTree, toolSpecKeyOf, toolSpecNodeId, } from './tree.ts';
|
|
38
|
+
export type { StudioInputsSpec, StudioToolSeed, StudioToolSpecSeed } from './types.ts';
|
|
39
|
+
export { type AgentDraft, type AgentToolsDraft, addAgent, addProvider, agentDraft, agentNodeId, atStart, createBlankWorkspace, duplicateAgent, editedSince, type FileConflict, type FilesMerge, type FileUpdate, filesPrint, libraryDraft, mergedWithFiles, modelSharers, newProvider, providersAtStart, providerUse, rebased, removeAgent, removeLibraryTool, removeProvider, renameProvider, reopened, resetAgent, resetAll, resetLibraryTool, resetProvider, type SettingPath, STUDIO_WORKSPACE_VERSION, type StudioWorkspace, scopedNodeId, setToolAllowed, startedHere, type WorkspaceNodeRef, type WorkspaceStarts, type WorkspaceTree, withAgentDraft, withFilesChosen, withLibraryDraft, withProvider, workspaceFromDraft, workspaceNodeRef, workspaceTree, } from './workspace.ts';
|